MapReduce實現與自定義詞典檔案基於hanLP的中文分詞詳解
前言:
文字分類任務的第 1步,就是對語料進行分詞。在單機模式下,可以選擇python jieba分詞,使用起來較方便。但是如果希望在Hadoop叢集上透過mapreduce程式來進行分詞,則hanLP更加勝任。
一、使用介紹
hanLP是一個用java語言開發的分詞工具, 官網是 。 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:\ , 再執行一下,發現同樣是成功的。
具體到提交到叢集上執行,我們就不贅述了。這個方法雖然土一些,但至少是可用的。
文章轉載自 的部落格(有小幅改遍)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31524777/viewspace-2216347/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 分詞工具Hanlp基於感知機的中文分詞框架HanLP中文分詞框架
- Hanlp分詞之CRF中文詞法分析詳解HanLP分詞CRF詞法分析
- HanLP-實詞分詞器詳解HanLP分詞
- Hanlp配置自定義詞典遇到的問題與解決方法HanLP
- 基於 HanLP 的 ES 中文分詞外掛HanLP中文分詞
- pyhanlp 停用詞與使用者自定義詞典功能詳解HanLP
- HanLP分詞命名實體提取詳解HanLP分詞
- 基於hanlp的es分詞外掛HanLP分詞
- HanLP程式碼與詞典分離方案與流程HanLP
- 雙向最大匹配演算法——基於詞典規則的中文分詞(Java實現)演算法中文分詞Java
- HanLP中文分詞Lucene外掛HanLP中文分詞
- hanlp原始碼解析之中文分詞演算法詳解HanLP原始碼中文分詞演算法
- elasticsearch之ik分詞器和自定義詞庫實現Elasticsearch分詞
- HanLP分詞工具中的ViterbiSegment分詞流程HanLP分詞Viterbi
- 中文分詞工具之基於字標註法的分詞中文分詞
- python呼叫jieba(結巴)分詞 加入自定義詞典和去停用詞功能PythonJieba分詞
- HanLP二元核心詞典詳細解析HanLP
- Hanlp中使用純JAVA實現CRF分詞HanLPJavaCRF分詞
- 基於 RecyclerView 實現的歌詞滾動自定義控制元件View控制元件
- Hanlp在java中文分詞中的使用介紹HanLPJava中文分詞
- Ansj與hanlp分詞工具對比HanLP分詞
- 中文分詞演算法工具hanlp原始碼解析中文分詞演算法HanLP原始碼
- Elasticsearch整合HanLP分詞器ElasticsearchHanLP分詞
- ElasticSearch7.3學習(十五)----中文分詞器(IK Analyzer)及自定義詞庫Elasticsearch中文分詞
- es 自定義分詞外掛分詞
- 開源自然語言處理工具包hanlp中CRF分詞實現詳解自然語言處理HanLPCRF分詞
- [Python] 基於 jieba 的中文分詞總結PythonJieba中文分詞
- 使用PHP實現詞法分析與自定義語言PHP詞法分析
- java分詞工具hanlp介紹Java分詞HanLP
- Hanlp分詞例項:Java實現TFIDF演算法HanLP分詞Java演算法
- python 實現中文分詞統計Python中文分詞
- 使用cjieba(結巴分詞庫)實現php擴充套件中文分詞JiebaPHP套件中文分詞
- HanLP分類模組的分詞器介紹HanLP分詞
- 使用Docker快速安裝部署ES和Kibana並配置IK中文分詞器以及自定義分詞擴充詞庫Docker中文分詞
- day88-ElasticSearch-分詞- 自定義擴充套件詞庫Elasticsearch分詞套件
- pyhanlp 中文詞性標註與分詞簡介HanLP詞性標註分詞
- 簡單有效的多標準中文分詞詳解中文分詞
- hanlp中文智慧分詞自動識別文字提取例項HanLP分詞