在Anki软件中,使用的极品GRE卡牌组中的单词解释不知道怎么回事,单词经常被莫名其妙的断开。
比如limp and flabby
被写成了li mp and flabb y
,读起来很不爽。于是想通过程序自动纠正这种错误。
方案1
一开始想到了一个很naive的方法:首先建立一个词典,然后每次读入一个词(空格分开)判断一下该词是否存在于词典中,如果不存在,判断该词与下一个词的组合是否在词典中,如果在,就把这两个词组合在一起并保存。
比如flabb
不存在于词典,而flabby
存在于词典,这样就能把这个错误纠正。
但是也有很多情况,即使一个单词被错误的分成了两个部分,但这两个部分依然是正确的单词。比如li
和mp
都存在于词典中,这样的方法就不能纠正这样的错误。
这是因为这个方案实在是too naive了,完全没有利用到上下文的关系。
方案2
使用google的API,google会提供搜索建议,比如搜索li mp and flabb y
,google会返回提示你是否要查询的是limp and flabby
。
google搜索虽然功能很强大,但是由于众所周知的原因,最后没有采用。
方案3
参考了数学之美
和Beautiful Data
中的分词方法,实际上就是比较$P(a_1,a_2,…,a_n)$与$P(b_1,b_2,…,b_n)$,其中$a_i,b_i$为两种分词方法第$i$个单词。
使用2阶模型,即马尔科夫模型,$P(x_1,x_2,…x_i)=P(x_1|x_2)P(x_2|x_3)…P(x_{n-1}|x_n)$。使用了Beautiful Data
提供的统计数据。每次尝试合并句子中的一个空格,并选出概率较大的句子作为结果。注意原始分词方案增加了权重,这是因为原始分词方案大概率是正确的,因此给它加上一个权重。最后的正确率虽然达不到100%,但还是比较令人满意了。
完整代码如下,