共用方式為


實作斷詞工具與字幹分析器

Microsoft提供針對多種語言的斷詞工具和字幹分析工具。 本主題說明如何實作及使用自訂斷詞工具和字幹分析器,適用於超出 Microsoft 提供範圍的語言和地區設定。

注意

暫時不支援自定義斷詞工具。 在 2018 年 7 月,已對 Windows Server 2019 進行變更,以防止沒有Microsoft簽章的 DLL 被 SearchIndexer.exe載入。 這項限制於 2021 年 1 月解除。

本主題的組織方式如下:

註冊語言資源 DLL

每個語言資源 DLL 都必須實作並導出下列進入點。 DLL 可以註冊到任何資料夾中。

  • DllMain 是 DLL 的標準進入點。
  • DllRegisterServer 會在登錄中註冊 DLL,例如 regsvr32.exe %SystemRoot%\MyFolder\wordbreaker.dll
  • DllCanUnloadNow 可讓用戶端透過元件物件模型 (COM) 呼叫此進入點,以判斷是否可以卸除語言資源 DLL。
  • DllUnRegisterServer 會從登錄中移除 DLL。

註冊語言

登錄包含針對被編製索引語言的語言特定項目,這些項目會控制與語言相關的索引和查詢過程的部分。 您可在下列註冊表機碼下找到這些註冊表項目。

HKEY_LOCAL_MACHINE
   SYSTEM
      CurrentControlSet
         ContentIndex
            Control
               Language
                  

實作 Word Beaker 工具 (或軟件)

斷詞工具會實作 IWordBreaker IWordBreaker::BreakText 方法會執行所有文字處理和剖析。 若要實作斷詞元件,您必須具備語言啟發法則。 這包括語法和形態學的相關信息。 您可能也需要字詞清單來排除或包含。 您從排除字清單中建立語言地區的噪音詞檔案。 如需有關語言因素及這些因素如何影響斷詞工具的實作方法的詳細資訊,請參閱 語言和 Unicode 因素

IWordBreaker::BreakText 的主要目的是從 TEXT_SOURCE 連續處理文字,直到所有文字處理完畢或斷詞工具遇到錯誤為止。 在這個數據處理迴圈中,IWordBreaker::BreakText 呼叫剖析和公用程式方法,以執行該程式的特定工作。 例如,德文斷詞工具可以處理複合字,而法文斷詞工具可能會處理 變音符號黏著詞素。 斷詞工具執行的特定函式,以及執行這些工作時所使用的策略,完全取決於該語言的需求。

中斷文字時,斷字程式會識別可能有多種表示形式的文字的「替代」形式。 產生的單字之間沒有隱含語意關聯性。 事實上,原始單字可能不會包含在替代項目清單中。 替代形式會儲存在索引中與原始單字相同的位置,以表示它們是相同的。

當文件被納入索引時,每個單字都會被指派一個整數值,這個值代表偏移量,或該單字與文件開頭的距離。 查詢中單字之間的相對距離會與儲存在全文檢索索引中的位移進行比較。 查詢 "Where is Kyle's document" 會匹配任何文件,其中 "Where" 位於 n 偏移量,"is" 位於 n+1 偏移量,"Kyle's" 位於 n+2 偏移量,而 "document" 位於 n+3 偏移量。 “凱爾在數據基底中提交的文件在哪裡?

               
哪裡 凱爾的商店
文件 歸檔 資料庫數據基底

 

