中文分词与搜索引擎

看到题目就知道我要说什么了,这个话题好像已经被讨论过n次了,看雅虎搜索blog上在06年就有过专题系列文章,地址为:http://ysearchblog.cn/2006/07/post_16.html,文中详细的介绍了有关中文分词的意义,算法,跟搜索引擎的关系等等。个人认为文章质量非常不错。其实我所写的也不外乎这些东西,可我为什么还要写呢?是因为我花了将近一周的时间来理解中文分词,收集有关资料,为了不让努力白费,我还是总结一下吧。

一.为什么要中文分词?

对啊,为何要分词,不分词行不行?要讨论这个话题,首先需要了解一下搜索引擎的原理。搜索引擎的为什么能快速检索到自己查询的关键字呢?实际上这得 益于他的数据存储机制-----倒排索引。这里用一个例子来大体说明什么是倒排索引(之所以说大体,是因为我也没有深入的了解)。假设我有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同 时含有“中文分词”,“搜索引擎”。那我搜其他的词语呢?那就把其他词语也放到这个对应表中。这个“对应关系表”其实就是所谓的倒排索引,当然,倒排索引 可能含有的信息更为丰富,比如不仅包含了词语在哪一篇文章,同时还包含了在这篇文章的哪个位置等等。很显然,我们需要把所有文章建立一个倒排索引。问题来 了,计算机怎么认识哪个是词语呢?他并不知道“中文分词”就是一个词语。没有词语,怎么建立索引呢?于是,我们需要中文分词!并且分词发生在用户查询和服 务器建立索引时。

二.什么样的中文分词适合搜索引擎

因为中文的每个句子是连续的字的序列,词语跟词语直接没有明显的分隔(英文的单词之间用格隔开),于是分词看起来变得困难了许多。取一个最极端的方式,每一个字作为一个词,即所谓的1元分词。比如“山东经济学院”,分为“山_东_经_济_学_院”,然后建立倒排索引:

山——>1,3

东——>2,3

经——>3,4

济——>3,5,4

院——>3,5,6

于是,当我搜索“山东经济学院”时,在倒排索引中查找每一个字,然后取其交集,得到的结果是3,文章3中 含有“山东经济学院”这个词。这看起来很完美,完全解决了分词的问题并成功的建立了倒排索引。显然,博大精深的汉语不可能让问题就这么简单!如果我按照一 元分词对“主板和服务器”,建立倒排索引,当我想要检索日本的“和服”时。出来的结果却是“主板和服务器”八竿子打不着的结果。不免让人云里雾里心头不 爽!除了检索质量,还有一个问题就是检索效率,对“山东经济学院”我需要查询到6条目录,然后取交集。这性能又降低了,对于毫秒级的搜索引擎,这怎么能忍 呢。如果“山东经济学院”就是一个词,建立索引“山东经济学院——>3”我岂不是一下子就查到了,也不用做什么交集运算。所以1元分词显然不能满足 人们的要求。类似的还有2元分词,2元交叉分词,比如“主板和服务器”,2元分词为:“主板_和服_务器”,2元交叉分词为“主板_板和_和服_服务_务 器,很显然,这两种分词结果除了提高了一下检索效率外,对搜索体验却没什么大的改善,总会让我在查找“和服”时找到一堆关于电脑的东西。

那 上面提到的“山东经济学院”作为一个词的策略是否完美呢?这里就体现出搜索引擎的中文分词跟其他专业领域的中文分词的不同来,如果是机器翻译,很显然“山 东经济学院”是一个专有名词,不可分割。但是对于搜索引擎,我希望当我查询“经济学院”时也能查到山东经济学院,这样的话“山东经济学院”又不能作为一个 词了。

所以,搜索引擎的分词应该控制合理的粒度!

