以前在spark環境中一直用的是portable版本,詞條數量不是很夠,且有心想把jieba,swcs詞典加進來,java
其餘像ik,ansi-seg等分詞詞典因爲沒有詞性並無加進來. 本次修改主要是採用jar包方包將詞典目錄shell
data與hanlp.properties合成一個data.jar文件.apache
1. pom.xml 過濾資源文件的配置maven
<plugin>分佈式
<groupId>org.apache.maven.plugins</groupId>ide
<artifactId>maven-jar-plugin</artifactId>idea
<version>${maven-jar-plugin.version}</version>spa
<configuration>.net
<excludes>xml
<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的長度爲0時,不用在root字符串後面添加'/'
4. 增長處理詞典jar包的代碼文件: JarIOAdapter.java
package com.hankcs.hanlp.corpus.io;
import java.io.*;
/**
* 基於普通文件系統的IO適配器
*
* @author hankcs
*/
public class JarIOAdapter implements IIOAdapter
{
public InputStream open(String path) throws FileNotFoundException
{
/*
採用第一行的方式加載資料會在分佈式環境報錯
改用第二行的方式
*/
//return ClassLoader.getSystemClassLoader().getResourceAsStream(path);
return JarIOAdapter.class.getClassLoader().getResourceAsStream(path);
}
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
轉載自cicido的我的空間