-
Notifications
You must be signed in to change notification settings - Fork 12
为什么要关闭调频以及与之关联的措施有哪些
调频会导致词序改变,从而导致组词出现异常
举例:
单字词频排序: 按 暗 安
词组中: 合同、 页面
此时如果不调频我就永远可以打出来:“按合同”、“按页面”
如果调频,假设我输入了一次:暗,此时再去输入就变成了:暗合同 暗页面,这显然不是你想要的;
有的人说了我把这些组合放进词库里不就解决了?
这话没错,那么你的词库得多大?能不能穷尽?
同时扰乱整句输入的体验,调频久了如果没有模型加持将是一团乱麻。
由上面引出的这个问题词库放什么样子的词汇才是恰当的?要解决这个问题应该先解决词频的排序问题,这是一个非常大的命题
还用这三个字举例:“按 暗 安” 从出现次数来看“安”字的更多,那么我们是不是要把“安”放在前面?
这是极大的错误,现在应该统计单字在词库中的性质。我们知道单字的输入应当以单独出现的可能性为基准统计,分为“头”“尾”“中间结构”,应当认为放大这些字的词频。以两字的组合为基础进语料分词统计,会发现安字虽多但都是以词汇的形式出现的,我们很少去单独输入,如果以三个字的词组进语料会发现安字打头的很少,因此安字无论如何都不应该放在第一位。此时我们回想一下an这个音下面的句中结构发现
按 xxx 俺 xxx
这两个字在句中打头,所以把它两排序在前面是毋庸置疑的,谁排第一,去统计三个字分词中,谁出现在的概率最高,这个例子按应当排序在前面
此时大量的 按合同 按要求 按需求 按种类等等的词汇就可以与二字词汇的最高频进行组合,换句话说词库中就没必要整理这些词组了,尽管他们看起来让你感到那么熟悉
因此词库中应该存放非高频词组的组合,高频首选由他们自由组合起来,这会大大的节省空间,提升效率 当初我各处收集的词库有300万行,但在最终完善的算法后我删除了120万行,其中大量占用空间的是高频二字词汇组成的四个字的组合:人工 服务,学习 进步,简直是不胜枚举加声调后的词库大小能干掉一大半20多兆。
如果你开启了调频,势必要一个300万精品词库才能把这日常一一列举,很显然如果不调频储存60%,那么调频储存的就是100%,我这里讲的也仅仅是2-4个字长度的穷举
上面的词库靠人统计是很难的,通过大量多方面的语料进行智能化分词发现新的组合,最后依靠ngram工具计算概率,最后形成的100M可容纳1000万行的数据库它实际上就是对词库的一种补充,在命中时将强制替换错误的组合,还是刚刚的例子如果你打出来的是“暗合同”,如果模型中包含 按合同且最高频就会帮你纠正为“按合同”,因此模型就是词库的补充,模型记录的是句子的连续性
这正是万象词库要长期做的事情
1、修正和正确合理的调整1和2字词汇的顺序
2、对于三个字词汇尽可能的穷举高频组合,为了平衡不用模型时候的体验,三个字的结构词是应收尽收
3、算法删除所有由2+2高频词组成的四个字的词汇,对重要的低频之间组成的词汇评估后加入词库
4、模型重点维护三个字到四个字之间的顺滑特性词 我这里有个例子
一个有
一个没有
一个又一个
一个有一个没有
按照字数层层递进
顺滑的组合是没有穷尽的,最终解可能还是更好的本地语言模型,而不是简单的命中逻辑替换逻辑
5、通过配置方案主要场景不调频,万象内置了ac造词功能,他是在有需要的时候引导写入用户词库,模型会干预第一候选,双翻译器会在第二候选展示词库不带模型的组合结果,如果此时你上屏了次选他也将被记录下来,实现了按需造词,私有词汇这样处理。
如果是公共词汇缺失你还可以提issue我会加入词库 整个词汇量加上模型应该说各种场景基本可以应对,如果有不刁钻的句子或者词组打不出来发出来我们一起想办法处理