HanLP程式碼與詞典分離方案與流程
之前在 spark 環境中一直用的是 portable 版本,詞條數量不是很夠,且有心想把 jieba,swcs 詞典加進來,
其他像 ik,ansi-seg 等分詞詞典由於沒有詞性並沒有加進來 . 本次修改主要是採用 jar 包方包將詞典目錄
data 與 hanlp.properties 合成一個 data.jar 檔案 .
1. pom.xml 過濾資原始檔的配置
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>${maven-jar-plugin.version}</version>
<configuration>
<excludes>
<exclude>**/*.properties</exclude>
</excludes>
</configuration>
</plugin>
這裡把 properties 檔案從 jar 包檔案中去掉 , 因而結果檔案是沒有 properties 檔案的 .
可根據需要來確定是否把 properties 加入 jar 包中 . 由於我打算把 hanlp.properties 與詞典目錄寫在一起
這裡是要過濾掉 hanlp.properties 檔案
2. 修改 hanlp.properties 檔案
root=
# 將根目錄置為空,或者註釋掉 root
CustomDictionaryPath=data/dictionary/custom/CustomDictionary.txt; scws.txt; jieba.txt; 現代漢語補充詞庫 .txt; 全國地名大全 .txt ns; 人名詞典 .txt; 機構名詞典 .txt; 上海地名 .txt ns;data/dictionary/person/nrf.txt nrf;
# 增加更多的配置檔案 , 這裡增加了結巴分詞 ,scws 分詞
#IOAdapter=com.hankcs.hanlp.corpus.io.FileIOAdapter
IOAdapter=com.hankcs.hanlp.corpus.io.JarIOAdapter
# 修改 IOAdapter, 以便使用 jar 包形式載入詞典
3. 修改 HanLP.java
if ( root.length() != 0 && !root.endsWith("/")) root += "/";
當 root 的長度為 時,不用在 root 字串後面新增 '/'
4. 增加處理詞典 jar 包的程式碼檔案 : JarIOAdapter.java
package com.hankcs.hanlp.corpus.io;
import java.io.*;
/**
* 基於普通檔案系統的 IO 介面卡
*
* @author hankcs
*/
public class JarIOAdapter implements IIOAdapter
{
@Override
public InputStream open(String path) throws FileNotFoundException
{
/*
採用第一行的方式載入資料會在分散式環境報錯
改用第二行的方式
*/
//return ClassLoader.getSystemClassLoader().getResourceAsStream(path);
return JarIOAdapter.class.getClassLoader().getResourceAsStream(path);
}
@Override
public OutputStream create(String path) throws FileNotFoundException
{
return new FileOutputStream(path);
}
}
在跑 DemoStopWord 時 , 發現
java -cp .:hanlp-1.3.2.jar:test.jar com.hankcs.demo.DemoStopWord
報錯 , 原因是介面不統一導致 . 修改
DMAG.java 如下 :
public MDAG(File dataFile) throws IOException
{
BufferedReader dataFileBufferedReader = new BufferedReader(new InputStreamReader(IOAdapter == null ?
new FileInputStream(dataFile) :
//IOAdapter.open(dataFile.getAbsolutePath())
IOAdapter.open(dataFile.getPath())
, "UTF-8"));
即可 .
5. 如何將詞典與配置檔案打成一個 jar 包
最好是把 txt 格式的檔案做成 bin 或 dat 格式的檔案 , 然後做成 jar 包,否則打包執行後無法再寫成 bin 或 dat 格式檔案 .
簡單的辦法是跑一下示例,即可生成相應的 bin 或 dat 格式檔案 .
java -cp .:hanlp-1.3.2.jar:test.jar com.hankcs.demo.DemoAtFirstSight
java -cp .:hanlp-1.3.2.jar:test.jar com.hankcs.demo.DemoChineseNameRecognition
java -cp .:hanlp-1.3.2.jar:test.jar com.hankcs.demo.DemoJapaneseNameRecognition
java -cp .:hanlp-1.3.2.jar:test.jar com.hankcs.demo.DemoPinyin
java -cp .:hanlp-1.3.2.jar:test.jar com.hankcs.demo.DemoPlaceRecognition
java -cp .:hanlp-1.3.2.jar:test.jar com.hankcs.demo.DemoOrganizationRecognition
java -cp .:hanlp-1.3.2.jar:test.jar com.hankcs.demo.DemoTokenizerConfig # 命名實體識別 , 包括上面的人名 , 地名等
java -cp .:hanlp-1.3.2.jar:test.jar com.hankcs.demo.DemoTraditionalChinese2SimplifiedChinese
java -cp .:hanlp-1.3.2.jar:test.jar com.hankcs.demo.DemoStopWord
或者用以下 shell 指令碼完成
:>a;while read cl; do echo $cl; echo "=========="$cl"=======" >>a;java -cp .:test.jar:hanlp-1.3.2.jar $cl 1>> a 2>&1;done < <(jar tvf test.jar | awk '$(NF)~"Demo"{print $(NF)}' | sed 's/.class$//;s/\//./g')
我們把 data 目錄與 hanlp.properties 檔案放在一個目錄,比如 xxx 目錄
cd xxx
jar cvf data.jar .
即可生成 data.jar 包
6. 如何執行
[dxp@Flyme-SearchTag-32-220 makeNewDict]$ ls
data.jar hanlp-1.3.2.jar README.md test test.jar
[dxp@Flyme-SearchTag-32-220 makeNewDict]$ java -cp data.jar:hanlp-1.3.2.jar:test.jar com.hankcs.demo.DemoAtFirstSight
7. 在 spark 中應用
IDE 如( intellij idea )中 maven 專案
引入以下依賴:
<dependency>
<groupId>com.hankcs</groupId>
<artifactId>hanlp</artifactId>
<version>1.3.2</version>
<scope>system</scope>
<systemPath>${LocalPath}/hanlp-1.3.2.jar</systemPath>
</dependency>
spark-submit 提交任務時增加
--jar hanlp-1.3.2.jar,data.jar
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31524777/viewspace-2215802/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- HanLP分詞工具中的ViterbiSegment分詞流程HanLP分詞Viterbi
- Ansj與hanlp分詞工具對比HanLP分詞
- MapReduce實現與自定義詞典檔案基於hanLP的中文分詞詳解HanLP中文分詞
- Hanlp配置自定義詞典遇到的問題與解決方法HanLP
- js程式碼與html程式碼分離示例JSHTML
- Elasticsearch整合HanLP分詞器ElasticsearchHanLP分詞
- HanLP-實詞分詞器詳解HanLP分詞
- 空間分析:4-1.分詞模型hanLP簡介與安裝分詞模型HanLP
- 中文分詞演算法工具hanlp原始碼解析中文分詞演算法HanLP原始碼
- HanLP中文分詞Lucene外掛HanLP中文分詞
- java分詞工具hanlp介紹Java分詞HanLP
- HanLP二元核心詞典詳細解析HanLP
- 分詞工具Hanlp基於感知機的中文分詞框架HanLP中文分詞框架
- HanLP分類模組的分詞器介紹HanLP分詞
- Hanlp分詞之CRF中文詞法分析詳解HanLP分詞CRF詞法分析
- hanlp原始碼解析之中文分詞演算法詳解HanLP原始碼中文分詞演算法
- 基於hanlp的es分詞外掛HanLP分詞
- HanLP分詞命名實體提取詳解HanLP分詞
- python呼叫hanlp分詞包手記PythonHanLP分詞
- Oceanbase讀寫分離方案探索與優化優化
- php配置檔案與程式碼分離的實現思路PHP
- Spark中分散式使用HanLP(1.7.0)分詞示例Spark分散式HanLP分詞
- 基於 HanLP 的 ES 中文分詞外掛HanLP中文分詞
- Hanlp中使用純JAVA實現CRF分詞HanLPJavaCRF分詞
- Hanlp自然語言處理中的詞典格式說明HanLP自然語言處理
- 有道詞典Flutter架構與應用Flutter架構
- git倉庫與專案原始碼分離Git原始碼
- Spring MVCD框架中呼叫HanLP分詞的方法SpringMVC框架HanLP分詞
- Hanlp在java中文分詞中的使用介紹HanLPJava中文分詞
- 引言:分詞與語法解析分詞
- pyhanlp 停用詞與使用者自定義詞典功能詳解HanLP
- 搜尋引擎核心技術與演算法 —— 詞項詞典與倒排索引優化演算法索引優化
- 程式碼的分離與解耦,向移動架構師進階!解耦架構
- pyhanlp 中文詞性標註與分詞簡介HanLP詞性標註分詞
- 通用的前後端分離專案技術與框架方案後端框架
- 表現與資料分離
- 搜尋引擎核心技術與演算法 —— 詞項詞典與倒排索引最佳化演算法索引
- 1.分詞與語法解析分詞