在此範例中,斷詞工具會將「Kyle」(「Kyle's」)和「database」(「data base」)的替代表單儲存在索引中。 斷詞工具會在索引建立程式期間產生並儲存替代字組,條件如下:

  • 如果替代字可能會顯示為查詢中的單一單字
  • 如果詞幹提取器不太可能從替代詞還原原始詞

產生替代詞形會增加查詢表示和匹配句子的方式,如下列變化所示:

  1. Kyle的文件在資料庫中的哪裡提交
  2. 凱爾的文件在資料庫中是在哪裡存檔的?
  3. Kyle 檔案存放在資料庫中的哪裡?
  4. 凱爾的檔案在資料庫中的哪裡存放

WordSink 和 PhraseSink

斷詞工具會使用 IWordSinkIPhraseSink 物件來收集及儲存它們從文字擷取的所有字詞和詞組。 斷詞工具會將單字儲存成盡可能接近檔案中原始字詞形式的方式。 IPhraseSink 在查詢時儲存片語。 片語可改善查詢結果的相關性,因為較長的字詞序列比較罕見,並且比短小的片語提供更大的區別。 當索引器在查詢時將片語放在 IPhraseSink 時,它會建立斷詞工具的實例,將詞組分成單字。 接著,索引器會藉由檢查片語中的單字是否與索引中的字組相鄰,來評估片語。 例如,如果 「ABCD」 在索引中的位置是 xx+1、x+2 和 x+3,則如果查詢中送出“ABCD”的任何相鄰子字元串,就會發生詞組比對。 此策略適用於在索引建立期間分割片組和長字的字元型斷詞工具,以及在查詢期間產生片語。

休息

分隔符是單字之間的空格。 空格符、標點符號、格式設定或只是語言本身的性質可能會造成中斷。 索引器使用的斷點有四種不同的類型:字尾(EOW)、句子結尾(EOS)、段落結尾(EOP)和章節結尾(EOC)。 EOW 中斷是預設中斷。 每個標記之後,每個間隔都會指出兩端單字之間的不同語意距離。 以 EOW 分隔的文字具有最緊密的語意連結,後面接著 EOS、EOP 和 EOC。 IWordSink::PutBreak 的多次呼叫是累積的,而且類似於插入空單字或句子。

延展性、效能和安全性

斷詞工具回應同時呼叫的方式主要取決於您選擇的線程模型。 索引器是單個線程應用程式。 若要讓斷詞工具在單執行緒環境中運作,斷詞工具必須以「不限制」或「兩者皆可」的執行緒模型來撰寫。 斷詞工具不得使用「Apartment」線程模型向 COM 註冊。

我們建議斷詞工具避免全域狀態,並將數據儲存在斷詞工具的 實例中。 唯一應存放在斷詞工具實作中的內容是參數 fQueryulMaxTokenSize。 斷詞工具的速度不應該比英文斷詞工具所建立的基準慢超過兩倍。 斷詞工具效能也應該隨著硬體功能增加而改善。

索引器的斷詞工具會在本機系統的安全性環境中執行。 它們應該設計來管理緩衝區,並確保堆疊正確。 所有字串複製操作必須進行明確的檢查,以防止緩衝區溢出。 您應該一律確認緩衝區的配置大小,並針對緩衝區的大小測試數據大小。 斷詞工具無法假設傳遞至 IWordBreaker::BreakText 方法的文字格式良好。 如需有關斷詞器疑難解答的詳細資訊,請參閱 語言資源和最佳做法疑難解答

實作字幹分析器

字幹分析器會實作 IStemmer 介面。 IStemmer::GenerateWordForms 方法會為特定輸入字產生屈折詞形清單。 若要實作字幹分析器元件,您必須有您的語言的語言啟發式。 這包括形態學的相關信息。 您可能也需要字詞清單來排除或包含。 如需語言學考量及這些考量如何影響字幹分析器的實作方法的詳細資訊,請參閱 語言學及 Unicode 的考量

我們建議詞幹分析器不應該生成單字的所有格形式。 例如,「David」不會作為「David's」的替代形式產生。斷詞工具在剖析「David's」時會產生「David」和「David's」。

字幹分析器會使用 IWordFormSink 物件來收集替代字詞的清單。 IWordFormSink::PutWord 會從語幹分析器產生最後一個字。 在所有情況下,這個最後一個字與來自 IStemmer::GenerateWordForms 的輸入字相同。 例如,假設“游泳”一詞,字幹分析器會產生下列字組形式:“游泳中”、“游泳者”、“游泳”、“游去”和“游過”,透過呼叫 IWordFormSink::PutAltWord。 字幹分析器會透過 IWordFormSink::PutWord產生「swim」。

延展性、效能和安全性

詞幹分析器,例如斷詞工具,必須使用「自由」的執行緒模型,並將其所使用的執行緒模型設定為「自由」或「兩者」來向 COM 註冊。Windows 搜尋會同時從不同的執行緒呼叫各自的詞幹分析器實例。 因此,字幹分析器應該具有最少的實例數據。

字幹分析器精確度對查詢相關性有重大影響。 如果詞幹提取器將文字詞幹化不正確,查詢可能會返回無法預測且不準確的結果。 字幹分析器每秒必須處理數百個查詢,而不會對查詢效能造成負面影響。 詞幹分析器效能應隨著硬體功能增加而改善。 如需有關詞幹分析器疑難解答的資訊,請參閱 語言資源和最佳做法的疑難解答

Windows 搜尋的字幹分析器會在本機安全性環境中執行。 它們應該被編寫設計,以管理緩衝區並正確地堆疊。 所有字串複本都必須有明確的檢查,才能防止緩衝區溢出。 您應該一律確認緩衝區的配置大小,並針對緩衝區的大小測試數據大小。

擴充語言資源

瞭解語言資源元件

語言與 Unicode 的考量

語言資源和最佳做法 疑難解答