问题是,怎样才算合适的粒度?我认为是能表达完整意义的最小词语,有些拗口,解释一下:“山东经济学院”,可以分为“山东_经济学院”或“山东_经济_学 院”,我倾向的是后者,因为“经济学院”是可以再分的:“经济_学院”。“经济”和“学院”都是可以理解的能表达完整意义的词语,并且不可再分。这样便保 证了查全率:“经济学院”,“山东_学院”都能检索到这条结果。至于搜索的满意程度就需要做相关度排序,跟搜索词语越相关的排在前面,比如搜索“山东经 济”,一篇关于阐述山东经济发展的文章应该在比较靠前的位置,而关于山东经济学院的文章则应排在后面。

三.中文分词算法

中文分词有三种截然不同的分词方法,每一种方法都对应了一种研究领域。

1.  基于词典的分词

2.  基于统计的分词

3.  基于语法的分词

我所了解的,及当前搜索引擎广为采用的是第一种分词方法,有一个包含了很多词语的词典,你拿着一句话挨着到词典里去匹配,匹配上就算一个词。比如 “山东经济学院”,首先匹配“山”,词典里有,OK, 算一个词,“山东”,词典里也有,那也是一个词,假设“山东经济”也包含在词典里呢?那我同时匹配到“山”,“山东”,“山东经济”三个词语,我该选择哪 个呢?为了解决这个问题,人们便制定了一些规则:选择长度最大的那个词语,因为实践证明这往往是正确的(当然,不是绝对正确)。根据这个规则演变的算法有 正向最大匹配,逆向最大匹配,MMSEG算法等。上述各种算法都不是完美的,总会有分错的时候,我们只是期望尽可能的正确(其实,对于搜索引擎,有时候分 词不正确也并不影响检索效果)。

下面以“研究生命起源”这句话为例讲述一下上述三种算法的分词情况:

首先,我们需要一个词典,词典里含有这么几个词:

研究

研究生

生命

起源

1.  正向最大匹配

顾名思义,方向为从前往后正向匹配。

首先,拿到第一个词“研”,查询词典,没有,前进一步,拿到“研究”,查询词典,得到词语:“研 究”,并不罢休,继续拿到“研究生”,查询词典,得到词语:“研究生”,仍不罢休,拿到“研究生命”,查询词典,没有,继续下去,一直打到你认为合理的长 度,比如你觉得一个词语不可能超过5个字,你拿到“研究生命起”,查询词典后,没有结果,就不在继续下去了。现在对查询结果进行选择,很显然长度最大的为 “研究生”,至此,我们确定了第一个词“研究生”。

然后,从下一个词开始,依次拿到“命”,“命起”,“命起源”,到词典查询,都没有结果,于是把“命”这个字作为一个词。

再次,从下一个词开始,依次拿到“起”,“起源”,到词典查询,得到“起源”。

至此分词完成,得到结果“研究生_命_起源”,很明显分错了~。

2.  逆向最大匹配

基本上还是上面的过程,不过“研究生命起源”这句话要到这来

首先,依次拿到“源”,“起源”,“命起源”,“生命起源”,“究生命起源”到词典匹配,得到结果“起源”。

然后,依次拿到“命”,“生命”,“究生命”,“研究生命”,到词典查询,得到结果“生命”。

再次,依次拿到“究”,“研究”,查询词典,得到结果“研究”

至此,分词完成,得到结果“研究_生命_起源”,分词正确。

总体说来,普遍认为逆向最大匹配的正确率要高于正向最大匹配。

3.  MMSEG算法

MMSEG算法相对上面两种算法来说比较复杂,因为其正确率比较高所以被普遍采用,因为有各种语言的实现,比如python的pymmseg ,java 的mmseg4j, c/c++的libmmseg等,

网上关于这个算法有很多介绍,为了偷懒,我在这里就不赘述,想了解的同学请google之。

四.中文分词面临的问题

当前中文分词主要面临两个问题:

1.  歧义消解

2.  新词发现

关于歧义消解:

