馬智勤 廖雪花 鄧 威 肖文超
(1.四川師范大學計算機科學學院 成都 610001)(2.四川師范大學物理與電子工程學院 成都 610001)
隨著信息時代的到來,信息技術也隨之迅速發展,文本數據作為最重要的信息載體在信息技術的發展中起到至關重要的作用,同時文本相似度計算作為信息處理領域的一個重要分支,在很多信息處理應用中起著至關重要的作用,其中相似內容比對作為文本信息處理領域的一項關鍵性技術,廣泛應用于智能問答、論文查重、內容檢索、自然語言處理等多種信息任務的研究處理中[1]。近年來,文本相似度在推薦系統、信息推送、智能問答等熱門領域中備受關注,引起了極大的研究[2]。
目前,文本相似度計算主要分為三類,第一類是基于語料庫,如利用詞向量基于詞袋模型計算相似度的VSM等[3];第二類是基于字符串的計算方法,如余弦相似度計算算法[4];第三類是基于神經網絡的深度學習方法,如基于語義深度學習的匹配模型DSSM[5]。
在現有的大多數文本比對算法中考慮單一文本特性進行相似度計算。石彩霞等[6]提出多重檢驗加權的短文本相似度計算方法;鄭志蘊等[7]提出了基于短文本相似度計算的知識子圖融合方法;吳浩等[8]提出了融合性特征的中文句子相似度計算方法;鄧涵等[9]從句子結構角度對句法和依存關系進行分析計算;盧佳偉等[10]提出融合TextRank算法的中文短文本相似度計算;均未考慮到日益新增的網絡新詞和流行詞對詞項識別帶來的影響,同時段落替換,詞序替換對文本比對的影響未有效解決。
在本文中提出一種基于ElasticSearch相似內容比對的改進方案,在基于ElasticSearch搜索引擎自身的TF-IDF向量空間模型算法的基礎上通過一套優化方案實現文本相似度計算。該套優化方案主要通過配置遠程詞典、熱更新詞庫和修改文本比對模型等途徑實現,突破了詞序替換、語義替換、新詞出現等不能匹配的限制。同時,提出一種動態調整文本權重的思想,通過調整特殊位置的文本權重,在一定程度上提高文本比對精確度。
從穩定性方面考慮,大規律地高并發訪問服務和頻繁查詢和管理文檔對網絡帶寬和硬件配置有極高的要求,且對服務健康質量也提出較高要求,目前一般網絡環境不能保證以上情況,一旦服務負載過重而宕機導致整個服務平臺癱瘓不可用,同時文檔庫由高可用低延遲的ES集群管理,實現松散耦合的文檔分布式管理。
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 集群選主流程圖
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文檔處理器剝離出文本特殊位置的文本,比如標題、句首、句尾、關鍵詞等,對剝離出來的文本進行適當的加權操作,從一定程度上可提高文本主題匹配的精確度。
為解決現有的大多數文本比對方法中存在的問題,如只考慮單一文本特性進行相似度計算、未考慮到日益新增的網絡新詞和流行詞對詞項識別帶來的影響、段落替換,詞序替換對文本比對的影響。本文研究了一種基于ElasticSearch相似內容比對的算法,通過配置遠程詞典將日益新增的詞語新增到詞庫中以實現對新詞的識別,同時通過熱更新詞庫和修改文本比對模型等途徑,實現了語義匹配、近義詞匹配、段落替換匹配的效果,進而實現了提高文本比對精確度的目的。方案流程如圖3所示。

圖3 方案流程圖
通過圖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的文本比對的可用性。
相比傳統的文本比對算法,本文提出的基于ElasticSearch文本比對優化方案有以下優勢:
1)分布式文檔存儲管理
多個節點由不同計算機組長,共同構成一個集群,該集群即為ElasticSearch集群,該集群負責文檔的管理,包括文檔的創建、修改、刪除和查詢。在該集群中多節點共同參與文檔的搜索,提高文檔查詢速度。基于分片備份的功能,可實現文檔的安全存儲,且集群對應的可視化平臺可實時監控集群的健康狀態,具備數據恢復功能。
2)調整特殊位置文本權重
鑒于標題、段落首末句等特殊位置的文本具有統領文章宗旨的作用,本文將對這些位置的文本進行提取并處理,使其在文本匹配過程中相較于其他文本占有更高的權重。
3)實時更新詞庫
用戶可根據需要上傳詞項文件、管理詞庫,基于ElasticSearch實時性特點,更新的詞庫可實時作用于文檔匹配過程。
4)實現近義詞匹配
使用Java API根據實時上傳的特定格式的近義詞文檔,動態創建Mapping以實現近義詞匹配。
5)高可用、低延遲應用
該方案基于ElasticSearch集群進行設計并構建。ES集群通過限流保護服務免受血崩之災,通過隔離實現故障隔離,通過設置合理的超時與重試機制避免請求堆積造成雪崩,通過回滾機制快速修改錯誤版本;通過上述原則來保護系統,使得系統高可用。因此該應用具備容錯、可用性高、低延遲的特點。
隨著社會的發展,隨時會出現新的詞語,而新的詞語對文本識別帶來的影響不可忽視。在某些文本比對場景將段落替換、詞序替換、語義替換可達到大大降低文本相似度的目的,足以可見段落替換、語義替換等對文本相似度比對的影響。往往在不同位置的文本所代表的意義是不同的,一般標題所含的信息量更大,將標題、首尾句文本被賦予較高的文本比對權重能一定程度解決這類問題帶來的影響,而很多文本比對技術并未處理這一問題。
ElasticSearch默認不支持對中文分詞,通過配置IKAnanlyzer可使ES支持對中文進行分詞。針對一些特殊的新詞在分詞的時候是不能夠被識別的,我們可通過擴展IKAnanlyzer的自定義詞庫等方式使日益新增的詞語被識別,有效提高文本比對精確度。下文將詳細地介紹構建文檔處理器、文檔分布式存儲管理技術、近義詞匹配、熱更新詞庫、動態調整文本權重算法等內容。
在對文檔與文檔庫中的所有文檔進行相似度比對之前,利用Apache POI開放源碼函式庫對文檔做特定處理,POI提供Java API對Microsoft Office格式檔案讀和寫的功能,以及讀取多級標題等豐富的功能,本文中我們將按照文檔的不同結構做相應處理。
后文中將提到文檔中特殊文本的權重調整,此處提及到的文檔處理器將讀取標題等特殊位置的文本放入特定容器中,用于后面賦予較高權重,因為標題等文本具有統領全文的意義,如果標題一致說明文檔間主題契合,更大意義上表達了標題、句首句末等特殊文本的重要性。
該處理器具體工作如圖4所示,將上傳的文檔轉為文件流,并使用POI處理器讀取文檔中的具有特殊意義的文本,將其以特定格式存儲在文檔臨時容器中供后面使用,對于特殊意義的文本的識別方式有相應規則。最終將文檔內容存儲在ES集群中,供后面文本比對階段使用。

