實作Word斷器和字幹分析器
Microsoft 提供許多語言的斷詞工具和字幹分析器。 本主題描述如何實作及針對語言使用自訂斷詞工具和字幹分析器,以及 Microsoft 所提供的地區設定。
注意
暫時不支援自訂斷詞工具。 在 2018 年 7 月,已對 Windows Server 2019 進行變更,以防止SearchIndexer.exe載入沒有 Microsoft 簽章的 DLL。 這項限制已在 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
Word斷器實作IWordBreaker。 IWordBreaker::BreakText方法會執行所有文字處理和剖析。 若要實作斷詞工具元件,您必須擁有語言的語言啟發學習法。 這包括語法和型別的相關資訊。 您可能也需要一份字詞清單來排除或包含。 您可以從排除的單字清單中,為語言地區設定建置非搜尋字組的檔案。 如需語言考慮以及這些考慮如何影響斷詞工具實作的詳細資訊,請參閱 語言和 Unicode 考慮。
IWordBreaker::BreakText的主要目的是要從TEXT_SOURCE持續處理文字,直到處理所有文字,或直到斷詞工具遇到錯誤為止。 在這個資料處理迴圈中, IWordBreaker::BreakText 會呼叫剖析和公用程式方法,以執行該程式的特定工作。 例如,德文斷詞工具可以處理複合字,而法文斷詞工具可能會處理 變音符號 或 clitics。 斷詞工具執行的特定函式及其用來執行這些工作的策略,完全取決於該語言的需求。
中斷文字時,斷詞工具會識別可能有多個標記法之單字的「替代」形式。 產生的單字之間沒有隱含語意關聯性。 事實上,原始單字可能不會包含在替代專案清單中。 替代表單會儲存在索引中與原始單字相同的位置,以指出它們相同。
當檔包含在索引中時,每個字都會被指派一個代表位移的整數值,或從檔開頭算起的單字距離。 查詢中單字之間的相對距離會與儲存在全文檢索索引中的位移進行比較。 查詢 「Where is Kyle's document」 會比對任何位移為 「Where」 的檔、n+1 的 「is」 、n+2 的 「Kyle's」 和 n+3 的任何檔。 「在資料基底中,Kyle 的檔在哪裡?」 表示為:
Where | 是 | Kyle Kyle 的 |
文件 | 提交 | in | the | 資料庫資料基底 |
在此範例中,斷詞工具會將 「Kyle」 (「Kyle's」 ) 和 「database」 (「data base」 ) 的替代表單儲存在索引中。 斷詞工具會在索引建立程式期間,在下列情況下產生並儲存替代字組:
- 如果替代字可能顯示為查詢中的單一單字
- 如果字幹分析器不太可能從替代專案衍生原始字組
產生替代單字表單會增加查詢代表及比對句子的方式數目,如下列變化所示:
- 其中 是資料庫中的 Kyle 檔
- 其中 是 Kyle 在資料庫中所記載的檔
- 其中 是資料基底中的 Kyle 檔
- 其中 是 Kyle 在資料基底中提交的檔
WordSink 和 PhraseSink
Word斷器會使用IWordSink和IPhraseSink物件來收集和儲存它們從文字擷取的所有單字和片語。 斷詞工具會將單字儲存在盡可能接近檔中原始單字表單的表單中。 IPhraseSink 會在查詢時儲存片語。 片語可改善查詢結果的相關性,因為較長的字組序列較罕見,而且提供比較小的片語更高的區別。 當索引子在查詢時將片語放在 IPhraseSink 中時,它會建立斷詞工具的實例,將片語分成單字。 接著,索引子會檢查片語中的單字是否與索引中的字組相鄰,以評估片語。 例如,如果 「ABCD」 發生在位於 x、 x+1、 x+2 和 x+3 位置的索引中,如果在查詢中提交 「ABCD」 的任何相鄰子字串,就會發生片語比對。 此策略適用于字元型斷詞工具,在索引建立期間分割片語和長字,以及在查詢期間產生片語。
分隔設定
分隔符號是單字之間的空格。 空白字元、標點符號、格式設定或只是語言本身的本質可能會造成中斷。 索引子使用四種不同的中斷點類型:EOW (EOW) 結尾、句子結尾 (EOS) 、段落結尾 (EOP) 和 (EOC) 章節結尾。 EOW 中斷是預設中斷。 在每個標記之後,每個中斷都會指出任一端單字之間的不同語意距離。 以 EOW 分隔的字組具有最緊密的語意連結,後面接著 EOS、EOP 和 EOC。 對 IWordSink::P utBreak的多個呼叫都是累計的,類似于插入 Null 單字或句子。
延展性、效能和安全性
斷詞工具回應同時呼叫的方式,主要取決於您選擇的執行緒模型。 索引子是單一執行緒的應用程式。 若要讓斷詞工具在單一執行緒環境中運作,斷詞工具必須使用「免費」或「兩者」執行緒模型來撰寫。 Word斷器不得使用 「Apartment」 執行緒模型向 COM 註冊。
我們建議斷詞工具避免全域狀態,並將資料儲存在斷詞工具的 實例中。 應該儲存在斷詞工具實作中的唯一內容是 fQuery 和 ulMaxTokenSize參數。 Word斷詞工具應該比英文斷詞工具所建立的基準測試還慢兩倍。 Word斷器效能也應該隨著硬體功能增加而改善。
Word索引子的斷器是在本機系統安全性內容中執行。 它們應該寫入以管理緩衝區及正確堆疊。 所有字串複本都必須有明確的檢查,才能防範緩衝區滿溢。 您應該一律確認緩衝區的配置大小,並針對緩衝區的大小測試資料大小。 Word斷符無法假設傳遞至IWordBreaker::BreakText方法的文字格式正確。 如需疑難排解斷詞工具的詳細資訊,請參閱 針對語言資源和最佳做法進行疑難排解。
實作字幹分析器
字幹分析器會實作 IStemmer 介面。 IStemmer::GenerateWordForms方法會產生特定輸入字組的轉換文字表單清單。 若要實作字幹分析器元件,您必須具有語言啟發學習法。 這包括型態的相關資訊。 您可能也需要一份字詞清單,才能排除或包含。 如需語言考慮和這些考慮如何影響字幹分析器實作的詳細資訊,請參閱 語言和 Unicode 考慮。
我們建議字幹分析器不應該產生單字的 Genitive 或擁有性。 例如,「David」 不會產生為 「David's」 的替代形式。斷詞工具會在剖析 「David' s」 時產生 「David」 和 「David's」。
字幹分析器會使用 IWordFormSink 物件來收集替代字組的清單。 IWordFormSink::P utWord 會產生字幹分析器的最後一個字。 在所有情況下,這個最後一個字與 IStemmer::GenerateWordForms中的輸入字相同。 例如,假設「泳道」一詞,字幹分析器會產生下列文字形式:「擷取」、「泳道」、「泳道」、「swam」 和 「swum」,透過對 IWordFormSink::P utAltWord的呼叫。 字幹分析器會透過 IWordFormSink::P utWord產生「泳道」。
延展性、效能和安全性
詞幹分析器,例如斷詞工具,必須使用「免費」執行緒模型,並使用其執行緒模型設定為「免費」或「兩者」向 COM 註冊。Windows 搜尋服務會同時呼叫不同執行緒的個別字幹分析器實例。 因此,字幹分析器應該具有最少的實例資料。
字幹分析器精確度對查詢相關性有顯著的影響。 如果字幹分析器文字不正確,查詢可能會傳回無法預測且不正確的結果。 字幹分析器每秒必須處理數百個查詢,而不會對查詢效能造成負面影響。 字幹分析器效能應該隨著硬體功能增加而改善。 如需針對字幹分析器進行疑難排解的詳細資訊,請參閱 針對語言資源和最佳做法進行疑難排解。
Windows 搜尋的字幹分析器會在本機安全性內容中執行。 它們應該寫入以管理緩衝區,並正確堆疊。 所有字串複本都必須有明確的檢查,才能防範緩衝區溢位。 您應該一律確認緩衝區的配置大小,並針對緩衝區的大小測試資料大小。
相關主題