BosonNLP分词技术解密

在九月初BosonNLP全面开放了分词和词性标注引擎之后,不少尤为是从事数据处理和天然语言研究的朋友在试用后很好奇,玻森如何可以作到目前的高准确率?但愿这篇文章可以帮助你们理解玻森分词背后的实现原理。 算法

众所周知,中文并不像英文那样词与词之间用空格隔开,所以,在通常状况下,中文分词与词性标注每每是中文天然语言处理的第一步。一个好的分词系统是有效进行中文相关数据分析和产品开发的重要保证。npm

玻森采用的结构化预测模型是传统线性条件随机场(Linear-chain CRF)的一个变种。在过去及几年的分词研究中,虽然以字符为单位进行编码,从而预测分词与词性标注的文献占到了主流。这类模型虽然实现较容易,但比较难捕捉到高阶预测变量之间的关系。好比传统进行词性标注问题上使用Tri-gram特征可以获得较高准确率的结果,但一阶甚至高阶的字符CRF都难以创建这样的关联。因此玻森在字符编码之外加入了词语的信息使这种高阶做用一样能被捕捉数组

分词与词性标注中,新词识别组合切分歧义是两个核心挑战。玻森在这方面作了很多的优化,包括对特殊字符的处理,对比较有规律的构词方式的特征捕捉等。例如,近些年比较流行采用半监督的方式,经过使用在大规模无标注数据上的统计数据来改善有监督学习中的标注结果,也在咱们的分词实现上有所应用。好比经过使用accressory variety做为特征,可以比较有效发现不一样领域的新词,提高泛化能力。微信

咱们都知道上下文信息是解决组合切分歧义的重要手段。而做为一个面向实际商用环境的算法,除了在准确率上的要求以外,还须要注意模型算法的时间复杂度须要足够高效。例如,相比于普通的Linear-chain CRF,Skip-chain CRF由于加入了更多的上下文信息,可以在准确率上达到更好的效果,但由于其它在训练和解码过程,不管是精确算法仍是近似算法,都难以达到咱们对速度的要求,因此并无在咱们最终实现中采用。一个比较有趣的分词改进是咱们捕捉了中文中常见的固定搭配词对信息。譬如,如 “得出某个结论”、 “回答某个提问”等。若是前面出现 “得出” ,后面出现 “结论” ,那么“得出”和“结论”做为一个词语出现的可能性就会很大,与这种相冲突的分词方案的可能性就会很小。这类固定搭配也能够被建模,用于解决部分分词错误的问题。学习

怎样肯定两个词是不是固定的搭配呢?咱们经过计算两个词间的归一化逐点互信息(NPMI)来肯定两个词的搭配关系。逐点互信息(PMI),常常用在天然语言处理中,用于衡量两个事件的紧密程度。归一化逐点互信息(NPMI)是逐点互信息的归一化形式,将逐点互信息的值归一化到-1到1之间。若是两个词在必定距离范围内共同出现,则认为这两个词共现。筛选出NPMI高的两个词做为固定搭配,而后将这组固定搭配做为一个组合特征添加到分词程序中。如“回答”和“问题”是一组固定的搭配,若是在标注“回答”的时候,就会找后面一段距离范围内是否有“问题”,若是存在那么该特征被激活。优化

图片描述
归一化逐点互信息(npmi)的计算公式编码

图片描述
逐点互信息(pmi)的计算公式spa

能够看出,若是咱们提取固定搭配不限制距离,会使后面偶然出现某个词的几率增大,下降该统计的稳定性。在具体实现中,咱们限定了成为固定搭配的词对在原文中的距离必须小于一个常数。具体来看,能够采用倒排索引,经过词找到其所在的位置,进而判断其位置是否在可接受的区间。这个简单的实现有个比较大的问题,即在特定构造的文本中,判断两个词是否为固定搭配有可能须要遍历位置数组,每次查询就有O(n)的时间复杂度了,而且可使用二分查找进一步下降复杂度为O(logn)。索引

其实这个词对检索问题有一个更高效的算法实现。咱们采用滑动窗口的方法进行统计:在枚举词的同时维护一张词表,保存在当前位置先后一段距离中出现的可能成词的字符序列;当枚举词的位置向后移动时,窗口也随之移动。这样在遍历到 “回答” 的时候,就能够经过查表肯定后面是否有 “问题” 了,一样在遇到后面的 “问题” 也能够经过查表肯定前面是否有 “回答”。当枚举下一个词的时候,词表也相应地进行调整。采用哈希表的方式查询词表,这样计算一个固定搭配型时间复杂度就能够是O(1)了。
图片描述
经过引入上述的上下文的信息,分词与词性标注的准确率有近1%的提高,而对算法的时间复杂度没有改变。咱们也在不断迭代升级以保证引擎可以愈来愈准确,改善其通用性和易用性。从此咱们也会在BosonNLP微信帐户更多享咱们在天然语言处理方面的经验,欢迎关注!事件