1. 程式人生 > >OpenSearch自定義分詞服務

OpenSearch自定義分詞服務

背景

OpenSearch是一個以雲服務方式提供給廣大開發者使用的搜尋引擎平臺。在搜尋引擎中,分詞是最基礎但很重要的功能,其效果會直接影響文件的召回。分詞歧義會導致引擎無法召回目標文件。例如:

乒乓球拍賣完了 ==> 乒乓球/拍賣/完了
乒乓球拍      ==> 乒乓/球拍

在上面的case中,短語“乒乓球拍”不同的上下文中分詞的結果不一樣。假如文件的內容為“乒乓球拍賣完了”,使用者通過查詢詞“乒乓球拍”是無法召回該文件的。

OpenSearch的使用者來自各行各業,類似上述例子的場景會被不同的使用者遇到。分析線上query時,發現不少使用者由於分詞效果不理想,對同一個欄位用不同的分詞器建了多個索引(如單字分詞,模糊分詞,中文基礎分詞),查詢時同時查多個索引已達到召回文件的目的。這種做法不僅會消耗更多的系統資源,而且通常效果會不太好。

支援使用者對分詞幹預顯得尤為重要。OpenSearch內部是一個多租戶多應用共用的系統,因此,還需要確保應用間的干預是完全隔離的,不會互相影響。

基本思路

要對分詞結果的干預,第一直覺就是使用者可以定製分詞器。有一種做法就是使用者自己提供分詞器,系統整合使用者的分詞器,這種方式對系統或者使用者來說都太重了。系統需要對使用者的分詞器做稽核,不能影響系統的穩定性;同時使用者還需要理解分詞介面等細節。當然,使用者來可以自己分詞,並將分詞結果用於索引構建和查詢,這要求使用者自身有較強的技術,同時自身也會遇到需要干預的地方。

OpenSearch採用另一個方式:

  1. 系統提供通用中文分詞器,適用於絕大多數的場景;
  2. 提供面向特定行業領域的分詞器,如視訊分詞器、電商分詞器、人名分詞器等;通過這種方式可以優化一些特定領域的分詞效果,以儘量滿足使用者的需求;
  3. 開放分詞幹預的介面,讓使用者進一步對分詞結果進行定製化處理。使用者可以在系統提供的基礎分詞器,通過結合自己的干預詞條建立自定義分詞器,並將該分詞器應用在相應的索引欄位中,達到干預索引和查詢時的分詞結果,確保搜尋召回。

針對不同的場景,系統提供了兩種型別的干預詞條:語義實體和語義切分.

  1. 語義實體:主要用於一些系統尚未識別的實體詞,干預後,該詞的切分總是能保持一致,不受其所在的上下文影響。
  2. 語義切分:用於指定在特定上下文中,短語的切分方式,而不影響該短語在其他上下文中的切分方式。

系統流程

由使用者自定義分詞幹預的資料,需要系統對使用者的干預進行管理,包括:

  1. 對使用者:
    • 干預資料的推送
    • 干預資料的檢視
    • 干預資料的使用
  2. 對系統:
    • 干預資料合法性檢查,保證詞條幹預能正常生效
    • 干預資料量控制,這主要是對系統的保護;
    • 干預資料生效後,才能被使用者進行使用。如果使用者的干預資料沒有完全生效,就被用於索引的構建,會導致部分文件的分詞結果和預期干預的不一樣,出現無法被召回的情況。

整體流程圖如下所示:
自定義分詞幹預資料流轉圖.png

使用者詞典資料管理

圖中1至7為使用者詞典資料流,當用戶建立詞典時,系統會該詞典分配一個惟一的id,詞典資料會在ConfigServer內進行合法性檢查,在經過幾個模組和訊息佇列之後,會在BuildService那邊建好索引,索引資料被分詞服務載入起來,在分詞的時候進行使用。

在索引構建時,會將詞典資料構建兩種不同型別的索引:kv索引和倒排索引。

  1. kv索引是以使用者詞條的原詞做key,干預後的分詞做為value,用於分詞時使用。
  2. 對詞典id構建倒排索引,達到可以根據id獲得整個詞典的所有內容,方便使用者檢視詞典的詳情。

在圖中5.1時,詞典資料被寫到了DB。這是為了在有些情況下,需要使用者的干預資料進行索引重建,此時可以從資料庫獲得全量的干預資料。

干預生效

這裡包括兩個方面:

  1. 推送的干預資料生效判斷。由於整個資料流中,詞典資料流轉的地方都是嚴格按序處理的,因此在使用者的詞典資料最後增加一個哨兵doc,通過檢查這個哨兵doc的狀態,來判斷使用者的詞典資料有沒有全量生效;
  2. 干預資料在索引構建和查詢生效。
    • 在對文件進行索引構建時,當用戶使用了干預資料時,會將對應的欄位內容以及分詞器的配置傳給分詞服務,分詞服務返回分詞結果,BuildService根據該結果對文件建索引,供線上searcher載入提供查詢服務;
    • 查詢時,Agg收到查詢請求時,會將從ConfigServer獲取到的索引和分詞配置資訊,和使用者的查詢詞相關的資訊一起發給分詞服務,並用分詞服務返回的分詞結果查詢引擎。
    • 這樣就保證索引構建和查詢時分詞結果的一致性。

後續工作

  1. 為了保證查詢和索引構建時的分詞效果一致性,使用者對分詞詞典內容的修改,或者對自定義分詞器的修改,當前的產品邏輯上要求對使用者對索引進行重建。為了效果,犧牲了一定的易用性。後續會提供機制,讓使用者自己選擇是否需要索引重建。同時,支援在查詢支援指定分詞器。
  2. 上面的流程中,詞典資料的管理流程比較複雜。後續將通過遷移到OpenSearch統一的干預服務中去。
  3. 分詞器的迭代更新,建立合理有效的分詞器模型、系統和行業詞典內容的更新機制。

最後

OpenSearch的自定義分詞服務中使用的中文分詞器選擇用AliNLP_WS,這裡特別感謝iDST-NLP-自然語言基礎技術團隊的大力支援。

附錄




推薦與搜尋技術釘釘交流群

f03598ed8ca169220dd1549e6315cb9a48e3b142