文本分類任務的第1步,就是對語料進行分詞。在單機模式下,能夠選擇python jieba分詞,使用起來較方便。可是若是但願在Hadoop集羣上經過mapreduce程序來進行分詞,則hanLP更加勝任。java
1、使用介紹python
hanLP是一個用java語言開發的分詞工具, 官網是 http://hanlp.com/ 。 hanLP建立者提供了兩種使用方式,一種是portable簡化版本,內置了數據包以及詞典文件,可經過maven來管理依賴,只要在建立的 maven 工程中加入如下依賴,便可輕鬆使用(強烈建議你們優先採用這種方法)。緩存
具體操做方法如圖示,在pom.xml中,加入上述依賴信息,筆者使用的IDEA編輯器就會自動開始解析依賴關係,並導入左下角的hanlp jar包。maven
第二種方法須要本身下載data數據文件,並經過一個配置文件hanlp.properties來管理各類依賴信息,其中最重要的是要人爲指定data目錄的家目錄。(不建議你們一上來就使用這種方法,由於真心繁瑣!)編輯器
2、經過第一種方法,創建maven工程,編寫mapreduce完整程序以下(親測運行良好):工具
3、添加自定義詞典文件 & 單機模式oop
有時候咱們但願根據本身業務領域的一些專有詞彙進行分詞,而這些詞彙可能並不包含在官方jar包自帶的分詞詞典中,故而咱們但願提供本身的詞典文件。首先,咱們定義一個測試的句子,並用系統默認的詞典進行分詞,可看到效果以下圖所示:測試
假設在咱們的專業領域中,「詞分」,「自試」 都是專業術語,那麼使用默認詞典就沒法將這些目標詞分出來了。這時就要研究如何指定自定義的詞典,並在代碼中進行調用。這時有2種方法。網站
1. 在代碼中,經過CustomDictionary.add();來添加本身的詞彙,以下圖所示, 能夠看到此次分詞的結果中,已經能將「詞分」,「自試」 單獨分出來了。spa
假如說咱們想添加的詞彙較多呢,經過上面的方法,一個一個 add, 未勉顯得不夠優雅,這時咱們就但願經過一個詞典文件的形式來添加自定義詞彙。在官方網站上,提供了以下一種方法。該方法要求咱們單獨下載一個data目錄,以及定義一個配置文件。下面咱們就來看下如何操做。
首先,下載好上面的hanlp.jar後,在java工程師導入該包。同時在src目錄下建立一個hanlp.properties配置文件,內容直接複製官網上的內容,可是注意修改兩個地方。
其中myDictionary.txt是咱們本身建立的一個詞典文件,其內容爲:
這時候,再運行方法1一樣的代碼,可看到以下結果中,也將「詞分」、「自試」 分了出來。
注意,若是你不想顯示/n /nr這樣的記性,也能夠將上述配置文件中最後一行
ShowTermNature=true
修改成
ShowTermNature=false
注意,這時候,運行成功的話,會在詞典目錄下生成一個詞典緩存文件
4、自定義詞典文件 & 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 的博客(有小幅改遍)