垂直搜索引擎中的分词系统

分词系统的框架与实现介绍---本文适合对搜索引擎有良好概念的读者(原创)

关键字:搜索引擎,分词,Lucene

国内垂直领域的电商或者信息分享类应用都处于高速发展期,其对内容快速搜索的需求越来越强烈,对于能适应自己业务应用的搜索引擎解决方案也越来越重视。同时,通用的可选开源搜索引擎框架或解决方案也越来越多,如著名的Lucene,Solr,ElasticSearch等。打造一套完美适应自身业务需求的搜索引擎是个具有挑战性的任务,而且无论选择Lucene,Solr这些搜索引擎框架、方案还是自己另写一套搜索引擎,都面临着一个共同的核心问题---如何打造适合自身业务的分词系统。

一、分词原理介绍

1.1 分词

经典笑话:某护士看到肝硬化病人在病房里偷偷喝酒,就走过去叮嘱说:小心肝!病人微笑回应:小宝贝!这里的“小心肝”存在歧义,从护士的角度理解为:小心/肝,病人的角度成了:小心肝。在中文的世界了,充满着需要准确分词才能消除歧义的场景。

分词对于搜索引擎而言是无比重要的,既影响索引的性能,又直接影响搜索结果的准确性以及相关性的计算。

1.2 英文分词

英语(适用于所有的拉丁语系和相似语系语言)由于有其语言天然以单词为基本单位,所以分词相对容易。需要的基本步骤如下:

  • 初步分割,根据空格/符号/段落 分割,得到基本单词
  • 停用词(stop word)过滤
  • 词干提取(stemming)
  • 词形还原(lemmatisation)

第一步很好理解,不做多余解释。

第二步中的停用词(stop word)是指a/an/and/are这类高频词,这类词对搜索的意义不大,但对基于词频的算分公式产生极大的干扰,所以需要过滤掉。

第三步,词干提取(stemming)是西方语言特有的处理,比如英语单词中的单复数变形,-ing和-ed的变形。但在计算相关性时应做同一个单词。比如 apple和apples,doing和done是同一个词,提取词干的目的就是要合并这些变态。这样做能更好的满足人们搜索的习惯和对返回内容的期望。

Lucene英文分词自带了3个常用的词干提取算法,分别是

  • English Minimal Stemmer
  • 著名的 Porter Stemming
  • KStemmer

词干提取的算法并不复杂,基本上是一堆规则,或用映射表,编程容易,但是必须精通这种语言的专家才能胜任---必须非常了解其构词法才行。

第四步,词形还原的基本方法是通过字典映射,比如将drove还原成drive。而stemming经常会把单词变短,如doing变成do。实际上stemming解决了大部分西方语言的分词转换问题,词形还原则更进一步提高了搜索引擎的体验。

1.3 数字分词

数字在常规搜索引擎,如Lucene中,默认会将其当做一个纯粹的字符串处理。分词效果跟英文基本一致。也就是说像数值3.1415926的分词结果就是其本身,要想搜索到这个数字也需要输入完整的3.1415926才能精确命中。

基于全匹配的数字串搜索,对于使用者来说,上述的例子对搜索不太友好。在定制的搜索引擎中往往对此进行优化,以支持对数值更友好的搜索。如对数字进行抽取变成数值,支持数值范围的搜索以及部分数值搜索(章节"垂直领域分词系统差异"里会进一步提到)。

1.4 中文分词

完美的中文分词系统是世界性的难题,原因在于它不仅要理解中文语法结构,中文语义还要自适应语境。不仅如此,中文新词的出现比较快,词义又在不断变化。所以至今为止,没有哪个人或机构声称他们的中文分词系统是100%准确的。或许人工智能的成熟可以将中文分词的准确性不断接近100%。

现有的分词系统方案:

  • 一元切词和二分切词
  • 基于词典最长匹配
  • 形成切分图分词
  • 概率语言模型分词法

一元切词和二分切词

一元切词是将每个中文字符(汉字)独立成一个词条(Term),这样的搜索结果会很糟糕,比如一个普通的搜索"上海",结果集中将完全不相干的"海上"一起返回出来。Lucene里默认提供的是二切中文分词,原理为将:上海人 分词为:上海/海人 这样做的好处是避免了一元切词出现的完全没有意义的结果。但二切分词的结果里出现根本没有意义的词条---海人,而且这是可搜索的内容,效果不如人意。

