清华大学的thulac中分分词词法包,包含有中文分词和词性标注,从测试精度和速度看,效果还不错,github上有提供c++和python代码,c++代码包含有训练和测试代码,python代码只有测试代码,速度也较慢,github地址为:https://github.com/thunlp/THULAC。
根据github上提出的参考文献,完全无法看懂代码和文章有什么关系,代码也比较难以理解,因此在记录一下自己对于代码分词原理的理解,希望对于后续研究的人有些帮助。
认真的研究了一下c++代码,发现thulac代码与基于压缩感知机原理的中文分词类似,同样采用来7个特征,首先对于输入文本,生成所有字的特征,同时初始化一个dat数组,一个特征权重数组fl_weights,fl_weights大小语总的特征数目相等,即每个特征对于于fl_weights的一个权重值,dat为特征在fl_weights中对于的权重的索引,即我们要查找某个特征feature在fl_weights对于的权重,首先需要查找dat中feature对于的索引index,得到index后我们便可以得到feature对于的权重为fl_weights[index]。那么dat是怎么索引的呢,如果总的features个数为N,那么dat的大小也要为N,当通常随着训练数据的增大,生成的特征数目也会很大,这dat就需要花费很大的内存,那么thulac中是怎么做的呢?
首先说一下压缩感知机算法中特征的生成,对于输入句子s中的每个字wi,会根据其前后2个字生成7个特征,这7个特征分别为wi-2wi-1,wi-1,wi-1wi,wi,wiwi+1,wi+1,wi+1wi+2。Thulac中在这7个特征后面添加了一个separator=’ ’即空格;对于分词,我们需要预测每个字属于B