比如“研究生命”,是应该分为“研究_生命”还是“研究生_命”,这是关于“生”的归属问题,“生”可以跟“研究”一起,变成“研究生”,也可以跟 “命”一起,变成“生命”。“研究生”跟“生命”有一个交集“命”,这便是交叉型歧义。另一个例子“中国人”,可以分为“中国_人”,也可以“中国人”整 个是一个词。即“中国”和“人”的不同组合造成了歧义,这便是组合型歧义

上述各种算法无非就是对这两种歧义的消解。

按照我在第二条提到的观点,搜索引擎分词的粒度应该是:能表达完整意义的最小词语。所以应该不会出现组合型歧义,重点应该放到解决“交叉型歧义”的问题上。

歧义的消解应该针对特殊情况做出合理的调整。可以结合不同的分词方法,比如语法分析,统计等。

举例来说:“武夷山路”,词典中含有“武夷”,“山路”两个词的时候,MMSEG算法和逆向最大匹配会分词为:“武夷_山 路”,当用户输入“武夷山路”时,不管分词正确与否,都能正确匹配到正确的结果。但是,在这个城市里生活的人们,可能想通过“武夷山”就能检索到武夷山路 (因为大家都知道这个城市里没有武夷山,输入“武夷山”,默认想得到的结果就是关于武夷山路的)。现在来看分词为什么错误了呢?因为词典里存在“山路”这 个词!是“路”这个仅仅起后缀作用的字干扰了分词,所以我认为这样的后缀词,不应该参与分词,类似的还有“省,市,县,镇”等。

关于新词发现:

因为精力有限,目前还不了解这个领域的情况,大体可以通过对用户搜索日志进行数据挖掘得出。

五.总结

1.  搜索引擎需要中文分词,分词的对象为要建立索引的文档和用户提交的查询词,并且两者对同一段语句的分词结果必须一致。

2.  分词粒度应该控制为:能表达完整意义的最小词语。这样便避免了组合型歧义。

3.  对于消解歧义应该根据具体情况调整,适当综合利用各种分词方法。

4.  如果用户查询词跟建立索引时分词结果一致,就算分词错误,也能检索到,所以有人认为当分词正确率达到一定值时,正确率对搜索质量的影响便不会那么明显了。因此没必要一味的追求正确率。

六.参考资料

1.  中文分词和搜索引擎(一)

2.  中文分词和搜索引擎(二)

3.  中文分词和搜索引擎(三)

4.  搜索引擎之中文分词(Chinese Word Segmentation)简介

5.  Google

时间: 2024-08-07 06:37:12

中文分词与搜索引擎的相关文章

搜索引擎技术揭密:中文分词技术

http://www.williamlong.info/archives/333.html 信息的飞速增长,使搜索引擎成为人们查找信息的首选工具,Google.百度.中国搜索等大型搜索引擎一直是人们讨论的话题.随着搜索市场价值的不断增加,越来越多的公司开发出自己的搜索引擎,阿里巴巴的商机搜索.8848的购物搜索等也陆续面世,自然,搜索引擎技术也成为技术人员关注的热点. 搜索引擎技术的研究,国外比中国要早近十年,从最早的Archie,到后来的Excite,以及altvista.overture.g

SEO技术分享之搜索引擎的中文分词技术

上次给大家说了什么是爬虫以及爬虫的发展史,相信看过的朋友们都有所了解了.那么蜘蛛把抓取到的网页是要经过系统的分析的才会给索引出来.那么分析中,就有一项非常重要的技术了,那就是搜索引擎蜘蛛的分词技术,百度的分词应该也是用的这个技术. 那么什么是中文分词呢?其实任何文档都可以看过是一些连续的词的组合,然而中文并没有铭心啊的词间分隔,与英文不同.在中文的语法中,词汇是由两个以上汉字组成的,并且句子是连续书写的,句子间还有标点分开.所以这就要求在自动分析文字时,先要将整句话分隔成词汇,这也就是中文分词了

搜索引擎系列四:Lucene提供的分词器、IKAnalyze中文分词器集成