基于词典的最长匹配

基于词典分词的一种方法是将词典构建成一个Trie搜索树,每个节点放一个字,同时将词的信息放在Node中,如词性,权重等。Trie树可以是一种多层散列表,在每一层上查找的速度是O(1),所以匹配速度非常快。

如下图所示的是一个由词组集<一万,一万多,一万元,一上午,一下午,一下子>生成的Tire树的子树

(Trie树示例)

文本在Trie树上进行逐层匹配,直到Trie树不再有子层级或者文本无法匹配到该层的任何字符,这样的得出的分词结果为基于词典的最长匹配。

形成切分图分词

首先该方法也是依赖于词典,同时为了消除分词中的歧义,提高分词的精确度,需要找出一段文字中所有可能的词,生成全切分词图。 

(中文分词切分路径)

上图中可以切分的路径有两条:

路径1:0-1-3-5 对应方案为:有/意见/分歧

路径2:0-2-3-5 对应方案为:有意/见/分歧

使用动态规划算法能获取上述切分结果,并使用词性,权重等综合因素最终确定分词结果。

概率语言模型分词法

从统计思维的角度来看,分词的问题可以理解为输入是一个字符串:C=C1,C2,C3...,Cn 输出是一个词串 S=W1,W2,W3...,Wm(m<=n)。对于一个特定的字符串C,会有多个切词方案S与之对应,分词就是从这些S中找出概率最大的一个切分方案,也就是对输入字符串切分出最有可能的词序列。

对于输入字符串C"有意见分歧",有S1和S2两种切分可能。

  • S1: 有/意见/分歧
  • S2: 有意/见/分歧

计算条件概率P(S1|C)和P(S2|C),然后采用概率大的值对应的切分方案。根据贝叶斯公式,有P(S|C)=(P(C|S)*P(S))/P(C),其中P(C)是字符串在语料中出现的概率,只是一个用来归一化的固定值。从词串恢复到汉字串的概率只有唯一的一种方式,所以P(C|S)=1。因此,比较P(S1|C)和P(S2|C)的大小变成比较P(S1)和P(S2)的大小。进一步推导可参考《解密搜索引擎技术实战:Lucene&Java》精华版第二版第4章.

从另外一个角度看,计算最大概率等于求切分词图的最短路径,可以采用动态规划法求解最短路径。

基于概率的分词法,依赖于充足的语料以及对语料的统计分析。因此它是属于事先学习型的分词法。目前一些高质量的分词法就是基于概率统计分词法实现的。

二、垂直领域分词系统差异

与通用搜索引擎的复杂语料相比,垂直搜索引擎中的语料数据在进索引之前往往会得到清洗。也意味着数据的复杂度会降低。同时在垂直领域中会有很多的专有术语,用户搜索的习惯跟通用搜索引擎也会不一样。因此,需要让垂直搜索引擎显得更智能,更能理解用户的搜索意图。比如自动校正输错的专业词汇,在输入框中提示更多的分类结果集等。这些都需要在搜索引擎中准确的分词以及基于分词的推荐算法来完成。

1.1 英文分词

在垂直领域的英文分词,一般会减少传统英文分词的步骤。根据语料的差异,有时会将词干提取(stemming)省掉,有时候会将过滤stop word步骤省掉。而且一般不进行词干还原。具体怎么做主要取决于要索引的语料。比如在钢铁信息行业,钢铁相关术语非常多,而且很多英文本身是单词缩写,这时候做词干提取和词性还原可能达到会适得其反的效果。同时,由于行业信息推出的集中度很高,快速分词和索引要求较高,因而在不影响准确性的时候,英文分词步骤会做尽可能精简。

同时,垂直搜索引擎会支持更高级的语法来帮助用户在不确定词的情况,搜到结果,相关内容会在下面的中文分词中说明。

1.2 数字分词

数字在文本搜索引擎中算是个异类,文本中出现的数字默认会当做文本来处理。搜索引擎使用者首先需要把数字组合当做一个单词来搜索,如果当做一个数字来搜则会出现疑惑。典型的疑惑有两个:第一,如何在文本中搜索数值范围;第二,长数字到底如何来搜索?比如,一篇文档中出现了1.5,2.0,3.0。能否通过搜索一个数值范围值(2.5-4.0)来匹配结果? 而3.1415926这样的长数值如何搜索才能找到?

