adnb34g 发表于 2018-10-10 10:24:17

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=#将根目录置为空,或者注释掉rootCustomDictionaryPath=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.FileIOAdapterIOAdapter=com.hankcs.hanlp.corpus.io.JarIOAdapter#修改IOAdapter,以便使用jar包形式加载词典 3. 修改HanLP.javaif ( 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.DemoAtFirstSightjava -cp .:hanlp-1.3.2.jar:test.jar com.hankcs.demo.DemoChineseNameRecognitionjava -cp .:hanlp-1.3.2.jar:test.jar com.hankcs.demo.DemoJapaneseNameRecognitionjava -cp .:hanlp-1.3.2.jar:test.jar com.hankcs.demo.DemoPinyinjava -cp .:hanlp-1.3.2.jar:test.jar com.hankcs.demo.DemoPlaceRecognitionjava -cp .:hanlp-1.3.2.jar:test.jar com.hankcs.demo.DemoOrganizationRecognitionjava -cp .:hanlp-1.3.2.jar:test.jar com.hankcs.demo.DemoTokenizerConfig #命名实体识别,包括上面的人名,地名等java -cp .:hanlp-1.3.2.jar:test.jar com.hankcs.demo.DemoTraditionalChinese2SimplifiedChinesejava -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 xxxjar cvf data.jar .即可生成data.jar包 6. 如何运行$ lsdata.jarhanlp-1.3.2.jarREADME.mdtesttest.jar$ 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的个人空间
页: [1]
查看完整版本: HanLP代码与词典分离方案与流程