-
Notifications
You must be signed in to change notification settings - Fork 563
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
dict加入一个词条,就会使其它词条无法显示 #72
Comments
从各种现象来看,rime应该是有这样一个内部逻辑:_如果可以检索到全拼词条,就忽略简拼。_ 按照拼音的编码方式给「K歌」编码,应该是:
正常情况下由这个词组拼音反推,理应有个单字「K」的全拼是 这应该是一个意外事件,也许可以定义为bug,但可以通过技巧规避。 抛开这个问题,再来审视一下这无意中发现的「rime的内部逻辑」。 在词典中加入这个词条
那么,rime会不会把简拼为cd的词条隐去? 原以为简拼的优先级比较低,仅仅是排位比较靠后,没想到的是简拼与全拼相遇时,简拼完全不显示,即使词库中有这个词,即使全拼的词很少乃至为零,rime宁可生造一个符合全拼规范的坏词,也不让正确的简拼有丝毫出场的机会。 由于拼音编码比较规范,这种矛盾并不容易出现。像上面这样由中英混合词条所带来的问题也可以通过技巧规避。但是在各种复杂的方言方案中,就很难避免了。 想起去年贴吧里就有一个类似问题:rime能否优先显示词库中已有的词
后来在那个中古拼音方案中,首字母简拼的拼写运算改用模糊替代了缩略。改过之后,不知道这还算不算简拼?由于简拼与全拼优先级变成一样,由于词频的作用,全拼词条有可能会被简拼挤到后面去。这样对整句输入的效果必然会有影响。现在有点怀疑,这是不是好办法? 所以,现在新的问题是rime的内部逻辑合理吗?rime的简拼能不能做得更好点? |
這是由配置(輸入方案)指定的行爲。 實現音節首字母簡拼的配置爲 乍一看,既然簡拼也是編碼中的一種,他用來擴大索引的範圍,新增的英文詞也只不過添加了一種新的編碼,用於索引這個新加入的英文詞,那麼增加新詞應該只增加新結果對嘛。可是簡拼不能簡單地與全拼等同,視爲問題的一個解;他其實只是「可能存在」的一個解。 簡拼之所以好用,是因爲大多數簡拼並不存在於拼音的音節表中,他是利用了閒置的編碼來縮短輸入。 一、輸入 二、若輸入爲 三、輸入爲 四、輸入爲 綜合以上數例,得出與本題相關的一條規則。 再來代入原題: 「K歌」註音爲 輸入 「CD」註音爲 對於一部機器,相同的輸入應當產生相同的輸出。如今看來原先的設定都有其道理——本方案之所以如此設定,(僅)是爲保證出廠產品按照設計工作。那只能說,後來出問題的部分不該代入原先設定的規則。 對於一部機器,不同的輸入產生不同的輸出是很常見的。所以修改方案和詞典後,得到與修改前不同的結果,不應感到過分意外。 論「內部邏輯」。專門的「漢語拼音」輸入法才把規則做成內部邏輯,因爲已知只須支持一種「漢語拼音」。而 Rime 是數據驅動的,輸入法的行爲大多取決於輸入方案和詞典。 如果把拼音輸入法僅僅看作純粹的字符串匹配,當然也能寫出「詞庫中已有的詞永遠優先」的輸入方案。 回到原題。 包含英文字母的中文詞,這個輸入需求與「中文夾雜英文單詞」不盡相同。 試舉一例說明。
這裏 如此,輸入 |
是有這些問題。
這就引出下一個問題:如何支持在輸入方案裏配置算法裏用到的的規則和常數。現在已經出現了一些輸入方案必須通過定製參數保證輸入效果。看來這個是有必要做的。不過大多數方案應該不會定製這些參數,默認還是用保守的策略。
|
之前说过,为了兼顾效率,造句时并未用上所有的候选词。候选词列表会保证完整性,即与输入匹配的词一定会检索出来并在列出。但不能用所有候选词一一尝试组句。而是取一定量高频词来尝试。问题就在这里。固态词典里词条的词频是预知的,可以在部署时按词频排序,这样就可以快速取到每个拼音下面最高频的词条。而用户词典内容是不断更新的,内部结构也不一样,要找到最高频的若干词条,需要按照编码顺序扫描大量数据,并做词频比较。(此处应该可以优化,但要做到各种输入方案通用,难度又加大了)如果输入单字母简拼,匹配的词条可能达到词典中词条总数的1/26。事实上肯定没有这样做,而是用了贪心算法取得部分高频词。很显然,编码越是精确,对应的词条数越少,被选中的词在所有匹配项中的占比越高。在没有专门为简拼建立索引的情况下,没有任何算法能在有限时间内保证得到最优结果。简拼没有全拼准确,简拼越长越不准,这是有理论根据的。 |
可以理解了,谢谢您耐心的回复! |
刚刚才突然意识到,我们对简拼有这么大的分歧的原因是什么。这应该是个误会,我还是再说清楚一点吧 但是 然后,我们有时候会在这些打过的简拼长词的基础上加一两个高频的字或短词,组成一个新的长词。于是,下次就可以用简拼打刚才造的长词。这就是我说的渐进造词。 我们不知道背后的算法有多复杂,但rime对这种打法,每次都猜得很准。因为词库中本来就有一些长词。我们以为这些词是我们造的。而这些长词在组句时,总能顺利地作为首选。 于是,错觉就产生了。既然这种打法很管用,那就继续用下去了。所以,在长时间使用rime之后,我们会被本能地调教出这种造词习惯。这是我们被动找到的最高效地使用简拼的技巧,这也是对输入法的适应。很多人会下意识地这么打。 但时间长了,问题也来了。 在这样的输入习惯引导下,用户词库中的词会越来越长,也会混入很多自造的长词。谁也不会想到长度超过4或5字的长词会被特殊对待。同样的打法,之前猜得很准,现在偶尔会失灵了了,他们只会觉得输入法越来越难用了。 而我前面对rime规则的疑惑,有一部分就来自这种简拼长短词组句的混乱。 但现在知道了,我所谓的对输入法的理解,是长时间接触rime之后,无形中被rime教会的。 而我之前也想得很简单,但凡用户打一长串简拼来组句的,肯定是基于这种输入习惯的。那输入法就不要想太多,直接从用户词典中取出最长的那个适配词,再加上前后的高频短词,这样组句就很快了。 说到底还是我没表达清楚。请见谅! |
其實沒有什麼「區別對待」。就好像某重點大學在本省只錄取十名考生,排名第十一的考生落選,考試制度並沒有對他區別對待,可他榜上無名,只得回家復讀一年。 長詞+後綴短語這個思路能解決不少案例,但也可能造成新的錯誤:長詞也可以加前綴短語呀,也可以用在中間呀。我不想靠添加「內部邏輯」來解決,還是把問題交給統計學吧。請參考: 長詞進用戶詞庫這個做法,我本來不太喜歡,但目前也沒有什麼好辦法準確識別詞的邊界,只好把一長串字當一個詞記下。要根治這個問題,得做一番大改動。 造句只檢索用戶詞典,現實中不可行。如果這個輸入法真的已經用了一輩子,倒是可以這樣做。不然已記入用戶詞典的內容隨機性很大,以有限的詞彙可能根本造不出完整的句子,或只能勉強拼湊出一些無意義的文字。 |
用的是最新brise中的朙月拼音。正常输入时是这样:
若在词典中加入一个中英混合的词条,比如
K歌
:仅改动这一处,重新部署后,输入
kge
,原先可以正常显示的词条都不见了,只能显示「K歌」一词:更严重的是,单独输入
k
时显示的是空码,k的简拼都没了:以k开头的词条必须输入全拼才能显示:
词典中只要混入了这样的有单个声母做编码的词条,就都会这样
暂时的解法:
kge
代替k ge
缺点是中英混合词条无法用简拼
kg
来打xform/^([b-df-np-z])$/$1_/
处理,再取首码简拼。(贴吧@imy0823的做法)请问:以上rime「单独输入
k
,就只返回空码」的现象是不是bug?The text was updated successfully, but these errors were encountered: