这个输入法是这样的,统计1-16个字的词语词频,套用小狼毫输入法的的引擎,输入法层面基本上没有算法上的改进。
我的思路是企图使用暴力空间穷举的方法选出高频词语
以搜狗输入法为代表采取的方法是马尔可夫链模型
输入一段拼音后,前两个字的组合决定者第三个字的组合。
如果这段拼音有八九个字十几个字,再用动态规划,获取所有可能路径中的最优值
在选取策略中涉及到一个三元组
曾经,搜狗输入法为了百度输入法是否窃取搜狗的三元组打官司。还要查看百度输入法的源代码。
可能呢,百度确实借鉴了,只不过换成词组的方式储存。这个官司搜狗输了。
抄一抄,改一改,这个不叫抄袭,叫借鉴。
以百度工程师的实力,逆向获得搜狗输入法底层原始数据,分分钟钟的事。我也见识过百度这样的人才。要不是更快更好的刷个kpi,人家懒得逆向搜狗输入法的底层数据呢。
这么好的马尔可夫链,三元组,鸿雁输入法目前没有采用。我这边采取的是最粗暴简单的方法。
350GB的语料获得的机械分词有5.14亿多个,按照目前我电脑32GB内存,最多只能给2000多万词语生成词库索引,还有差不多4.94亿个词组是没有收录的。当然这里面的废词占绝大部分。
最近,我在砸锅卖铁解决这个问题。写了一个利用信息论原理分词的工具。
本来用golang实现的,单线程处理1GB语料需要2小时,算下来350GB语料要29天才能分析完成。
上阿里云大概要2000多块,
到网吧包下几十台电脑,需要4000多块。
本来还想求助freemdict的网友给我众筹,分布式运算,我出电费。
后来,作罢。还是我的老爷机慢慢跑吧。
接下来,尝试使用c++优化,一切数据全部放在内存里操作,优化编译,使用最强最快的代码库,单线程处理1GB语料需要25-40分钟,还可以2-3个线程并发,整体速度提高了7倍。
如果把分词成果放入输入法,应该可以提高分词准确率
你提到的ya候选词语
目前单字分词结果
按照字频统计排序
亚 | 13793256 |
---|---|
压 | 8395987 |
呀 | 5624108 |
雅 | 5332774 |
牙 | 5021954 |
按照分词打分排序
亚 | 42.18128983 |
---|---|
牙 | 36.99215016 |
压 | 36.70474922 |
雅 | 35.57282914 |
呀 | 26.57306436 |
所以亚 压 排在前面是严格按照字频统计结果的
这个时候,自动分词还是分辨不出单字的词语,只能人工干预了,利用已有的高质量预先的人工分词数据,强行把这些词提到前面应该就可以了。