圖4 文件處理并存儲
在生產環境下需修改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主節點,確認主節點是否仍在運行或者是否需要重新選舉主節點。
在文本比對中,有甚者利用近義詞替換等手段降低文本相似度達到不利目的。如西紅柿和番茄是一組同義詞,如果文本中將西紅柿替換為番茄,同樣應不能改變其被匹配的事實。
首先我們需要創建同義詞文件,并編輯同義詞,并通過文件管理器將同義詞文件上傳至系統中解析為文件流后待后面進一步處理。
然后將文件保存至ES節點的特定文件夾下,在通過Java High REST API與ES集群相連,通過設置索引的Mapping結構下的同義詞過濾器,使文檔在查詢時可基于同義詞字典進行同義詞匹配,其流程如圖6所示。

圖6 近義詞匹配
現在網絡熱詞很多,每隔一段時間就會出現網紅熱詞;但是如果直接使用IK分詞,是識別不了這些詞的。如果文本中新的詞語被分詞不正確會給文本比對帶來影響,如新詞“網紅”,如果分詞器不能識別它則導致該詞語被分詞為“網”和“紅”二字。
通過自定義一種方法不斷優化分詞庫、停用詞庫,讓中文分詞器所依賴的庫更豐富,分詞更精確。通過研究設計兩種解決方案,配置遠程詞典或者直接配置分詞庫,但是這兩種方案都需要重啟ElasticSearch非常麻煩,且因為ES是分布式的可能有數百個節點,當擴展字典時不可能每次都一個一個節點上面去修改,所以最重要的工作是找到一種方案熱更新分詞庫而不需要重啟Elastic-Search。
該方案中通過修改IK分詞器源碼,然后手動支持從Mysql中每隔一定時間,自動加載新的詞庫。我們可通過提供修改Mysql數據庫中數據的方式來讓用戶根據需要上傳新詞字典來實時擴展詞庫。在本文中利用爬蟲得到的數據實時更新Mysql數據庫中的新詞項數據,同時IK分詞器每隔一定時間將自動加載數據到詞庫中,以擴充詞庫的新詞量,在技術上面采用并發和定時任務等關鍵技術對爬蟲提取到的結果進行實時上傳到遠程詞典。其操作流程如圖7所示。

圖7 熱更新詞庫
針對ElasticSearch的默認相似度模型TF-IDF不能反映詞的位置信息的缺點,自定義一種方案讓文本中的標題、文本首句、文本尾句等位置的文本有更高的權重,而首先需要實現的是能自動識別文檔中的標題和段落首句和尾句,并在搜索的過程中給與較高的權重去匹配索引中的文檔庫。根據前文提到的“構建文檔處理器”能解析出文章的多級標題、主題、關鍵詞、句首、句尾等特殊位置文本,利用文檔處理器解析將處理的結果暫時存放在容器中,用自定義格式進行包裝,以特定的權重查詢語法到ES集群中查詢,將標題等特殊位置的文本賦予更高的權重,查詢結果中標題被匹配的文檔比其他位置文本被匹配的文檔其得分更高。
使用分詞方法進行相似度計算的方法有Levenshtein、余弦夾角法、Jaccard系數方法,下面將三個方法和本文采用的基于ES實現文本相似度比對的方法進行對比,如表1所示。

表1 相似度計算方法對比
基于ES搜索引擎的文本匹配方案,其作為一種新的實現文本相似度計算的新方向,從文本主題相似度識別、特殊位置文本權重調整、語義識別、新詞識別等方面的突破是一個重大的進展。在現實生活中,信息載體中文本占據至關重要的地位,文本相似度計算作為信息處理領域的一個重要分支,在很多信息處理的具體應用中起著重要的作用,是一個非常基礎而關鍵的問題。本文設計出一種提高文本比對精確度的方案,該方案通過分布式文檔管理,保證文檔的安全性;通過動態調整特殊位置文本權重,從一定程度上可提高文本相似度;該方案考慮到日益新增的新詞和流行詞對分詞器的影響,增設了熱更新詞庫的功能;同時基于ES的搜索語法,根據上傳的近義詞文檔,動態構建Mapping,以實現文本的近義詞匹配。該方案實時處理文檔,能應對高并發場景,切實保證程序響應的速度,保證系統安全且穩定。