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

adnb34g發表於2018-10-15

前言:

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

一、使用介紹

hanLP是一個用java語言開發的分詞工具, 官網是  http://hanlp.com/   hanLP建立者提供了兩種使用方式,一種是portable簡化版本,內建了資料包以及詞典檔案,可通過maven來管理依賴,只要在建立的 maven 工程中加入以下依賴,即可輕鬆使用(強烈建議大家優先採用這種方法)。

 

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

 

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

二、 通過第一種方法,建立 maven 工程,編寫 mapreduce 完整程式如下(親測執行良好):

 

三、新增自定義詞典檔案 & 單機模式

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

 

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

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

 

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

 

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

 

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

 

這時候,再執行方法 1 同樣的程式碼,可看到如下結果中,也將 詞分 自試 分了出來。

 

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

ShowTermNature= true

修改為

ShowTermNature= false

注意,這時候,執行成功的話,會在詞典目錄下生成一個詞典快取檔案

 

四、自定義詞典檔案 & 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:\ , 再執行一下,發現同樣是成功的。

具體到提交到叢集上執行,我們就不贅述了。這個方法雖然土一些,但至少是可用的。

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

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31524777/viewspace-2216347/,如需轉載,請註明出處,否則將追究法律責任。

相關文章