基于分布式ElasticSearch相似内容比对算法研究*

2021-01-19 11:00马智勤廖雪花肖文超
计算机与数字工程 2020年12期
关键词:词库近义词文档

马智勤 廖雪花 邓 威 肖文超

(1.四川师范大学计算机科学学院 成都 610001)(2.四川师范大学物理与电子工程学院 成都 610001)

1 引言

随着信息时代的到来,信息技术也随之迅速发展,文本数据作为最重要的信息载体在信息技术的发展中起到至关重要的作用,同时文本相似度计算作为信息处理领域的一个重要分支,在很多信息处理应用中起着至关重要的作用,其中相似内容比对作为文本信息处理领域的一项关键性技术,广泛应用于智能问答、论文查重、内容检索、自然语言处理等多种信息任务的研究处理中[1]。近年来,文本相似度在推荐系统、信息推送、智能问答等热门领域中备受关注,引起了极大的研究[2]。

目前,文本相似度计算主要分为三类,第一类是基于语料库,如利用词向量基于词袋模型计算相似度的VSM等[3];第二类是基于字符串的计算方法,如余弦相似度计算算法[4];第三类是基于神经网络的深度学习方法,如基于语义深度学习的匹配模型DSSM[5]。

在现有的大多数文本比对算法中考虑单一文本特性进行相似度计算。石彩霞等[6]提出多重检验加权的短文本相似度计算方法;郑志蕴等[7]提出了基于短文本相似度计算的知识子图融合方法;吴浩等[8]提出了融合性特征的中文句子相似度计算方法;邓涵等[9]从句子结构角度对句法和依存关系进行分析计算;卢佳伟等[10]提出融合TextRank算法的中文短文本相似度计算;均未考虑到日益新增的网络新词和流行词对词项识别带来的影响,同时段落替换,词序替换对文本比对的影响未有效解决。

在本文中提出一种基于ElasticSearch相似内容比对的改进方案,在基于ElasticSearch搜索引擎自身的TF-IDF向量空间模型算法的基础上通过一套优化方案实现文本相似度计算。该套优化方案主要通过配置远程词典、热更新词库和修改文本比对模型等途径实现,突破了词序替换、语义替换、新词出现等不能匹配的限制。同时,提出一种动态调整文本权重的思想,通过调整特殊位置的文本权重,在一定程度上提高文本比对精确度。

从稳定性方面考虑,大规律地高并发访问服务和频繁查询和管理文档对网络带宽和硬件配置有极高的要求,且对服务健康质量也提出较高要求,目前一般网络环境不能保证以上情况,一旦服务负载过重而宕机导致整个服务平台瘫痪不可用,同时文档库由高可用低延迟的ES集群管理,实现松散耦合的文档分布式管理。

2 关键技术介绍

2.1 ElasticSearch

2.1.1 ElasticSearch核心架构和索引

Elasticsearch是一个建立在全文搜索引擎Apache Lucene(TM)基础上的搜索引擎,可进行分布式实时文件存储,以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。

ElasticSearch索引设计的精髓也是为提高搜索的性能,其中倒排索引起到提高文档搜索速度的作用,倒排索引是实现“单词-文档矩阵”的一种具体存储形式,通过倒排索引,可以根据单词快速获取包含这个单词的文档列表[11]。ElasticSearch会将正向索引重新构建为倒排索引,即把文件ID对应到关键词的映射转换为关键词到文件ID的映射,每个关键词都对应着一系列的文件,这些文件中都出现这个关键词,倒排索引通俗的来说就是根据value找key,即根据关键字可以找到整个文档,本文设计的文本相似度计算简单来说是利用ES索引将文本中的词项进行匹配,结合TF-IDF算法来计算文本相似度。待计算文档存入ES集群的过程如图1所示。

图1 倒排索引概念图

将文档在ES集群中查询的过程等同于将文档与文档库中所有文档匹配的过程,在该过程中先将文档用ES节点配置的IkAnanlyzer中文分词器进行拆分为若干词项,根据上文提到的倒排索引即可根据词项找到所出现的文档,最终利用TF-IDF算法返回与该文档相似度较高的文档,同时返回其匹配分数。

2.1.2 ElasticSearch分布式核心实现原理

ElasticSearch是以Lucene为基础实现的一个分布式搜索引擎系统,随着索引库数量的增长,ElasticSearch集群可以轻松的扩容至上百个服务节点,来应对大数据量级别的索引写入和搜索查询,具备高可用高并发的特性。在本文的框架中,ES集群由3个从节点,1个主节点构成,多个节点的通信中共识性是最重要的基础功能,其中每个服务节点必须对指定的数据或节点的相关状态达成共识,即分布式系统中一致性问题。

