天天看點

MapReduce實作與自定義詞典檔案基于hanLP的中文分詞詳解

前言:

文本分類任務的第1步,就是對語料進行分詞。在單機模式下,可以選擇python jieba分詞,使用起來較友善。但是如果希望在Hadoop叢集上通過mapreduce程式來進行分詞,則hanLP更加勝任。

一、使用介紹

hanLP是一個用java語言開發的分詞工具, 官網是 

http://hanlp.com/

 。 hanLP建立者提供了兩種使用方式,一種是portable簡化版本,内置了資料包以及詞典檔案,可通過maven來管理依賴,隻要在建立的 maven 工程中加入以下依賴,即可輕松使用(強烈建議大家優先采用這種方法)。

MapReduce實作與自定義詞典檔案基于hanLP的中文分詞詳解

具體操作方法如圖示,在pom.xml中,加入上述依賴資訊,筆者使用的IDEA編輯器就會自動開始解析依賴關系,并導入左下角的hanlp jar包。

MapReduce實作與自定義詞典檔案基于hanLP的中文分詞詳解

第二種方法需要自己下載下傳data資料檔案,并通過一個配置檔案hanlp.properties來管理各種依賴資訊,其中最重要的是要人為指定data目錄的家目錄。(不建議大家一上來就使用這種方法,因為真心繁瑣!)

二、 通過第一種方法,建立maven工程,編寫mapreduce完整程式如下(親測運作良好):
MapReduce實作與自定義詞典檔案基于hanLP的中文分詞詳解
MapReduce實作與自定義詞典檔案基于hanLP的中文分詞詳解
MapReduce實作與自定義詞典檔案基于hanLP的中文分詞詳解
MapReduce實作與自定義詞典檔案基于hanLP的中文分詞詳解
三、添加自定義詞典檔案 & 單機模式

有時候我們希望根據自己業務領域的一些專有詞彙進行分詞,而這些詞彙可能并不包含在官方jar包自帶的分詞詞典中,故而我們希望提供自己的詞典檔案。首先,我們定義一個測試的句子,并用系統預設的詞典進行分詞,可看到效果如下圖所示:

MapReduce實作與自定義詞典檔案基于hanLP的中文分詞詳解

假設在我們的專業領域中,“詞分”,“自試” 都是專業術語,那麼使用預設詞典就無法将這些目标詞分出來了。這時就要研究如何指定自定義的詞典,并在代碼中進行調用。這時有2種方法。

1. 在代碼中,通過CustomDictionary.add();來添加自己的詞彙,如下圖所示, 可以看到這次分詞的結果中,已經能将“詞分”,“自試” 單獨分出來了。

MapReduce實作與自定義詞典檔案基于hanLP的中文分詞詳解

假如說我們想添加的詞彙較多呢,通過上面的方法,一個一個 add, 未勉顯得不夠優雅,這時我們就希望通過一個詞典檔案的形式來添加自定義詞彙。在官方網站上,提供了如下一種方法。該方法要求我們單獨下載下傳一個data目錄,以及定義一個配置檔案。下面我們就來看下如何操作。

MapReduce實作與自定義詞典檔案基于hanLP的中文分詞詳解

首先,下載下傳好上面的hanlp.jar後,在java工程師導入該包。同時在src目錄下建立一個hanlp.properties配置檔案,内容直接複制官網上的内容,但是注意修改兩個地方。

MapReduce實作與自定義詞典檔案基于hanLP的中文分詞詳解

其中myDictionary.txt是我們自己建立的一個詞典檔案,其内容為:

MapReduce實作與自定義詞典檔案基于hanLP的中文分詞詳解

這時候,再運作方法1同樣的代碼,可看到如下結果中,也将“詞分”、“自試” 分了出來。

MapReduce實作與自定義詞典檔案基于hanLP的中文分詞詳解

注意,如果你不想顯示/n /nr這樣的記性,也可以将上述配置檔案中最後一行

ShowTermNature= true

修改為

false

注意,這時候,運作成功的話,會在詞典目錄下生成一個詞典緩存檔案

MapReduce實作與自定義詞典檔案基于hanLP的中文分詞詳解

圖13

四、自定義詞典檔案 & mapreduce送出

寫到這裡,想必細心的人已經想到了,當我們希望将編輯好的mapreduce程式打成jar包,送出到叢集上運作時,上面這種通過配置檔案指定data目錄的方法還可行嗎? 反正我是沒有搞定。理論上,要麼我們需要把data上傳到叢集上每個節點,要麼把data直接打到jar包中。但是,這兩種方法本人嘗試都沒有成功。最終,跟一位同僚互相讨論後,借鑒了對方的方法。即我們猜想,portable版本自帶了data資料,且不需要額外指定配置檔案。而我們現在想做的就是添加了一些自定義詞彙,那麼,是否我們将其中的詞典緩存檔案替換掉,就行了呢?動手試下才知道嘛。這次不通過maven來管理依賴,直接下載下傳portable版本的jar包,然後打開壓縮檔案,删除data\dictionary\custom目錄下的CustomDictionary.txt.bin檔案,然後将上一步運作成功的CustomDictionary.txt.bin粘貼進去! 将工程打成jar包,再通過指令行進入其所在目錄,執行java -jar  包名, 發現可以執行成功。然後,為了測試是否對這個絕對路徑有依賴,我們故意将該jar包剪切到 d:\ , 再執行一下,發現同樣是成功的。

MapReduce實作與自定義詞典檔案基于hanLP的中文分詞詳解

具體到送出到叢集上運作,我們就不贅述了。這個方法雖然土一些,但至少是可用的。

文章轉載自 a_step_further  的部落格(有小幅改遍)