首先是词库
词库包含有以下种,其功能对应分别为:
snotforeign 消除部分组合歧异例如:博客中搜索(中搜)
numbers_u8 分词处理,分简体和繁体,中英文数字例如:二零零六
foreign_u8 外来词处理
surname_u8 人名区分
bothlexu8 分词词库主体
内存中的词库组织形式为:
词条(keyword) 类别(type)
其中,词条就是bothlexu8 文件中的一行或其子串,类别有两种,一种是原始词(bothlexu8 文件中的一行),一种是原始词截取的子串(用于最大切分)
然后是分词算法,描述如下:
从待切分字串str中取出一个字符(currentchar),把这个字符加到匹配字符串(currentword)中去,到词典中去匹配(同时匹配currentword+next currentchar),如果匹配成功,则取出匹配的字符串,得到该串的类型,如果是1(原始词),则匹配成功,在取下一个字符的时候将该词加入Token;如果匹配类别是2(原始词子串),
示有可能不是最大匹配,则继续取字符进行下一次匹配,如果匹配不成功表示当前字符已是最大匹配,加入Token;如果匹配成功则继续取字匹配。如果当前字符是与前一字符不同类别(中英文、数字、字符等),则当前currentword加入Token,去掉标点符号等字符。
加入Token 同时记录词的位置信息(包含标点符号等字符),当前词库取词只取4个字符或者以下的词条,如有需要可以将该值加到8个或以上,对性能有些影响,不适合太大。另外,平移窗口大小是1个字符,也可以扩展到2个字符或者3个字符甚至更大,但是,增大平移窗口需要有对窗口的处理,也比较麻烦。
这个算法的处理效率为2万字/秒,不过是单线程的,要是能够到多线程,速度估计可以在提高N倍,如果可以达到20W字/秒,就比较有用了。
另外分词准确程度取决词库,没有完善的知识库,这是一个缺陷,组合歧异识别在这里面只是一个可有可无的小功能,以后的工作就是不断的完善知识库,增加歧异消除和新词识别(名字,如人名、地名、机构名等)功能