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的长度为0时,不用在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
转载自cicido的个人空间
HanLP代码与词典分离方案与流程的更多相关文章
- HanLP二元核心词典解析
HanLP二元核心词典解析 本文分析:HanLP版本1.5.3中二元核心词典的存储与查找.当词典文件没有被缓存时,会从文本文件CoreNatureDictionary.ngram.txt中解析出来存储 ...
- 优化 if-else 代码的 8 种方案
前言 代码中如果if-else比较多,阅读起来比较困难,维护起来也比较困难,很容易出bug,接下来,本文将介绍优化if-else代码的八种方案. 方案. 优化方案一:提前return,去除不必要的el ...
- Oceanbase读写分离方案探索与优化
[作者] 许金柱,携程资深DBA,专注于分布式数据库研究及运维. 台枫,携程高级DBA,主要负责MySQL和OceanBase的运维. [前言] 读写分离,是一种将数据库的查询操作和写入操作分离 ...
- sql server几种读写分离方案的比较
在生产环境中我们经常会遇到这种情况: 前端的oltp业务很繁忙,但是需要对这些运营数据进行olap,为了不影响前端正常业务,所以需要将数据库进行读写分离. 这里我将几种可以用来进行读写分离的方案总结一 ...
- 数据库分库分表(sharding)系列(五) 一种支持自由规划无须数据迁移和修改路由代码的Sharding扩容方案
作为一种数据存储层面上的水平伸缩解决方案,数据库Sharding技术由来已久,很多海量数据系统在其发展演进的历程中都曾经历过分库分表的Sharding改造阶段.简单地说,Sharding就是将原来单一 ...
- realmock 前后端分离方案
realmock 前后端分离方案 express + randomjson 模拟后端服务,前端服务器(比如webpack, nigix等)将请求代理到该服务器地址即可 github地址:https:/ ...
- 关于Jenkins部署代码权限三种方案
关于Jenkins部署代码权限三种方案 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.修改Jenkins进程用户为root [root@jenkins ~]# cat /etc ...
- C语言/C++编程学习:栈的代码实现之数组方案
C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...
- 《AndroidStudio每日一贴》3.高速切换代码风格、配色方案和键盘
<AndroidStudio每日一贴>3.高速切换代码风格.配色方案和键盘 高速切换代码风格.配色方案和键盘,使用快捷键: control + ~ 很多其它有用技巧请查看<Andro ...
随机推荐
- ios 汽车品牌展示案例
汽车组模型 // ZQRGroup.h #import <Foundation/Foundation.h> @interface ZQRGroup : NSObject /** *组标题 ...
- 关于lunece的搜索的分页和多字段搜索关键词
关于全文检索lunece的分页,我们需要用到的是以下方法 IndexSearch类下的searchAfter方法. IndexSearch isearch=new IndexSearch(a); is ...
- java学习笔记30(IO :缓冲流)
缓冲流: 读取数据大量的文件时,读取的速度慢,java提供了一套缓冲流,提高IO流的效率: 缓冲流分为字节缓冲流和字符缓冲流: 字节输入缓冲流和字节输出缓冲流如下: package com.zs.De ...
- KB/MB/GB。。单位换算
今天遇到一个需求,需要把数据单位进行换算,记录一下.写的不好请勿见怪. function bytesToSize( bytes ) {//单位转化 var k = 1024, ...
- 小技巧, 批处理修改IP
相信很多人都有这样的麻烦, 工作单位的IP网段与住的不一致, 自己的笔记本在单位和回家的时候每次都要更改IP, 很麻烦, 菜鸟小罗偷个懒, 做了个批处理来修改IP,方便一点. 还有就是可以把工作的时 ...
- 归并排序merge_sort
将区间递归分解,直到区间只有2个元素,然后比较大小,排序,等递归回来的时候就将排序好的子区间再排序合并....一直排序合并,最后就排序完成了. (可以做范围大的逆序数的题) #include < ...
- matlab数组和矩阵
数组创建 要创建每行包含四个元素的数组,请使用逗号 (,) 或空格分隔各元素. a = [1 2 3 4] a = 1×4 1 2 3 4 这种数组为行向量. 要创建包含多行的矩阵,请使用分号分隔各行 ...
- HPU组队赛J:Ball King(线段树)
时间限制 1 Second 内存限制 512 Mb 题目描述 HPU601球王争霸赛即将举行,ACMER纷纷参加. 现在有n个人报名参赛,每个人都有一个实力值 ai,实力值较大者获胜. 为保证比赛公 ...
- rest-framework之版本控制
rest-framework之版本控制 本文目录 一 作用 二 内置的版本控制类 三 局部使用 四 全局使用 五 示例 源码分析 回到目录 一 作用 用于版本的控制 回到目录 二 内置的版本控制类 f ...
- queue 的基本用法
queue 1.back() 返回一个引用,指向最后一个元素2.empty() 如果队列空则返回真3.front() 返回第一个元素4.pop() 删除第一个元素5.push() 在末尾加入一个元素6 ...