Lucene里有NumericField(数值域)概念,其本质是将数字文本转换为数值以支持精确搜索或范围搜索。使用NumericField的前提是从文本中分析出数值,并且需要将数值索引到一个单独的NumericField中。

实际应用中,垂直搜索引擎往往会去清洗带有关键数值的文本Field(域),从中提取数值然后单独做索引。搜索数值的时候需要将NumericField映射到相应的文本Field中。同时在原有文本域中,将数字进行长度切分,如将3.1415926按照4位长度切分:3.14/1592/6,以满足用户用更简短的字符(如3.14)来搜索该数字串。当然,如果输入完整的长数字串匹配效果会更好。

1.3 中文分词

垂直搜索引擎中的中文分词实现复杂度跟英文分词一样,也取决于语料。对于中文语料的清洗,基本能把那些无关业务的或者没有意义的中文本文去除掉。剩下的进行高速分词。

同时由于没有一种分词法能100%的分词准确,在高级搜索中,支持更多的搜索语法,典型的有如下高级搜索:

  • 通配符查询(Wildcard Search)

支持通配符(Wildcard)搜索能解决只知道部分内容的查询,如搜""能出来包含"中间","中国*"等词的文档

  • 模糊查询(Fuzzy Search)

支持模糊(Fuzzy)查询,允许用户在输错的情况搜索想要的结果。如查询"宝港股份有限公司",在模糊搜索下,能将"宝钢股份有限公司"搜索出来。

高级搜索跟分词的关系在于,用户的搜索语句最后往往合成一条复杂查询语句,分词器综合语法解析器切分出正确的查询词,并执行最终查询。

上述两个高级搜索特性同样适用于对于英文的搜索。

三、找钢网分词系统的实现原理

找钢网搜索业务具有如下的特征:

  • 文本内容生成时间上广泛分布,同时某些时间段又比较集中,索引的速度要有保障
  • 内容索引后,需要尽快被搜索到

针对自身的业务特性和语料特征,构建了一套完整分词系统。

3.1 分词框架和流程

第一步,获取基础词条(Token)。将语料中的内容,按照语言切分出来。得到英文单词、数字、中文段、保留字、无用字。然后在各个语言分词器中进一步切分词,如中文分词需要将中文段再切分为中文词,数字进行4位切分等。

第二部,由第一步中获取的基本词条按照定制需求进行组合,如两个数字之间如果有小数点则组合成一个词条,搜索语句切分时将通配符跟其他词条组合成一个词条等。

第三步,筛选有用词条,丢弃无用词条,得到最终词条。

基本流程

3.2 中日韩分词

中、日、韩三国语言有部分汉字是重叠的,并且可以基于词典,使用相同的分词法分词。这里主要说明中文分词。

中文分词采用了基于词典的最长匹配法,同时为了消除一些基本的歧义,我们采用了正向词典匹配外,还进行了反向词典匹配。最后根据切分词组的权重,选取更优结果。

经过系列测试和对比,在现有词典和语料下,目前中文分词法的准确度达到85%以上,在高级搜索的匹配下,搜索覆盖率能接近100%。分词的速度超过200K/m(词条数/分钟)以上,速度上也完全可接受。

随着业务需求上的细化和更多语料的积累,将进一步实现基于多元中文切分和基于概率统计的中文分词法来提高分词的准确性,提高搜索引擎的用户体验。

主要参考文献:

  1. 《解密搜索引擎技术实战》---Lucene&Java精华版 第2版
  2. 《Lucene in action 2》
  3. 《Managing Gigabyte》
时间: 2024-10-07 20:24:13

垂直搜索引擎中的分词系统的相关文章

Lucene4.6+Solr4.6实战开发垂直搜索引擎 Lucene4.6实战视频教程

<基于Lucene4.6+Solr4.6+Heritrix1.14+S2SH实战开发从无到有垂直搜索引擎> 课程讲师:小叶子 课程分类:Java 适合人群:初级 课时数量:69课时 用到技术:Hibernate.Struts.Spring.jQuery.Lucene.Solr.Heritrix 涉及项目:百度文库搜索引擎 垂直搜索引擎是针对某一个行业的专业搜索引擎,是搜索引擎的细分和延伸,是对网页库中的某类专门的信息进行一次整合,定向分字段抽取出需要的数据进行处理后再以某种形式返回给用户.垂直

【课程分享】基于Lucene4.6+Solr4.6+Heritrix1.14+S2SH实战开发从无到有垂直搜索引擎

对这个课程有兴趣的朋友,能够加我的QQ2059055336和我联系,能够和您分享. 课程介绍:最有前途的软件开发技术--搜索引擎技术 搜索引擎作为互联网发展中至关重要的一种应用,已经成为互联网各个领域的制高点,其重要性不言而喻.搜索引擎领域也是互联网应用中不多见的以核心技术作为其命脉的领域,搜索引擎各个子系统是怎样设计的?这成为广大技术人员和搜索引擎优化人员密切关注的内容. 随着互联网行业兴起,大数据时代的到来,搜索引擎开发成为一项极富含金量的工作,市场对搜索软件开发project师的需求极其旺

用开源软件建垂直搜索引擎 转载 http://news.cnblogs.com/n/60041/

用Solr.Nutch等开源软件来构建电子元器件垂直搜索引擎涉及很多实现细节,本文结合实际应用系统对数据采集.中文搜索.结果输出.分页处理.整合数据库等重点问题提出了切实可行的解决方法. 用开源软件建垂直搜索引擎 ■ 董娅 周峻松 针对搜索引擎的各种开源技术是开源社区的一枝奇葩,它大大缩短了构建搜索应用的周期,并使得根据特定需求打造个性化应用的垂直搜索引擎系统成为可能.作为一个独立的企业搜索应用解决方案,Solr在美国的众多知名网站中得到应用,如美国最大的科技资讯类网站CNet.Solr基于高性

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

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

几款开源的中文分词系统

中文分词是做好中文内容检索.文本分析的基础,主要应用于搜索引擎与数据挖掘领域.中文是以词为基本语素单位,而词与词之间并不像英语一样有空格来分隔,因而中文分词的难点在于如何准确而又快速地进行分词 以下介绍4款开源中文分词系统. 1.ICTCLAS – 全球最受欢迎的汉语分词系统 中文词法分析是中文信息处理的基础与关键.中国科学院计算技术研究所在多年研究工作积累的基础上,研制出了汉语词法分析系统ICTCLAS(Institute of Computing Technology, Chinese Le

Apache Lucene 几种分词系统

1. StopAnalyzer StopAnalyzer能过滤词汇中的特定字符串和词汇,并且完成大写转小写的功能. 2. StandardAnalyzer StandardAnalyzer根据空格和符号来完成分词,还可以完成数字.字母.E-mail地址.IP地址以及中文字符的分析处理,还可以支持过滤词表,用来代替StopAnalyzer能够实现的过滤功能. 3. SimpleAnalyzer SimpleAnalyzer具备基本西文字符词汇分析的分词器,处理词汇单元时,以非字母字符作为分割符号.

搜索引擎中输入检索词到返回十条结果,发生了哪些事情

移动互联网时代搜索引擎依然是重要流量来源以及流量分发渠道,虽然比PC互联网时代权重有所降低. 各大电商淘宝.京东80-90%交易额也是由用户app内搜索.网站内搜索产生,个性化推荐系统本身也和搜索 引擎无论技术还是产品方方面面都与搜索引擎有着关联,我们每天也都和搜索引擎打着交道,搜索知识. 搜索问题.搜索新闻.了解世界,搜索引擎价值巨大,作为一个技术人应该了解他并不断深入了解他. 百度第三代搜索引擎架构 当我们使用搜索引擎检索信息时,输入想要查找检索词,点击回车,搜索引擎在1s左右时间返回十篇

Elasticsearch中的分词器比较及使用方法

Elasticsearch 默认分词器和中分分词器之间的比较及使用方法 https://segmentfault.com/a/1190000012553894 介绍:ElasticSearch 是一个基于 Lucene 的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful web 接口.Elasticsearch 是用 Java 开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎.设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用

搜索引擎中查询纠错总结

搜索引擎是目前人们获取信息最重要的方式之一,其最基本最核心的功能是信息检索,找到含有关键字的网页或文档,然后按照一定排序将结果给出,在此基础之上,能够提供更多更复杂的功能来提升用户体验.对于一个成熟的搜索系统,用户看似简单的搜索过程,需要在系统中经过多个环节,多个模块协同工作,才能提供一个让人满意的搜索结果.在搜索引擎输入的查询中,有相当一部分是带输入错误的查询.而提交有错误的查询给搜索引擎,通常得不到好的搜索结果,返回结果数很少并且和用户的期待相差很远,会严重影响了用户的使用体验.因此查询纠错