馬智勤 廖雪花 鄧 威 肖文超
(1.四川師范大學(xué)計(jì)算機(jī)科學(xué)學(xué)院 成都 610001)(2.四川師范大學(xué)物理與電子工程學(xué)院 成都 610001)
隨著信息時(shí)代的到來(lái),信息技術(shù)也隨之迅速發(fā)展,文本數(shù)據(jù)作為最重要的信息載體在信息技術(shù)的發(fā)展中起到至關(guān)重要的作用,同時(shí)文本相似度計(jì)算作為信息處理領(lǐng)域的一個(gè)重要分支,在很多信息處理應(yīng)用中起著至關(guān)重要的作用,其中相似內(nèi)容比對(duì)作為文本信息處理領(lǐng)域的一項(xiàng)關(guān)鍵性技術(shù),廣泛應(yīng)用于智能問(wèn)答、論文查重、內(nèi)容檢索、自然語(yǔ)言處理等多種信息任務(wù)的研究處理中[1]。近年來(lái),文本相似度在推薦系統(tǒng)、信息推送、智能問(wèn)答等熱門領(lǐng)域中備受關(guān)注,引起了極大的研究[2]。
目前,文本相似度計(jì)算主要分為三類,第一類是基于語(yǔ)料庫(kù),如利用詞向量基于詞袋模型計(jì)算相似度的VSM等[3];第二類是基于字符串的計(jì)算方法,如余弦相似度計(jì)算算法[4];第三類是基于神經(jīng)網(wǎng)絡(luò)的深度學(xué)習(xí)方法,如基于語(yǔ)義深度學(xué)習(xí)的匹配模型DSSM[5]。
在現(xiàn)有的大多數(shù)文本比對(duì)算法中考慮單一文本特性進(jìn)行相似度計(jì)算。石彩霞等[6]提出多重檢驗(yàn)加權(quán)的短文本相似度計(jì)算方法;鄭志蘊(yùn)等[7]提出了基于短文本相似度計(jì)算的知識(shí)子圖融合方法;吳浩等[8]提出了融合性特征的中文句子相似度計(jì)算方法;鄧涵等[9]從句子結(jié)構(gòu)角度對(duì)句法和依存關(guān)系進(jìn)行分析計(jì)算;盧佳偉等[10]提出融合TextRank算法的中文短文本相似度計(jì)算;均未考慮到日益新增的網(wǎng)絡(luò)新詞和流行詞對(duì)詞項(xiàng)識(shí)別帶來(lái)的影響,同時(shí)段落替換,詞序替換對(duì)文本比對(duì)的影響未有效解決。
在本文中提出一種基于ElasticSearch相似內(nèi)容比對(duì)的改進(jìn)方案,在基于ElasticSearch搜索引擎自身的TF-IDF向量空間模型算法的基礎(chǔ)上通過(guò)一套優(yōu)化方案實(shí)現(xiàn)文本相似度計(jì)算。該套優(yōu)化方案主要通過(guò)配置遠(yuǎn)程詞典、熱更新詞庫(kù)和修改文本比對(duì)模型等途徑實(shí)現(xiàn),突破了詞序替換、語(yǔ)義替換、新詞出現(xiàn)等不能匹配的限制。同時(shí),提出一種動(dòng)態(tài)調(diào)整文本權(quán)重的思想,通過(guò)調(diào)整特殊位置的文本權(quán)重,在一定程度上提高文本比對(duì)精確度。
從穩(wěn)定性方面考慮,大規(guī)律地高并發(fā)訪問(wèn)服務(wù)和頻繁查詢和管理文檔對(duì)網(wǎng)絡(luò)帶寬和硬件配置有極高的要求,且對(duì)服務(wù)健康質(zhì)量也提出較高要求,目前一般網(wǎng)絡(luò)環(huán)境不能保證以上情況,一旦服務(wù)負(fù)載過(guò)重而宕機(jī)導(dǎo)致整個(gè)服務(wù)平臺(tái)癱瘓不可用,同時(shí)文檔庫(kù)由高可用低延遲的ES集群管理,實(shí)現(xiàn)松散耦合的文檔分布式管理。
2.1.1 ElasticSearch核心架構(gòu)和索引
Elasticsearch是一個(gè)建立在全文搜索引擎Apache Lucene(TM)基礎(chǔ)上的搜索引擎,可進(jìn)行分布式實(shí)時(shí)文件存儲(chǔ),以擴(kuò)展到上百臺(tái)服務(wù)器,處理PB級(jí)別的結(jié)構(gòu)化或非結(jié)構(gòu)化數(shù)據(jù)。
ElasticSearch索引設(shè)計(jì)的精髓也是為提高搜索的性能,其中倒排索引起到提高文檔搜索速度的作用,倒排索引是實(shí)現(xiàn)“單詞-文檔矩陣”的一種具體存儲(chǔ)形式,通過(guò)倒排索引,可以根據(jù)單詞快速獲取包含這個(gè)單詞的文檔列表[11]。ElasticSearch會(huì)將正向索引重新構(gòu)建為倒排索引,即把文件ID對(duì)應(yīng)到關(guān)鍵詞的映射轉(zhuǎn)換為關(guān)鍵詞到文件ID的映射,每個(gè)關(guān)鍵詞都對(duì)應(yīng)著一系列的文件,這些文件中都出現(xiàn)這個(gè)關(guān)鍵詞,倒排索引通俗的來(lái)說(shuō)就是根據(jù)value找key,即根據(jù)關(guān)鍵字可以找到整個(gè)文檔,本文設(shè)計(jì)的文本相似度計(jì)算簡(jiǎn)單來(lái)說(shuō)是利用ES索引將文本中的詞項(xiàng)進(jìn)行匹配,結(jié)合TF-IDF算法來(lái)計(jì)算文本相似度。待計(jì)算文檔存入ES集群的過(guò)程如圖1所示。
圖1 倒排索引概念圖
將文檔在ES集群中查詢的過(guò)程等同于將文檔與文檔庫(kù)中所有文檔匹配的過(guò)程,在該過(guò)程中先將文檔用ES節(jié)點(diǎn)配置的IkAnanlyzer中文分詞器進(jìn)行拆分為若干詞項(xiàng),根據(jù)上文提到的倒排索引即可根據(jù)詞項(xiàng)找到所出現(xiàn)的文檔,最終利用TF-IDF算法返回與該文檔相似度較高的文檔,同時(shí)返回其匹配分?jǐn)?shù)。
2.1.2 ElasticSearch分布式核心實(shí)現(xiàn)原理
ElasticSearch是以Lucene為基礎(chǔ)實(shí)現(xiàn)的一個(gè)分布式搜索引擎系統(tǒng),隨著索引庫(kù)數(shù)量的增長(zhǎng),ElasticSearch集群可以輕松的擴(kuò)容至上百個(gè)服務(wù)節(jié)點(diǎn),來(lái)應(yīng)對(duì)大數(shù)據(jù)量級(jí)別的索引寫(xiě)入和搜索查詢,具備高可用高并發(fā)的特性。在本文的框架中,ES集群由3個(gè)從節(jié)點(diǎn),1個(gè)主節(jié)點(diǎn)構(gòu)成,多個(gè)節(jié)點(diǎn)的通信中共識(shí)性是最重要的基礎(chǔ)功能,其中每個(gè)服務(wù)節(jié)點(diǎn)必須對(duì)指定的數(shù)據(jù)或節(jié)點(diǎn)的相關(guān)狀態(tài)達(dá)成共識(shí),即分布式系統(tǒng)中一致性問(wèn)題。
其中Zen Discovery是ElasticSearch實(shí)現(xiàn)分布式的一個(gè)非常重要的核心組件,它不僅實(shí)現(xiàn)了ElasticSearch共識(shí)系統(tǒng)的選擇工作,而且還可以監(jiān)控集群的健康狀態(tài)。Zen Discovery中選舉Elastic-Search集群主節(jié)點(diǎn)Master過(guò)程如圖ElasticSearch集群選主流程圖如圖2所示。
本文設(shè)計(jì)的框架中對(duì)于ES集群中的4個(gè)節(jié)點(diǎn)提高的索引文檔庫(kù),通過(guò)分布式一致性實(shí)現(xiàn)了文檔的備份,保證了文檔的安全可靠存儲(chǔ),同時(shí)在ES集群宕機(jī)的情況下,通過(guò)配置數(shù)據(jù)存儲(chǔ)路徑保證信息不丟失。
圖2 集群選主流程圖
TF-IDF是ElasticSearch進(jìn)行全文搜索的關(guān)鍵算法,TF-IDF(term frequency-inverse document frequency)是一種用于資訊檢索與資訊探勘的常用加權(quán)技術(shù)[12]。TF-IDF是一種統(tǒng)計(jì)方法,用以評(píng)估一字詞對(duì)于一個(gè)文件集或一個(gè)語(yǔ)料庫(kù)中的其中一份文件的重要程度,字詞的重要性隨著它在文件中出現(xiàn)的次數(shù)成正比增加,但同時(shí)會(huì)隨著它在語(yǔ)料庫(kù)中出現(xiàn)的頻率成反比下降[13]。
其主要思想為,如果某個(gè)詞或短語(yǔ)在一篇文章中出現(xiàn)的頻率TF高,并且在其他文章中很少出現(xiàn),則認(rèn)為此詞或者短語(yǔ)具有很好的類別區(qū)分能力[14]。
其計(jì)算公式:
TF:TF(term frequency)這個(gè)數(shù)字是對(duì)詞數(shù)(term count)的歸一化,以防止它偏向長(zhǎng)的文件。
IDF:逆向文件頻率(inverse document frequency,IDF)是一個(gè)詞語(yǔ)普遍重要性的度量。某一特定詞語(yǔ)的IDF,可以由總文件數(shù)目除以包含該詞語(yǔ)之文件的數(shù)目,再將得到的商取對(duì)數(shù)得到如式(1):
式中,|D|為語(yǔ)料庫(kù)中的文件總數(shù);|{j:ti∈dj}|為包含詞語(yǔ)ti的文件數(shù)目(即ni,j≠0的文件數(shù)目)如果該詞語(yǔ)不在語(yǔ)料庫(kù)中,就會(huì)導(dǎo)致被除數(shù)為零,因此一般情況下使用1+|{j:ti∈dj}|。
然后:
某一特定文件內(nèi)的高詞語(yǔ)頻率,以及該詞語(yǔ)在整個(gè)文件集合中的低文件頻率,可以產(chǎn)生出高權(quán)重的TF-IDF。
利用ES中的TF-IDF算法可計(jì)算出文本匹配的分?jǐn)?shù),分?jǐn)?shù)越高文本越匹配,但是TF-IDF不能自動(dòng)對(duì)文本特殊位置的文本進(jìn)行加權(quán)處理,在優(yōu)化方案中將對(duì)這一限制進(jìn)行處理,通過(guò)POI文檔處理器剝離出文本特殊位置的文本,比如標(biāo)題、句首、句尾、關(guān)鍵詞等,對(duì)剝離出來(lái)的文本進(jìn)行適當(dāng)?shù)募訖?quán)操作,從一定程度上可提高文本主題匹配的精確度。
為解決現(xiàn)有的大多數(shù)文本比對(duì)方法中存在的問(wèn)題,如只考慮單一文本特性進(jìn)行相似度計(jì)算、未考慮到日益新增的網(wǎng)絡(luò)新詞和流行詞對(duì)詞項(xiàng)識(shí)別帶來(lái)的影響、段落替換,詞序替換對(duì)文本比對(duì)的影響。本文研究了一種基于ElasticSearch相似內(nèi)容比對(duì)的算法,通過(guò)配置遠(yuǎn)程詞典將日益新增的詞語(yǔ)新增到詞庫(kù)中以實(shí)現(xiàn)對(duì)新詞的識(shí)別,同時(shí)通過(guò)熱更新詞庫(kù)和修改文本比對(duì)模型等途徑,實(shí)現(xiàn)了語(yǔ)義匹配、近義詞匹配、段落替換匹配的效果,進(jìn)而實(shí)現(xiàn)了提高文本比對(duì)精確度的目的。方案流程如圖3所示。
圖3 方案流程圖
通過(guò)圖3可知,該方案由6大部分組成,通過(guò)6大部分之間的相互配合與協(xié)作,共同完成基于ElasticSearch相似內(nèi)容比對(duì)的算法,該方案中各大部分的功能如下:
1)構(gòu)建文檔處理器
在文檔處理器中使用POI庫(kù)對(duì)文檔做特定處理,POI提供Java API對(duì)Microsoft Office格式檔案讀和寫(xiě)的功能,以及讀取多級(jí)標(biāo)題等豐富的功能。對(duì)文檔做特定處理,提取標(biāo)題、段落首末句等特殊位置的文本,基于ElasticSearch語(yǔ)法對(duì)該文本調(diào)整權(quán)重,從一定程度上提高文本比對(duì)相似度。
2)文檔分布式存儲(chǔ)管理
該部分主要工作是通過(guò)預(yù)分配不同節(jié)點(diǎn)的角色,共同協(xié)作完成文檔的管理,包括文檔的存儲(chǔ)與備份、文檔的修改、文檔的刪除、文檔的查詢等過(guò)程。默認(rèn)情況下,ES集群中的每個(gè)節(jié)點(diǎn)具有雙重角色,即都有成為主節(jié)點(diǎn)資格,也都存儲(chǔ)數(shù)據(jù)。為減輕節(jié)點(diǎn)壓力,在集群中設(shè)置幾個(gè)節(jié)點(diǎn)只負(fù)責(zé)成為主節(jié)點(diǎn),維護(hù)整個(gè)集群的狀態(tài),再設(shè)置一批data節(jié)點(diǎn)只負(fù)責(zé)存儲(chǔ)數(shù)據(jù),再設(shè)置幾個(gè)節(jié)點(diǎn)負(fù)責(zé)處理請(qǐng)求即為協(xié)調(diào)節(jié)點(diǎn)。通過(guò)不斷優(yōu)化,確定主節(jié)點(diǎn)、數(shù)據(jù)節(jié)點(diǎn)、協(xié)調(diào)節(jié)點(diǎn)的數(shù)量,以達(dá)到穩(wěn)定且安全的集群狀態(tài)。
3)動(dòng)態(tài)調(diào)整文本權(quán)重
該部分的主要工作是對(duì)文檔處理器中提取出來(lái)的文本,用基于ElasticSearch的語(yǔ)法拼接成查詢語(yǔ)句。對(duì)于拼接過(guò)程中特殊文本的權(quán)重如何調(diào)整和賦值是該部分最主要的研究工作。
4)近義詞匹配
該部分主要工作是實(shí)現(xiàn)近義詞匹配,該工作有兩種實(shí)現(xiàn)方式,一種是通過(guò)添加IK同義詞詞庫(kù),對(duì)遠(yuǎn)程詞庫(kù)進(jìn)行管理。一種是通過(guò)Java API創(chuàng)建Mapping以實(shí)現(xiàn)近義詞匹配,在使用Java API創(chuàng)建Mapping時(shí)根據(jù)讀取的近義詞文件動(dòng)態(tài)構(gòu)建特定的查詢語(yǔ)法。針對(duì)這兩種方式,從性能和穩(wěn)定性以及便捷性做考慮選擇第二種方式進(jìn)行近義詞匹配。
5)熱更新詞庫(kù)
該部分最重要的工作是找到一種方案熱更新分詞庫(kù)而不需要重啟ElasticSearch。該方案中通過(guò)修改IK分詞器源碼,支持從Mysql中每隔一定時(shí)間,自動(dòng)讀取并加載新的詞項(xiàng)。隨著時(shí)間的推移,新詞的不斷出現(xiàn),分詞庫(kù)中的詞項(xiàng)會(huì)隨之增加和更新,該工作將突破新詞不被分詞器識(shí)別的限制,從一定程度上提高基于ES的文本比對(duì)的可用性。
相比傳統(tǒng)的文本比對(duì)算法,本文提出的基于ElasticSearch文本比對(duì)優(yōu)化方案有以下優(yōu)勢(shì):
1)分布式文檔存儲(chǔ)管理
多個(gè)節(jié)點(diǎn)由不同計(jì)算機(jī)組長(zhǎng),共同構(gòu)成一個(gè)集群,該集群即為ElasticSearch集群,該集群負(fù)責(zé)文檔的管理,包括文檔的創(chuàng)建、修改、刪除和查詢。在該集群中多節(jié)點(diǎn)共同參與文檔的搜索,提高文檔查詢速度?;诜制瑐浞莸墓δ?,可實(shí)現(xiàn)文檔的安全存儲(chǔ),且集群對(duì)應(yīng)的可視化平臺(tái)可實(shí)時(shí)監(jiān)控集群的健康狀態(tài),具備數(shù)據(jù)恢復(fù)功能。
2)調(diào)整特殊位置文本權(quán)重
鑒于標(biāo)題、段落首末句等特殊位置的文本具有統(tǒng)領(lǐng)文章宗旨的作用,本文將對(duì)這些位置的文本進(jìn)行提取并處理,使其在文本匹配過(guò)程中相較于其他文本占有更高的權(quán)重。
3)實(shí)時(shí)更新詞庫(kù)
用戶可根據(jù)需要上傳詞項(xiàng)文件、管理詞庫(kù),基于ElasticSearch實(shí)時(shí)性特點(diǎn),更新的詞庫(kù)可實(shí)時(shí)作用于文檔匹配過(guò)程。
4)實(shí)現(xiàn)近義詞匹配
使用Java API根據(jù)實(shí)時(shí)上傳的特定格式的近義詞文檔,動(dòng)態(tài)創(chuàng)建Mapping以實(shí)現(xiàn)近義詞匹配。
5)高可用、低延遲應(yīng)用
該方案基于ElasticSearch集群進(jìn)行設(shè)計(jì)并構(gòu)建。ES集群通過(guò)限流保護(hù)服務(wù)免受血崩之災(zāi),通過(guò)隔離實(shí)現(xiàn)故障隔離,通過(guò)設(shè)置合理的超時(shí)與重試機(jī)制避免請(qǐng)求堆積造成雪崩,通過(guò)回滾機(jī)制快速修改錯(cuò)誤版本;通過(guò)上述原則來(lái)保護(hù)系統(tǒng),使得系統(tǒng)高可用。因此該應(yīng)用具備容錯(cuò)、可用性高、低延遲的特點(diǎn)。
隨著社會(huì)的發(fā)展,隨時(shí)會(huì)出現(xiàn)新的詞語(yǔ),而新的詞語(yǔ)對(duì)文本識(shí)別帶來(lái)的影響不可忽視。在某些文本比對(duì)場(chǎng)景將段落替換、詞序替換、語(yǔ)義替換可達(dá)到大大降低文本相似度的目的,足以可見(jiàn)段落替換、語(yǔ)義替換等對(duì)文本相似度比對(duì)的影響。往往在不同位置的文本所代表的意義是不同的,一般標(biāo)題所含的信息量更大,將標(biāo)題、首尾句文本被賦予較高的文本比對(duì)權(quán)重能一定程度解決這類問(wèn)題帶來(lái)的影響,而很多文本比對(duì)技術(shù)并未處理這一問(wèn)題。
ElasticSearch默認(rèn)不支持對(duì)中文分詞,通過(guò)配置IKAnanlyzer可使ES支持對(duì)中文進(jìn)行分詞。針對(duì)一些特殊的新詞在分詞的時(shí)候是不能夠被識(shí)別的,我們可通過(guò)擴(kuò)展IKAnanlyzer的自定義詞庫(kù)等方式使日益新增的詞語(yǔ)被識(shí)別,有效提高文本比對(duì)精確度。下文將詳細(xì)地介紹構(gòu)建文檔處理器、文檔分布式存儲(chǔ)管理技術(shù)、近義詞匹配、熱更新詞庫(kù)、動(dòng)態(tài)調(diào)整文本權(quán)重算法等內(nèi)容。
在對(duì)文檔與文檔庫(kù)中的所有文檔進(jìn)行相似度比對(duì)之前,利用Apache POI開(kāi)放源碼函式庫(kù)對(duì)文檔做特定處理,POI提供Java API對(duì)Microsoft Office格式檔案讀和寫(xiě)的功能,以及讀取多級(jí)標(biāo)題等豐富的功能,本文中我們將按照文檔的不同結(jié)構(gòu)做相應(yīng)處理。
后文中將提到文檔中特殊文本的權(quán)重調(diào)整,此處提及到的文檔處理器將讀取標(biāo)題等特殊位置的文本放入特定容器中,用于后面賦予較高權(quán)重,因?yàn)闃?biāo)題等文本具有統(tǒng)領(lǐng)全文的意義,如果標(biāo)題一致說(shuō)明文檔間主題契合,更大意義上表達(dá)了標(biāo)題、句首句末等特殊文本的重要性。
該處理器具體工作如圖4所示,將上傳的文檔轉(zhuǎn)為文件流,并使用POI處理器讀取文檔中的具有特殊意義的文本,將其以特定格式存儲(chǔ)在文檔臨時(shí)容器中供后面使用,對(duì)于特殊意義的文本的識(shí)別方式有相應(yīng)規(guī)則。最終將文檔內(nèi)容存儲(chǔ)在ES集群中,供后面文本比對(duì)階段使用。
圖4 文件處理并存儲(chǔ)
在生產(chǎn)環(huán)境下需修改ES集群中節(jié)點(diǎn)的角色信息,否則在高數(shù)據(jù)量、高并發(fā)的場(chǎng)景下ES集群容易出現(xiàn)腦裂等問(wèn)題。默認(rèn)情況下,ES集群中的每個(gè)節(jié)點(diǎn)具有雙重角色,即都有成為主節(jié)點(diǎn)資格,也都存儲(chǔ)數(shù)據(jù)。為減輕節(jié)點(diǎn)壓力,在集群中設(shè)置幾個(gè)節(jié)點(diǎn)只負(fù)責(zé)成為主節(jié)點(diǎn),維護(hù)整個(gè)集群的狀態(tài),再設(shè)置一批data節(jié)點(diǎn)只負(fù)責(zé)存儲(chǔ)數(shù)據(jù),再設(shè)置幾個(gè)節(jié)點(diǎn)負(fù)責(zé)處理請(qǐng)求即為協(xié)調(diào)節(jié)點(diǎn)[15]。系統(tǒng)中設(shè)計(jì)到的所有文檔都分散的存儲(chǔ)在data節(jié)點(diǎn)中,具體存儲(chǔ)到哪個(gè)節(jié)點(diǎn)是根據(jù)hash算法而決定,當(dāng)協(xié)調(diào)節(jié)點(diǎn)接收到請(qǐng)求后根據(jù)hash算法將請(qǐng)求分配到具體的數(shù)據(jù)節(jié)點(diǎn),從數(shù)據(jù)節(jié)點(diǎn)拿到數(shù)據(jù)后再返回到協(xié)調(diào)節(jié)點(diǎn),最終返回給用戶,ES集群中節(jié)點(diǎn)分工如圖5所示。
圖5 節(jié)點(diǎn)角色功能
在數(shù)據(jù)節(jié)點(diǎn)的索引中分散地存儲(chǔ)著文檔,文檔數(shù)據(jù)路由結(jié)果即為節(jié)點(diǎn)的編號(hào),即該文檔應(yīng)該存儲(chǔ)在哪個(gè)節(jié)點(diǎn)上,路由的算法可描述為:文檔id(路由rounting值)用于shard-hash()函數(shù)計(jì)算得到的值與主分片數(shù)進(jìn)行模運(yùn)算。
索引劃分多份即主分片和副本分片,副本的存在可使ES集群具備高可用性、擴(kuò)展搜索量和吞吐量。此次之外,ES會(huì)定時(shí)地把緩存數(shù)據(jù)刷新到硬盤,可達(dá)到數(shù)據(jù)持久化的效果,防止斷電時(shí)數(shù)據(jù)丟失。同時(shí)也可數(shù)據(jù)備份,防止出現(xiàn)數(shù)據(jù)損壞時(shí)無(wú)法恢復(fù)數(shù)據(jù)。
當(dāng)數(shù)據(jù)量過(guò)大,現(xiàn)有數(shù)據(jù)節(jié)點(diǎn)無(wú)法有效的管理索引時(shí),可動(dòng)態(tài)水平擴(kuò)展ES集群,新增到ES集群中的節(jié)點(diǎn)通過(guò)Zen Discovery發(fā)現(xiàn)模塊提供的單播和基于文件的發(fā)現(xiàn)功能加入到集群中。
為確保ES集群健康的運(yùn)行,應(yīng)實(shí)時(shí)對(duì)ES集群故障檢測(cè),設(shè)置兩個(gè)故障檢測(cè)進(jìn)程在集群的生命周期中一直運(yùn)行,一個(gè)是主節(jié)點(diǎn)ping集群中的所有其他節(jié)點(diǎn),檢查是否存活,另一種是每個(gè)節(jié)點(diǎn)都ping主節(jié)點(diǎn),確認(rèn)主節(jié)點(diǎn)是否仍在運(yùn)行或者是否需要重新選舉主節(jié)點(diǎn)。
在文本比對(duì)中,有甚者利用近義詞替換等手段降低文本相似度達(dá)到不利目的。如西紅柿和番茄是一組同義詞,如果文本中將西紅柿替換為番茄,同樣應(yīng)不能改變其被匹配的事實(shí)。
首先我們需要?jiǎng)?chuàng)建同義詞文件,并編輯同義詞,并通過(guò)文件管理器將同義詞文件上傳至系統(tǒng)中解析為文件流后待后面進(jìn)一步處理。
然后將文件保存至ES節(jié)點(diǎn)的特定文件夾下,在通過(guò)Java High REST API與ES集群相連,通過(guò)設(shè)置索引的Mapping結(jié)構(gòu)下的同義詞過(guò)濾器,使文檔在查詢時(shí)可基于同義詞字典進(jìn)行同義詞匹配,其流程如圖6所示。
圖6 近義詞匹配
現(xiàn)在網(wǎng)絡(luò)熱詞很多,每隔一段時(shí)間就會(huì)出現(xiàn)網(wǎng)紅熱詞;但是如果直接使用IK分詞,是識(shí)別不了這些詞的。如果文本中新的詞語(yǔ)被分詞不正確會(huì)給文本比對(duì)帶來(lái)影響,如新詞“網(wǎng)紅”,如果分詞器不能識(shí)別它則導(dǎo)致該詞語(yǔ)被分詞為“網(wǎng)”和“紅”二字。
通過(guò)自定義一種方法不斷優(yōu)化分詞庫(kù)、停用詞庫(kù),讓中文分詞器所依賴的庫(kù)更豐富,分詞更精確。通過(guò)研究設(shè)計(jì)兩種解決方案,配置遠(yuǎn)程詞典或者直接配置分詞庫(kù),但是這兩種方案都需要重啟ElasticSearch非常麻煩,且因?yàn)镋S是分布式的可能有數(shù)百個(gè)節(jié)點(diǎn),當(dāng)擴(kuò)展字典時(shí)不可能每次都一個(gè)一個(gè)節(jié)點(diǎn)上面去修改,所以最重要的工作是找到一種方案熱更新分詞庫(kù)而不需要重啟Elastic-Search。
該方案中通過(guò)修改IK分詞器源碼,然后手動(dòng)支持從Mysql中每隔一定時(shí)間,自動(dòng)加載新的詞庫(kù)。我們可通過(guò)提供修改Mysql數(shù)據(jù)庫(kù)中數(shù)據(jù)的方式來(lái)讓用戶根據(jù)需要上傳新詞字典來(lái)實(shí)時(shí)擴(kuò)展詞庫(kù)。在本文中利用爬蟲(chóng)得到的數(shù)據(jù)實(shí)時(shí)更新Mysql數(shù)據(jù)庫(kù)中的新詞項(xiàng)數(shù)據(jù),同時(shí)IK分詞器每隔一定時(shí)間將自動(dòng)加載數(shù)據(jù)到詞庫(kù)中,以擴(kuò)充詞庫(kù)的新詞量,在技術(shù)上面采用并發(fā)和定時(shí)任務(wù)等關(guān)鍵技術(shù)對(duì)爬蟲(chóng)提取到的結(jié)果進(jìn)行實(shí)時(shí)上傳到遠(yuǎn)程詞典。其操作流程如圖7所示。
圖7 熱更新詞庫(kù)
針對(duì)ElasticSearch的默認(rèn)相似度模型TF-IDF不能反映詞的位置信息的缺點(diǎn),自定義一種方案讓文本中的標(biāo)題、文本首句、文本尾句等位置的文本有更高的權(quán)重,而首先需要實(shí)現(xiàn)的是能自動(dòng)識(shí)別文檔中的標(biāo)題和段落首句和尾句,并在搜索的過(guò)程中給與較高的權(quán)重去匹配索引中的文檔庫(kù)。根據(jù)前文提到的“構(gòu)建文檔處理器”能解析出文章的多級(jí)標(biāo)題、主題、關(guān)鍵詞、句首、句尾等特殊位置文本,利用文檔處理器解析將處理的結(jié)果暫時(shí)存放在容器中,用自定義格式進(jìn)行包裝,以特定的權(quán)重查詢語(yǔ)法到ES集群中查詢,將標(biāo)題等特殊位置的文本賦予更高的權(quán)重,查詢結(jié)果中標(biāo)題被匹配的文檔比其他位置文本被匹配的文檔其得分更高。
使用分詞方法進(jìn)行相似度計(jì)算的方法有Levenshtein、余弦?jiàn)A角法、Jaccard系數(shù)方法,下面將三個(gè)方法和本文采用的基于ES實(shí)現(xiàn)文本相似度比對(duì)的方法進(jìn)行對(duì)比,如表1所示。
表1 相似度計(jì)算方法對(duì)比
基于ES搜索引擎的文本匹配方案,其作為一種新的實(shí)現(xiàn)文本相似度計(jì)算的新方向,從文本主題相似度識(shí)別、特殊位置文本權(quán)重調(diào)整、語(yǔ)義識(shí)別、新詞識(shí)別等方面的突破是一個(gè)重大的進(jìn)展。在現(xiàn)實(shí)生活中,信息載體中文本占據(jù)至關(guān)重要的地位,文本相似度計(jì)算作為信息處理領(lǐng)域的一個(gè)重要分支,在很多信息處理的具體應(yīng)用中起著重要的作用,是一個(gè)非?;A(chǔ)而關(guān)鍵的問(wèn)題。本文設(shè)計(jì)出一種提高文本比對(duì)精確度的方案,該方案通過(guò)分布式文檔管理,保證文檔的安全性;通過(guò)動(dòng)態(tài)調(diào)整特殊位置文本權(quán)重,從一定程度上可提高文本相似度;該方案考慮到日益新增的新詞和流行詞對(duì)分詞器的影響,增設(shè)了熱更新詞庫(kù)的功能;同時(shí)基于ES的搜索語(yǔ)法,根據(jù)上傳的近義詞文檔,動(dòng)態(tài)構(gòu)建Mapping,以實(shí)現(xiàn)文本的近義詞匹配。該方案實(shí)時(shí)處理文檔,能應(yīng)對(duì)高并發(fā)場(chǎng)景,切實(shí)保證程序響應(yīng)的速度,保證系統(tǒng)安全且穩(wěn)定。