一.Lucene提供的分词器StandardAnalyzer和SmartChineseAnalyzer 1.新建一个测试Lucene提供的分词器的maven项目LuceneAnalyzer 2. 在pom.xml里面引入如下依赖 <!-- lucene 核心模块 --> <dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-core</artifactId&

PHP中文分词扩展 SCWS

1.scws简介 SCWS 是 Simple Chinese Word Segmentation 的首字母缩写(即:简易中文分词系统). 这是一套基于词频词典的机械式中文分词引擎,它能将一整段的中文文本基本正确地切分成词. 词是中文的最小语素单位,但在书写时并不像英语会在词之间用空格分开, 所以如何准确并快速分词一直是中文分词的攻关难点. SCWS 采用纯 C 语言开发,不依赖任何外部库函数,可直接使用动态链接库嵌入应用程序, 支持的中文编码包括 GBK.UTF-8 等.此外还提供了 PHP 扩

中文分词之结巴分词~~~附使用场景+demo

常用技能(更新ing):http://www.cnblogs.com/dunitian/p/4822808.html#skill 技能总纲(更新ing):http://www.cnblogs.com/dunitian/p/5493793.html 在线演示:http://cppjieba-webdemo.herokuapp.com 完整demo:https://github.com/dunitian/TempCode/tree/master/2016-09-05 先说下注意点,结巴分词他没有对分

65seo干货:用百度中文分词做出高排名网站

365seo干货:用百度中文分词做出高排名网站 大家好,我是365SEO-冬眠,今天再次为大家带来干货. 废话不多说,直接进入主题. 标题写的好不好直接关系到一个网站关键词的覆盖度和搜索引擎对该网站索引量的多少. 很多seo培训学院讲的最多的就是关键词分析,关键词布局,软文的发布,外链怎么发,然而唯独对百度中文分词一掠而过,其实弄明白了百度中文分词,你就完全明白了怎么去写关键词,怎么合理的布局关键词,怎么把这些关键词稳固的做上搜索引擎首页. 百度中文分词炼的都是内功 上个案例,客户要求做黑龙江塔

Sphinx + Coreseek 实现中文分词搜索

Sphinx + Coreseek 实现中文分词搜索 Sphinx Coreseek 实现中文分词搜索 全文检索 1 全文检索 vs 数据库 2 中文检索 vs 汉化检索 3 自建全文搜索与使用Google等第三方站点提供的站内全文搜索的差别 Sphinx Coreseek介绍 Coreseek安装使用 1. 全文检索 1.1 全文检索 vs. 数据库 全文检索是数据库的有力补充,全文检索并不能替代数据库在应用系统中的作用.当应用系统的数据以大量的文本信息为主时,採用全文检索技术能够极大的提升应

PHP中文分词的简单实现

对于中文搜索引擎来说, 中文分词是整个系统最基础的部分之一, 因为目前基于单字的中文搜索算法并不是太好. 当然, 本文不是要对中文搜索引擎做研究, 而是分享如果用 PHP 做一个站内搜索引擎. 本文是这个系统中的一篇. 我使用的分词工具是中科院计算所的开源版本的 ICTCLAS. 另外还有开源的 Bamboo, 我随后也会对该工具进行调研. 从 ICTCLAS 出发是个不错的选择, 因为其算法传播比较广泛, 有公开的学术文档, 并且编译简单, 库依赖少. 但目前只提供了 C/C++, Java

.net 的一个分词系统(jieba中文分词的.NET版本:jieba.NET)

简介 平时经常用Python写些小程序.在做文本分析相关的事情时免不了进行中文分词,于是就遇到了用Python实现的结巴中文分词.jieba使用起来非常简单,同时分词的结果也令人印象深刻,有兴趣的可以到它的在线演示站点体验下(注意第三行文字). .NET平台上常见的分词组件是盘古分词,但是已经好久没有更新了.最明显的是内置词典,jieba的词典有50万个词条,而盘古的词典是17万,这样会造成明显不同的分词效果.另外,对于未登录词,jieba“采用了基于汉字成词能力的HMM模型,使用了Viterb