-
Notifications
You must be signed in to change notification settings - Fork 703
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: 英文词汇自动大写转换 #305
feat: 英文词汇自动大写转换 #305
Conversation
我们可不可以弄一个简单暴力的规则:
这份规则对应的代码:(参考 #302 的简单修改) local function autocap_filter(input, env)
local code = env.engine.context.input -- 输入码
for cand in input:iter() do
local text = cand.text -- 候选词
-- 输入码前 2~n 位大写,候选词转换为全大写
if code:find("^%u%u+.*") then
text = text:upper()
yield(Candidate(cand.type, 0, #code, text, cand.comment))
-- 输入码首位大写,候选词转换为首位大写
elseif code:find("^%u.*") then
text = text:sub(1, 1):upper() .. text:sub(2)
yield(Candidate(cand.type, 0, #code, text, cand.comment))
-- 输入码全小写,原样输出
else
yield(cand)
end
end
end
return autocap_filter |
简单是简单,但似乎过于暴力了,还是在要在脚本判断不少其他情况:
|
一个潜在的性能问题:在 melt eng 定义的派生算法有些繁杂。在词库大的时候,部署时间非常长,生成 build 文件非常大。 我用了一个去重的 5mb 较全的英文词库,派生前 10 个大写,生成文件达到 80 mb,比几万个词的中文词库 bin 还要大。 我还是觉得输入全大写 -> 候选全大写,输入首字母大写 -> 候选首字母大写这样的逻辑通顺一点,还可以不修改派生算法,只要将 codeAllUCase 的判断改下就行: -- ...
elseif code == code:upper() then
codeAllUCase = true
--...
elseif codeAllUCase then
text = text:upper()
yield(Candidate(cand.type, 0, codeLen, text, cand.comment))
-- 输入码首位大写,候选词转换为首位大写
elseif codeUCase then
text = text:sub(1, 1):upper() .. text:sub(2)
yield(Candidate(cand.type, 0, codeLen, text, cand.comment))
else
yield(cand) |
还有一个问题。因为 candidate 构造候选词不写入用户词典,所以选择大写词不能动态调整词频。 简单研究了下要写入用户词典要用 Phrase,这样下来脚本就很繁琐了。 |
目前英文词库很小,超大词库可以再只派生前俩大写或 lua 改成纯大写。 |
示例: 输入小写,得到词库中的原样:latex → LaTeX 输入首字母大写,得到首字母大写:Hello → Hello 输入前2~n个字母大写,得到全大写:HEllo → HELLO 同上,输入全大写,得到全大写:HELLO → HELLO
示例: 输入小写,得到词库中的原样:latex → LaTeX 输入首字母大写,得到首字母大写:Hello → Hello 输入前2~n个字母大写,得到全大写:HEllo → HELLO 同上,输入全大写,得到全大写:HELLO → HELLO
利用候选词长度构造匹配规则,适配以所有大写英文开头的单词(解决 #303 所示代码潜在问题)。同时让代码整洁一点。
功能
单字符, 输入码小写,词组,大写词,非纯英文词 -> 候选项保持原样
SQL Server,APIs,VMware ==
输入码大写 + 小写 -> 候选项首字母大写
Ha -> Have, HAv -> Have
输入码全词大写 -> 候选项全词大写
HA -> HAVE, HAV -> HAVE
对于多大写字母开头的词,需要将它第一个小写字母大写
IMD -> IMDb, IMDB -> IMDB
问题:
暂时不能解决词汇中缩写形式的大写词汇,即在如下词库中:
本功能会导致 IG -> INSTAGRAM,INS -> INSTAGRAM