其中Zen Discovery是ElasticSearch实现分布式的一个非常重要的核心组件,它不仅实现了ElasticSearch共识系统的选择工作,而且还可以监控集群的健康状态。Zen Discovery中选举Elastic-Search集群主节点Master过程如图ElasticSearch集群选主流程图如图2所示。

本文设计的框架中对于ES集群中的4个节点提高的索引文档库,通过分布式一致性实现了文档的备份,保证了文档的安全可靠存储,同时在ES集群宕机的情况下,通过配置数据存储路径保证信息不丢失。

图2 集群选主流程图

2.2 文本相似度TF-IDF算法

TF-IDF是ElasticSearch进行全文搜索的关键算法,TF-IDF(term frequency-inverse document frequency)是一种用于资讯检索与资讯探勘的常用加权技术[12]。TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度,字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降[13]。

其主要思想为,如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力[14]。

其计算公式:

TF:TF(term frequency)这个数字是对词数(term count)的归一化,以防止它偏向长的文件。

IDF:逆向文件频率(inverse document frequency,IDF)是一个词语普遍重要性的度量。某一特定词语的IDF,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取对数得到如式(1):

式中,|D|为语料库中的文件总数;|{j:ti∈dj}|为包含词语ti的文件数目(即ni,j≠0的文件数目)如果该词语不在语料库中,就会导致被除数为零,因此一般情况下使用1+|{j:ti∈dj}|。

然后:

某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的TF-IDF。

利用ES中的TF-IDF算法可计算出文本匹配的分数,分数越高文本越匹配,但是TF-IDF不能自动对文本特殊位置的文本进行加权处理,在优化方案中将对这一限制进行处理,通过POI文档处理器剥离出文本特殊位置的文本,比如标题、句首、句尾、关键词等,对剥离出来的文本进行适当的加权操作,从一定程度上可提高文本主题匹配的精确度。

3 提高文本比对精确度方案

为解决现有的大多数文本比对方法中存在的问题,如只考虑单一文本特性进行相似度计算、未考虑到日益新增的网络新词和流行词对词项识别带来的影响、段落替换,词序替换对文本比对的影响。本文研究了一种基于ElasticSearch相似内容比对的算法,通过配置远程词典将日益新增的词语新增到词库中以实现对新词的识别,同时通过热更新词库和修改文本比对模型等途径,实现了语义匹配、近义词匹配、段落替换匹配的效果,进而实现了提高文本比对精确度的目的。方案流程如图3所示。

图3 方案流程图

3.1 方案运行流程

通过图3可知,该方案由6大部分组成,通过6大部分之间的相互配合与协作,共同完成基于ElasticSearch相似内容比对的算法,该方案中各大部分的功能如下:

1)构建文档处理器

在文档处理器中使用POI库对文档做特定处理,POI提供Java API对Microsoft Office格式档案读和写的功能,以及读取多级标题等丰富的功能。对文档做特定处理,提取标题、段落首末句等特殊位置的文本,基于ElasticSearch语法对该文本调整权重,从一定程度上提高文本比对相似度。

2)文档分布式存储管理

该部分主要工作是通过预分配不同节点的角色,共同协作完成文档的管理,包括文档的存储与备份、文档的修改、文档的删除、文档的查询等过程。默认情况下,ES集群中的每个节点具有双重角色,即都有成为主节点资格,也都存储数据。为减轻节点压力,在集群中设置几个节点只负责成为主节点,维护整个集群的状态,再设置一批data节点只负责存储数据,再设置几个节点负责处理请求即为协调节点。通过不断优化,确定主节点、数据节点、协调节点的数量,以达到稳定且安全的集群状态。

3)动态调整文本权重

该部分的主要工作是对文档处理器中提取出来的文本,用基于ElasticSearch的语法拼接成查询语句。对于拼接过程中特殊文本的权重如何调整和赋值是该部分最主要的研究工作。

4)近义词匹配

该部分主要工作是实现近义词匹配,该工作有两种实现方式,一种是通过添加IK同义词词库,对远程词库进行管理。一种是通过Java API创建Mapping以实现近义词匹配,在使用Java API创建Mapping时根据读取的近义词文件动态构建特定的查询语法。针对这两种方式,从性能和稳定性以及便捷性做考虑选择第二种方式进行近义词匹配。

5)热更新词库

该部分最重要的工作是找到一种方案热更新分词库而不需要重启ElasticSearch。该方案中通过修改IK分词器源码,支持从Mysql中每隔一定时间,自动读取并加载新的词项。随着时间的推移,新词的不断出现,分词库中的词项会随之增加和更新,该工作将突破新词不被分词器识别的限制,从一定程度上提高基于ES的文本比对的可用性。

3.2 方案优势

相比传统的文本比对算法,本文提出的基于ElasticSearch文本比对优化方案有以下优势:

1)分布式文档存储管理

多个节点由不同计算机组长,共同构成一个集群,该集群即为ElasticSearch集群,该集群负责文档的管理,包括文档的创建、修改、删除和查询。在该集群中多节点共同参与文档的搜索,提高文档查询速度。基于分片备份的功能,可实现文档的安全存储,且集群对应的可视化平台可实时监控集群的健康状态,具备数据恢复功能。

2)调整特殊位置文本权重

鉴于标题、段落首末句等特殊位置的文本具有统领文章宗旨的作用,本文将对这些位置的文本进行提取并处理,使其在文本匹配过程中相较于其他文本占有更高的权重。

3)实时更新词库

用户可根据需要上传词项文件、管理词库,基于ElasticSearch实时性特点,更新的词库可实时作用于文档匹配过程。

4)实现近义词匹配

使用Java API根据实时上传的特定格式的近义词文档,动态创建Mapping以实现近义词匹配。

5)高可用、低延迟应用

该方案基于ElasticSearch集群进行设计并构建。ES集群通过限流保护服务免受血崩之灾,通过隔离实现故障隔离,通过设置合理的超时与重试机制避免请求堆积造成雪崩,通过回滚机制快速修改错误版本;通过上述原则来保护系统,使得系统高可用。因此该应用具备容错、可用性高、低延迟的特点。

4 方案的设计

随着社会的发展,随时会出现新的词语,而新的词语对文本识别带来的影响不可忽视。在某些文本比对场景将段落替换、词序替换、语义替换可达到大大降低文本相似度的目的,足以可见段落替换、语义替换等对文本相似度比对的影响。往往在不同位置的文本所代表的意义是不同的,一般标题所含的信息量更大,将标题、首尾句文本被赋予较高的文本比对权重能一定程度解决这类问题带来的影响,而很多文本比对技术并未处理这一问题。

ElasticSearch默认不支持对中文分词,通过配置IKAnanlyzer可使ES支持对中文进行分词。针对一些特殊的新词在分词的时候是不能够被识别的,我们可通过扩展IKAnanlyzer的自定义词库等方式使日益新增的词语被识别,有效提高文本比对精确度。下文将详细地介绍构建文档处理器、文档分布式存储管理技术、近义词匹配、热更新词库、动态调整文本权重算法等内容。

4.1 构建文档处理器

在对文档与文档库中的所有文档进行相似度比对之前,利用Apache POI开放源码函式库对文档做特定处理,POI提供Java API对Microsoft Office格式档案读和写的功能,以及读取多级标题等丰富的功能,本文中我们将按照文档的不同结构做相应处理。

后文中将提到文档中特殊文本的权重调整,此处提及到的文档处理器将读取标题等特殊位置的文本放入特定容器中,用于后面赋予较高权重,因为标题等文本具有统领全文的意义,如果标题一致说明文档间主题契合,更大意义上表达了标题、句首句末等特殊文本的重要性。

该处理器具体工作如图4所示,将上传的文档转为文件流,并使用POI处理器读取文档中的具有特殊意义的文本,将其以特定格式存储在文档临时容器中供后面使用,对于特殊意义的文本的识别方式有相应规则。最终将文档内容存储在ES集群中,供后面文本比对阶段使用。

图4 文件处理并存储

4.2 文档分布式存储管理技术

在生产环境下需修改ES集群中节点的角色信息,否则在高数据量、高并发的场景下ES集群容易出现脑裂等问题。默认情况下,ES集群中的每个节点具有双重角色,即都有成为主节点资格,也都存储数据。为减轻节点压力,在集群中设置几个节点只负责成为主节点,维护整个集群的状态,再设置一批data节点只负责存储数据,再设置几个节点负责处理请求即为协调节点[15]。系统中设计到的所有文档都分散的存储在data节点中,具体存储到哪个节点是根据hash算法而决定,当协调节点接收到请求后根据hash算法将请求分配到具体的数据节点,从数据节点拿到数据后再返回到协调节点,最终返回给用户,ES集群中节点分工如图5所示。

图5 节点角色功能

在数据节点的索引中分散地存储着文档,文档数据路由结果即为节点的编号,即该文档应该存储在哪个节点上,路由的算法可描述为:文档id(路由rounting值)用于shard-hash()函数计算得到的值与主分片数进行模运算。

索引划分多份即主分片和副本分片,副本的存在可使ES集群具备高可用性、扩展搜索量和吞吐量。此次之外,ES会定时地把缓存数据刷新到硬盘,可达到数据持久化的效果,防止断电时数据丢失。同时也可数据备份,防止出现数据损坏时无法恢复数据。

当数据量过大,现有数据节点无法有效的管理索引时,可动态水平扩展ES集群,新增到ES集群中的节点通过Zen Discovery发现模块提供的单播和基于文件的发现功能加入到集群中。

为确保ES集群健康的运行,应实时对ES集群故障检测,设置两个故障检测进程在集群的生命周期中一直运行,一个是主节点ping集群中的所有其他节点,检查是否存活,另一种是每个节点都ping主节点,确认主节点是否仍在运行或者是否需要重新选举主节点。

4.3 近义词匹配

在文本比对中,有甚者利用近义词替换等手段降低文本相似度达到不利目的。如西红柿和番茄是一组同义词,如果文本中将西红柿替换为番茄,同样应不能改变其被匹配的事实。

首先我们需要创建同义词文件,并编辑同义词,并通过文件管理器将同义词文件上传至系统中解析为文件流后待后面进一步处理。

然后将文件保存至ES节点的特定文件夹下,在通过Java High REST API与ES集群相连,通过设置索引的Mapping结构下的同义词过滤器,使文档在查询时可基于同义词字典进行同义词匹配,其流程如图6所示。

图6 近义词匹配

4.4 热更新词库

现在网络热词很多,每隔一段时间就会出现网红热词;但是如果直接使用IK分词,是识别不了这些词的。如果文本中新的词语被分词不正确会给文本比对带来影响,如新词“网红”,如果分词器不能识别它则导致该词语被分词为“网”和“红”二字。

通过自定义一种方法不断优化分词库、停用词库,让中文分词器所依赖的库更丰富,分词更精确。通过研究设计两种解决方案,配置远程词典或者直接配置分词库,但是这两种方案都需要重启ElasticSearch非常麻烦,且因为ES是分布式的可能有数百个节点,当扩展字典时不可能每次都一个一个节点上面去修改,所以最重要的工作是找到一种方案热更新分词库而不需要重启Elastic-Search。

该方案中通过修改IK分词器源码,然后手动支持从Mysql中每隔一定时间,自动加载新的词库。我们可通过提供修改Mysql数据库中数据的方式来让用户根据需要上传新词字典来实时扩展词库。在本文中利用爬虫得到的数据实时更新Mysql数据库中的新词项数据,同时IK分词器每隔一定时间将自动加载数据到词库中,以扩充词库的新词量,在技术上面采用并发和定时任务等关键技术对爬虫提取到的结果进行实时上传到远程词典。其操作流程如图7所示。

图7 热更新词库

4.5 动态调整文本权重算法

针对ElasticSearch的默认相似度模型TF-IDF不能反映词的位置信息的缺点,自定义一种方案让文本中的标题、文本首句、文本尾句等位置的文本有更高的权重,而首先需要实现的是能自动识别文档中的标题和段落首句和尾句,并在搜索的过程中给与较高的权重去匹配索引中的文档库。根据前文提到的“构建文档处理器”能解析出文章的多级标题、主题、关键词、句首、句尾等特殊位置文本,利用文档处理器解析将处理的结果暂时存放在容器中,用自定义格式进行包装,以特定的权重查询语法到ES集群中查询,将标题等特殊位置的文本赋予更高的权重,查询结果中标题被匹配的文档比其他位置文本被匹配的文档其得分更高。

5 计算方法对比

使用分词方法进行相似度计算的方法有Levenshtein、余弦夹角法、Jaccard系数方法,下面将三个方法和本文采用的基于ES实现文本相似度比对的方法进行对比,如表1所示。

表1 相似度计算方法对比

6 结语

基于ES搜索引擎的文本匹配方案,其作为一种新的实现文本相似度计算的新方向,从文本主题相似度识别、特殊位置文本权重调整、语义识别、新词识别等方面的突破是一个重大的进展。在现实生活中,信息载体中文本占据至关重要的地位,文本相似度计算作为信息处理领域的一个重要分支,在很多信息处理的具体应用中起着重要的作用,是一个非常基础而关键的问题。本文设计出一种提高文本比对精确度的方案,该方案通过分布式文档管理,保证文档的安全性;通过动态调整特殊位置文本权重,从一定程度上可提高文本相似度;该方案考虑到日益新增的新词和流行词对分词器的影响,增设了热更新词库的功能;同时基于ES的搜索语法,根据上传的近义词文档,动态构建Mapping,以实现文本的近义词匹配。该方案实时处理文档,能应对高并发场景,切实保证程序响应的速度,保证系统安全且稳定。

猜你喜欢
词库近义词文档
浅谈Matlab与Word文档的应用接口
有人一声不吭向你扔了个文档
怎样辨析近义词
轻松编辑PDF文档
一“吃”多用
输入法词库取证比较研究
找找近义词
Word文档 高效分合有高招
输入法词库乾坤大挪移
将用户词库快速导入搜狗五笔词库