首页 > 人工智能 > 自然语言 > 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博客 ” ,链接:https://blog.itpub.net/31524777/viewspace-2215802/ ,如需转载,请注明出处,否则将追究法律责任。