中文分词原理与实现
存在意义
中文文本不存在边界,所以中文分词是专业处理中文信息的搜索引擎需首先面对的问题
1 Lucene中文切分
StandardTokenizer单子分词
CJKTokenizer二元覆盖
CnTokenizer
单子切分问题问题 搜索’上海’ 结果可能‘海上’
二元覆盖可以解决‘上海‘和’海上‘混淆问题 适合小规模搜索网站
中文分词适用于大规模的搜索引擎
1.1 Lucene切分原理
TokenStream类用来进行基本的分词工作,Analyzer类是TokenStream的外围包装类
OffsetAttribute属性保存了词的位置信息;TypeAttribute属性保存了词的类型信息
lucene分词流程
不同字段使用列可以用不同用途的分词器
PerFieldAnalyzerWraper aWrapper = new PerFieldAnalyzerWraper(new CnAnalyzer);
aWraper.addAnalyzer(“address”,newCnAnalyzer());
aWraper.addAnalyzer(“companyName”,newCompanyAnalyzer());1.2 自定义分词器
2 查找词典算法
术语trie取自retrieval,也被称为数字树、字典树或前缀树,是一种有序树数据结构,哈希树的变种。
2.1 标准Trie树
2.2 三叉tire树
三叉搜索树(Ternary Serarch Trie)中,每个节点包括一个字符。
三叉搜索树只有三个指针:一个指向左边的树;一个指向右边的树;还有一个向下,指向单词的下一个数据单元。
三叉搜索树上二叉搜索树和数字搜索树的混合体。
它有和数字搜索树差不多的速度但是和二叉搜索树一样只需要相当较少的空间
数字搜索树:缺点占空间,优点搜索速度快
二叉搜索树:缺点搜索速度慢,优点省空间
三叉搜索树:优点搜速度快,省空间3 中文分词原理
中文分词就是对中文断句,消除部分歧义。
中文分词子任务:
分词:
词性标志:(POS)名词或者动词等
语义标注:把每个词标准上语义编
词库常见来源:语料库或词典
中文分词的两类方法:
机械匹配的方法:例正向最大长度匹配和逆向最大长度匹配
统计的方法:例概率语义模型分词方法和最大熵的分词方法
(应为汉语的主干成分后置,所以逆向最大长度切分的精度稍高 例:正向最大长度切分‘有意/见/分歧‘ 逆向最大长度切分’有/意见/分歧‘)
机械匹配方法实现: http://blog.****.net/worldwindjp/article/details/18085725
8 新词发现
词典中没有,但结合紧密的字或词有可能组成一个新词。
可以用信息熵来度量两个词的结合紧密程度。信息熵的一般公式:
9 未登录词识别
在分词时即时发现词表中没有的词叫未登录词
常见的未登录词包括人名,地名,机构名
对未登录人名识别有效信息说明:
1未登录词所在上下文.例如:”..教授”这里教授是人名的上下文
2未登录词本身的概率. 例:”刘备”作为人名出现的次数除以人名出现的总次数
可以通过规则匹配来识别未登录词
可以用二元模型或三元模型来整合未登录词本身的概率 和 未登录词所在的上下文这两种信息
扩展标签
自然语言处理,中文信息处理 lucene solr es 基于lucene接口的java版中文分词器
资料来源:<<解码搜索引擎>