1. 程式人生 > >3.4 針對中文檢索的問題

3.4 針對中文檢索的問題

合成詞 -h smart 人類 引擎 也有 信息 不同 應該

相對於英文檢索,中文檢索有兩個特別要考慮的問題:編碼問題和中文分詞問題。

一、編碼問題

1. 為了解決中文編碼問題,我們在網頁結構化信息預處理的時候統一采用utf-8編碼;

2. 在Lucene創建索引的時候,構造一個BufferedReader對象以utf-8編碼讀取文件,使用如下語句:

BufferedReader br = new BufferedReader(new InputStreamReader(stream, StandardCharsets.UTF_8));

二、中文分詞問題

1. 什麽是中文分詞?

中文分詞 (Chinese Word Segmentation) 指的是將一個漢字序列切分成一個一個單獨的詞。分詞就是將連續的字序列按照一定的規範重新組合成詞序列的過程。比如,“我愛計算機”可以分詞為“我/愛/計/算/機”,也可以分詞為“我/愛/計算機”.

2. 對於搜索引擎,中文分詞為什麽重要?

對於一個搜索引擎來說,中文分詞問題非常重要,體現在以下兩個方面:

  1. 建立索引時:Lucene對純文本文件進行中文分詞,分詞的結果是一個一個單獨的詞元,然後我們對每一個詞元(term)建立倒排索引,所以中文分詞是建立倒排索引的關鍵步驟,而分詞結果的好壞也直接影響著索引的性能;
  2. 處理用戶查詢時:通常來說,用戶輸入的查詢是一句話或一段話,這時,Lucene要對用戶輸入的查詢進行分詞處理,與建立索引的過程類似,用戶查詢會被切分成為一系列的詞元(term),檢索的過程實際是根據倒排索引對這一系列詞元查找其所在文檔(當然,最後要對文檔排序)。所以中文分詞對於處理用戶查詢也有著重要意義,分詞好壞直接影響是否能準確找到用戶想要的結果。

由此可見,中文分詞對於搜索引擎來說是至關重要的,中文分詞的好壞直接決定著索引的性能和檢索的準確率,直接影響著搜索引擎的用戶體驗。

3. 中文分詞難在哪裏?

我們知道,在英文的行文中,單詞之間是以空格作為自然分界符的;而中文只是字、句和段能通過明顯的分界符來簡單劃界,唯獨詞沒有一個形式上的分界符,比如“我喜歡獼猴桃”可以被分詞為“我/喜歡/獼猴桃”,也可以被分詞為“我/喜歡/獼猴/桃”,但顯然,前者更合理。由此可見,不同於英文分詞的以空格無腦劃分,中文分詞存在歧義,那麽中文分詞更需要技巧,應該盡可能地與人類的思維相一致,這就對中文分詞提出了很高的要求。

4. 如何解決中文分詞問題?

事實上,現在已經有很多優秀的開源中文分詞器比較好得解決了中文分詞問題。比如Lucene本身就自帶了SmartChineseAnalyzer分詞器來處理中文分詞問題,還有庖丁分詞器,結巴分詞器,IKAnalzer,盤古分詞,中科院分詞器等等,這些分詞器各有優劣,大家可以參考不同中文分詞器的比較。有了這些開源的成熟中文分詞器,我們就可以在項目中直接應用啦,再深入了解一些,我們可以重載這些分詞器,根據需求進行個性化定制,或許深入了解原理後,聰明的你也可以自己寫個分詞器哦~

在我們的項目簡體中文版兒童搜索引擎中,我們使用了IKAnalyzer分詞器,以後我們還會講述這個分詞器的具體使用~~

3.4 針對中文檢索的問題