Solr55搜索引擎之分词原理说明.docx
《Solr55搜索引擎之分词原理说明.docx》由会员分享,可在线阅读,更多相关《Solr55搜索引擎之分词原理说明.docx(12页珍藏版)》请在冰豆网上搜索。
Solr55搜索引擎之分词原理说明
Solr5.5搜索引擎之分词原理说明
1.中文分词
1.1概念
众所周知,英文是以词为单位的,词和词之间是靠空格隔开,而中文时以字为单位,句子中所有的字连起来才能描述一个意思。
例如,英文句子Iamastudent,用中文则为:
“我是一个学生”。
计算机可以很简单通过空格知道student是一个单词,但是不能很容易明白“学”,“生”两个字合起来才表示一个词。
把中文的汉字序列切分成有意义的词,就是中文分词,有些人也称为切词。
“我是一个学生”的分词结果是:
“我是一个学生”。
摘自http:
//www.williamlong.info/archives/333.html
1.2应用
目前在自然语言处理技术中,中文处理技术比西文处理技术要落后很大一段距离,很多西文的处理方法对中文不能直接采用,就是因为中文必须有分词这道工序。
中文分词是其他中文信息处理的基础,搜索引擎只是中文分词的一个应用。
其他的比如机器翻译(MT)、语音合成、自动分类、自动摘要、自动校对等等,都需要用到分词。
因为中文需要分词,可能会影响一些研究,但同时也为一些企业带来机会,因为国外的计算机处理技术要想进入中国市场,首先也要解决中文分词问题。
分词准确性对搜索引擎来说十分重要,但如果分词速度太慢,即使准确性再高,对于搜索引擎来说也是不可用的,因为搜索引擎需要处理数以亿计的网页,如果分词耗用的时间过长,会严重影响搜索引擎内容更新的速度。
因此对于搜索引擎来说,分词的准确性和速度,二者都需要达到很高的要求。
2.搜索引擎和中文分词
2.1搜索引擎的工作原理
摘自:
搜索引擎为什么能快速检索到自己查询的关键字呢?
实际上得益于它的数据存储机制“倒排索引”,这里用一个例子来大体说明什么是倒排索引。
假设我有10篇文章,它们可能论述了相同或不同的主题。
如果我想看看哪篇文章中含有“中文分词”这个词语,我可以循环遍历每篇文章,看看他的内容中有没有含有“中文分词”这个词语,然后把含有目标词语的文章返回。
很显然,我需要打开10篇文章,并且从头到尾的遍历每篇文章,看能否匹配到“中文分词”,这样的效率是很低的,对于毫秒级的搜索引擎来说是绝对不能接受的。
所以我给每篇文章做个“目录”,事先找到含有“中文分词”的文章,假设文章1,3,5,7含有这个词语,文章2,4,6,7含有“搜索引擎”,我建立一个对应关系表:
词语
文章编号
“中文分词”
1,3,5,7
“搜索引擎”
2,4,6,7
于是当我要检索“中文分词”这个词语的时候,我不再打开每篇文章去匹配,而是直接在对应关系表看一下“中文分词”对应着文章1,3,5,7。
结果是文章1,3,5,7中含有“中文分词”,同样检索“搜索引擎”,直接返回的结果是2,4,6,7。
如果我要同时检索“中文分词”和“搜索引擎”,结果是(1,3,5,7)和(2,4,6,7)取交集。
结果是文章7同时包含“中文分词”和“搜索引擎”。
这个对应关系表就是所谓的倒排索引。
当然倒排索引可能包含的信息更为丰富,比如不仅包含词语在哪一篇文章,同时还包含了在这篇文章的哪个位置等。
生产环境中需要把所有文章都建立一个倒排索引。
创建倒排索引的前提是:
搜索引擎怎么认识句子中哪些是词语呢?
它不知道“中文分词”是一个词语。
这个工作由中文分词器来完成,分词器在创建索引过程和用户查询过程都会被使用到。
2.2搜索引擎和数据库区别
为什么搜索引擎无法被数据库所替代的原因主要有两点:
一个是在数据量比较大的时候,搜索引擎的查询速度快,第二点在于,搜索引擎能做到比数据库更理解用户。
第一点好理解,每当数据库的单个表大了,就是一件头疼的事,还有在较大数据量级的情况下,你让数据库去做模糊查询,那也是一件比较吃力的事(当然前缀匹配会好得多),设计上就应当避免。
关于第二点,搜索引擎如何理解用户,肯定不是简单的靠匹配,这里面可以加入很多的处理,甚至加入各种自然语言处理的高级技术,而比较通用且基本的方法就是靠分词器来完成,而且这是一种比较简单而且高效的处理方法。
3.中文分词类型
分词技术现今非常成熟了,分为3中技术
3.1基于词典的字符串匹配的分词方法
按照一定的策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行匹配,若在词典中找到某个字符串,则匹配成功(识别出一个词)。
范例:
检索“山东经济学院”时,首先检查“山”是否在词典中,再检查“山东”是否在词典中,然后查“山东经济”是否在词典中,以此类推。
按照扫描方向不同,串匹配又分为正向匹配和逆向匹配;
按照不同长度优先匹配的情况,可分为最长(最大)匹配和最短(最小)匹配;
按照是否与词性标注过程相结合,可分为单纯分词和分词与标注相结合的一体化方法;
常见的匹配方法包括:
正向最大匹配、逆向最大匹配、最短路径最大匹配
3.1.1正向最大匹配
假设词典里包含以下词:
“研究”、“研究生”、“生命”、“起源”
对“研究生命起源”进行分词。
匹配起点选择次数
子匹配次数
备选词
词典是否存在
分词结果
长度最大匹配结果
分析匹配结果
1
1
研
无
研究生
“研究生_命_起源”
明显语义错误。
说明本方法在用于“研究生命起源”时有误差。
2
研究
有
研究
3
研究生
有
研究生
4
研究生命
无
5
研究生命起
无
备注:
假设一个词语最大不超过5个字,停止匹配
2
1
命
(备注:
从“研究生”的下一个词开始)
无
命
2
命起
无
3
命起源
无
备注:
已延长到句子结尾,停止匹配。
3
1
起
无
起源
2
起源
有
起源
3.1.1逆向最大匹配
假设词典里包含以下词:
“研究”、“研究生”、“生命”、“起源”
对“研究生命起源”进行分词。
匹配起点选择次数
子匹配次数
备选词
词典是否存在
分词结果
长度最大匹配结果
分析匹配结果
1
1
源
无
起源
“研究_生命_起源”
明显语义正确。
说明本方法在用于“研究生命起源”时无误差。
2
起源
有
起源
3
命起源
无
4
生命起源
无
5
究生命起源
无
备注:
假设一个词语最大不超过5个字,停止匹配
2
1
命
无
生命
2
生命
有
生命
3
究生命
无
4
研究生命
无
3
1
究
无
研究
2
研究
有
研究
3.2基于统计的分词方法
从形式上看,词是稳定的字的组合,因此在上下文中,相邻的字同时出现的次数越多,就越有可能构成一个词。
因此字与字相邻共现的频率或概率能够较好的反映成词的可信度。
可以对语料中相邻共现的各个字的组合的频度进行统计,计算它们的互现信息。
定义两个字的互现信息,计算两个汉字X、Y的相邻共现概率。
互现信息体现了汉字之间结合关系的紧密程度。
当紧密程度高于某一个阈值时,便可认为此字组可能构成了一个词。
这种方法只需对语料中的字组频度进行统计,不需要切分词典,因而又叫做无词典分词法或统计取词方法。
但这种方法也有一定的局限性,会经常抽出一些共现频度高、但并不是词的常用字组,例如“这一”、“之一”、“有的”、“我的”、“许多的”等,并且对常用词的识别精度差,时空开销大。
实际应用的统计分词系统都要使用一部基本的分词词典(常用词词典)进行串匹配分词,同时使用统计方法识别一些新的词,即将串频统计和串匹配结合起来,既发挥匹配分词切分速度快、效率高的特点,又利用了无词典分词结合上下文识别生词、自动消除歧义的优点。
3.3基于语法的分词方法
这种分词方法是通过让计算机模拟人对句子的理解,达到识别词的效果。
其基本思想就是在分词的同时进行句法、语义分析,利用句法信息和语义信息来处理歧义现象。
它通常包括三个部分:
分词子系统、句法语义子系统、总控部分。
在总控部分的协调下,分词子系统可以获得有关词、句子等的句法和语义信息来对分词歧义进行判断,即它模拟了人对句子的理解过程。
这种分词方法需要使用大量的语言知识和信息。
由于汉语语言知识的笼统、复杂性,难以将各种语言信息组织成机器可直接读取的形式,因此目前基于理解的分词系统还处在试验阶段。
4.中文分词的难题
摘自:
http:
//www.williamlong.info/archives/333.html
有了成熟的分词算法,是否就能容易的解决中文分词的问题呢?
事实远非如此,中文是一种十分复杂的语言,让计算机理解中文语言更是苦难,在中文分词过程中,有两大难题一直没有完全突破。
4.1歧义识别
歧义是指同样的一句话,可能有两种或者更多的切分方法。
4.1.1交叉歧义
例如:
“表面的”这句话,因为“表面”和“面的”都是词,那么这个短语就可以分成“表面|的”和“表|面的”。
这种称为交叉歧义。
例如:
“化妆和服装”可以分为“化妆|和|服装”或者“化妆|和服|装”。
像这种交叉歧义十分常见,由于没有人的知识去理解,计算机很难知道到底哪个方案正确。
4.1.2组合歧义
比交叉歧义更加难处理的是组合歧义,必须根据整个句子来判断。
例如:
在句子“这个门把手坏了”中,“把手”是个词,但在句子“请把手拿开”中,“把手”不是一个词;
例如:
在句子“将军任命了一名中将”中,“中将”是个词,但在句子“产量三年中将增长两倍”中,“中将”不再是词。
这些词计算机无法识别。
4.1.3真歧义
真歧义是给出一句话,由人去判断也不知道哪个应该是词,哪个不应该是词。
例如:
“乒乓球拍卖完了”,可以切分成“乒乓|球拍|卖|完|了”,也可以切分成“乒乓球|拍卖|完|了”,如果没有上下文其他的句子,恐怕谁也不知道“拍卖”在这里算不算一个词。
4.2新词识别
新词,专业术语称为未登录词。
也就是那些在字典中都没有收录过,但有确实能称为词的那些词。
最典型的是人名,人可以很容易理解句子:
“王军虎去广州了”中,“王军虎”是个词,因为是一个人的名字,但要是让计算机去识别就困难了。
如果把“王军虎”作为一个词收录到字典中,全世界有那么多名字,而且每时每刻都有新增的人名,收录这些人名本身就是一项巨大的工程。
即使这项工作可以完成,还是会存在问题,例如:
在句子“王军虎头虎脑的”中,“王军虎”就不能算词。
新词中除了人名外,还有机构、地名、产品名、商标名、简称、省略语等都是很难处理的问题,而且这些又正好是经常使用的词,因此对于搜索引擎来说,分词系统中的新词识别十分重要。
4.IKAnalyzer中文分词器
4.1正向迭代最细粒度切分算法
根据官方说法IK分词器采用“正向迭代最细粒度切分算法”,属于“正向最大匹配法”的变种。
分析它的源代码,可以看到分词工具类IKQueryParser起至关重要的作用,它对搜索关键词采用从最大词到最小词层层迭代检索方式切分。
内部包含两种分词方法:
智能方式和非智能方式。
摘自:
4.1.1细粒度切分(IK的默认方式)
属于“正向”匹配,但并不是仅仅保留最长的词,而是把匹配到的所有词都保留下来了,所以也是“最细粒度切分”。
范例如下:
假设词典里包含以下词:
“研究”、“研究生”、“生命”、“起源”
对“研究生命起源”进行分词。
匹配起点选择次数
子匹配次数
备选词
词典是否存在
分词结果
合并分词结果
1
1
研
无
“研究生|研究|命起源”
2
研究
有
研究
3
研究生
有
研究生
4
研究生命
无
5
研究生命起
备注:
假设一个词语最大不超过5个字,停止匹配
无
2
1
生
无
2
生命
有
生命
3
生命起源
无
3
1
起
无
2
起源
有
起源
比如搜索词:
“中华人民共和国成立了”,
如果按照默认额细粒度切分,按照下图从上到下的顺序切分,形成树状结构。
最后树的先序遍历结果:
“中华人民共和国|中华人民|中华|华人|人民共和国|共和国|共和|国|成立|立了”就是分词结果。
4.1.1智能切分
IK分词器则会根据内在方法输出一个认为最合理的分词结果,这就涉及到了歧义判断,一般不存在相同词分到不同次元中。
假设词典里包含以下词:
“研究”、“研究生”、“生命”、“起源”。
对“研究生命起源”进行分词,结果是:
“研究|生命|起源”
范例:
原词
智能切分
细粒度切分
故宫博物院
故宫博物院
故宫博物院|故宫|博物院|博物|院|
八达岭长城风景名胜区
八达岭|长城|风景|名胜区|
八达岭|达|岭|长城|风景名胜|风景|名胜区|名胜|区|
4.2分词词典的重要性
智能分词和最细粒度分词。
两种分词方法都是以词库为分词依据。
下面范例说明了,虽然被分词的句子相同,但由于词库不同导致了分词结果的不同。
测试句子
词库内容
智能分词结果
最细力度分词结果
网厅
网厅
网
厅
网厅
网厅|网|厅|
网厅
网厅
网厅
网厅
网厅
(无内容)
网|厅
网|厅
网厅
网
厅
网|厅
网|厅
4.3词库配置
IKAnalyzer允许用户自定义三种词库:
扩展词库ext.dic,停用词库stopword.dic和同义词词库。
部署位置在conf目录下,和data-config.xml在相同目录下。
4.3.1配置文件IKAnalyzer.cfg.xml
4.3.1扩展词库
ext.dic格式是无BOM的UTF-8格式,自己修改时可以直接替换成首行空一行的utf8格式文件,每个扩展词占一行。
如下图:
这两个词库需要在IKAnalyzer的自身jar包中配置即可。
4.3.2停用词词库配置
stopword.dic格式是无BOM的UTF-8格式,自己修改时可以直接替换成首行空一行的utf8格式文件,每个扩展词占一行。
如下图:
4.3.2同义词词库配置
格式说明: