前文再续,书接上一回。
今天是空间属性一体化全文检索系统的第三节,从今天开始会用好几节的内容来讲讲系统的关键技术与实现中。这一节主要讲自然语言处理。
在开讲之前,给大家先吃一个定心丸,自然语言处理虽然设计很多复杂的技术和算法,但是如果你不想搞得那么复杂的话,是可以直接依托Elasticsearch提供的插件来实现,完全不用自己做任何事情,当然你需要搞得更加风流倜傥的话,也可以自己花式使用各种强大的算法和功能。
作为全文检索基本功能,自然语言处理是必备的功能。自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。自然语言处理是一门融语言学、计算机科学、数学于一体的科学。
当然,我们这里不做自然语言的研究,我们仅需要去使用它而已。
上面所罗列的是自然语言处理目前的主流技术和应用,其中有一些在全文检索中并用不到,比如情感分析……所以我在上面用黄色的圈标出了我们重点需要关注几种技术。
第一就是中文分词。分词是将连续的字序列按照一定的规范重新组合成词性的过程,中文与英文本质上的不同,导致分词技术也完全不同。业界有一本很知名的书,叫做“Python自然语言处理”,但是里面的内容都是以英文来说明,根本没有任何意义能对应到中文上。
在全文检索系统里面,分词可以分成两个方面来说:
第一个方面就是在导入ES的时候,设置长文本为分词索引模式,ES使用的中文分词引擎是IK 分析器。
IK Analyzer是一个JAVA编写的轻量级中文分词工具,它以开源项目Luence为主体的,结合词典分词和文法分析算法的中文分词组件。IK采用了特有的“正向迭代最细粒度切分算法”,支持细粒度和智能分词两种切分模式。在2012版本中,IK实现了简单的分词歧义排除算法。
当你的长文本导入到ES中,会使用IK分词器,把你的文本都拆分成一个个的词汇,每个词汇作为一个doc的index。当我们要进行查询的时候,按照输入的条件,去进行匹配。
第二个方面,就是我们可以在接收查询条件输入的时候,把输入的查询条件分词进行索引,这样可以获得更好的体验。
这里举个例子,比如我要查询的是“北京市朝阳区的小学”,如果按照ES默认的分词规则,分成“北京市、朝阳区、的、小学”,那么具体匹配的时候,还可能出现北京市的所有小学,或者是辽宁省的朝阳市的小学(匹配:朝阳、小学两个关键词)。
所以我们可以直接在输入条件的时候,就把“北京市朝阳区”做成一个标准的限定词(可以不进行分词),然后再加上小学,这样得到就必然会有“北京市朝阳区”以及“小学”这样的结果。当然,也有可能需要更多的匹配信息,那么最起码我们可以让符合我们理解的信息的权重更大。
分词是全文检索最基础的组件,也是最关键组件,当然第二种模式可以作为备选,如果只用第一种模式仅需要使用ES的默认设置即可。
当然,这里大家也都看出来了,分词是一种开销非常大的构建方式,而且很多信息是未必需要分词的,举例来说关系型数据库里面的很多信息就没有分词的必要,比如地类名称里面的“其他农用地”就没有必要分词“其他、农用、用地”这样的词汇,而是作为一个完整的关键字存在,在后面我们将ES索引库设计的时候,还会就这个问题继续说明。
自然语言处理的第二个应用就是词性标注,词性是指某一类的语法特征,也就是具备的语法功能,比如说名词,动词,形容词等。
我们在查询的时候,输入的条件可能会带有一些关键信息,比如上面的例子“北京市朝阳区惠新西街北面的小学”,对于空间属性一体化全文检索系统来说,具备空间属性的名词,肯定是第一要务,所以我们可以看见,北京市和朝阳区分析出来,标注为NS(地名)的,就可以直接作为空间条件进行检索了,还有北面(f:方位词),以及小学(n:名词),至于的这种助词,在搜索里面是没有任何意义的,实际上就可以忽略不计了。
词性标注是理解自然语言非常重要的内容,用好了词性标注功能,能大幅度提高我们系统的用户体验。
情感分析是自然语言处理里面,最贴合人工智能应用的一种,大多数应用在论坛、客服系统等应用中,主要是通过对带有感情色彩的主观性文本进行分析,得到正向或者负向结论。不过对于我们的全文检索系统来说,用处不大,这里就不详细说了。
拼音文本转换是为了用户输入条件时候的体验优化,没啥好说的,不过对于使用五笔输入的同学来说,这个功能貌似没有太大的作用就是了。
不过,这个功能也是文本纠错的一个重要功能组件。
比如我要查询“热力管线”,但是我输入成了“热力关系”,这样就可以先把中文转换为拼音,而后再转换为文本,达到纠错的目的。
当然,动态纠错还有很多的方法,拼音文本转换只是方法之一。
繁简转换在互联网系统用得比较多,因为在中文世界,繁体中文在整个大中华区,以及西方世界的华语资料里面,还是海量的存在,不过目前在我们以国内为目标的全文检索系统里面没有多意义,就不多说了。
文本关键词和摘要,是系统自动处理长文本的一种手段,比如我们检索到了一篇几万字的文章之后,不可除了把包含关键字的段落部分显示出来,有可能我们还想查看一下这几万字的文章具体讲的什么内容,这个时候,不能把几万字都全部给你返回过来吧?所以这个时候,提取摘要就很有必要了。当然,系统自动提取的摘要,效果如何,自然就不用强求了。
信息衡量是评估某个词对于文件的重要程度,一般用TF-IDF算法来进行统计,原理就是一个词如果在A文中出现,但是在其他文本中没有,则表示这个词对A文非常重要,而有些词,所有文本中都有,就是不重要的,比如“的”,“也”、“很”这种词,所有文本都很多,就说明很不重要。如下所示:的字的重要性为0,表示无关紧要。
一般在全文检索系统中,信息衡量技术用的地方不多,当然我们可以在返回信息权重分析模型上的使用这种算法来进行分析,不过暂时用不到,就不详细说了。
最后一种就是文本相似性,主要是衡量两个文本之间的相似程度,但是这里的算法和语义上的近义词同义词无关,只是一种词频上的相似性,类似于论文查重的功能,这功能对于我们的全文检索系统作用也不大,直接pass掉。
以上就是我们实现全文检索系统里面的关键技术之一,自然语言处理功能,如果简单的就想做做分词,那么直接利用ES提供的IK分词器就可以了,但是这样做的话,效果往往差强人意,这就看我们具体是更看重成本还更看重效果了。
用腾讯的语录就是:
这个问题,充钱就能解决……
预知后事如何,请听下回分解。
最后还是广告:
有需要的详细咨询了解其中的一些关键的技术细节的同学,可以与虾神单独联系。
联系方式:关注公众号,然后发送2,获取虾神的个人邮箱。