Spring MVCD框架中调用HanLP分词的方法


项目简要:关于java web的一个项目,用的Spring MVCd 框架。鉴于参与这次项目的人中并非所人都作的Spring,为了可以提升效率,建议你们是先抛开SPring来写本身负责的模块,最后再把各个模块在Spring里面集成。java

项目里有一个文本分析的模块是一个同窗用hanlp写的,因为在最后集成的时候直接使用maven添加的依赖,但最终测试时没法经过。后经分析发现她坐了实体识别,是本身改了hanlp的词典,手动加了不少词,并且在后期版本的迭代中还有可能继续改了hanlp的词典,这就意味着不能用maven直接导入仓库里的包了,只有将修改后的data文件放到本地,而后指定路径给hanlp。web

网上有一些解决的方法,但都是在项目部署的时候,把hanlp的词典数据放到服务器上一个固定位置上,而后再配置hanlp的配置文件,指定一个固定位置。这种方法虽然比较直接,可是并不可以把hanlp的词典数据与整个项目打包到一块儿,后期的管理也比较麻烦。假若把数据直接做为项目的资源文件,部署到Tomcat上后不管怎么在配置里写路径都会提示找不到词典文件。spring

在分析了HanLP的issue以后,发现这个项目支持自定义读写文件的IO类。在一个将词典数据放到HDFS上的一个blog启发下,尝试经过重写一个IOAdapter类,使用读写静态资源文件的方法读取词典数据了,这样不就能够把data跟项目打包到一块儿了。服务器

代码以下:框架

1| package com.car.util.nlp;maven

2|ide

3| import com.hankcs.hanlp.corpus.io.IIOAdapter;测试

4| import org.springframework.core.io.ClassPathResource;spa

5| import java.io.*;blog

6|

7| public class ResourcesFileIoAdapter implements IIOAdapter{

8|   @Override

9|    public InputStream open(String path) throws IOException {

  10|      ClassPathResource resource = new ClassPathResource(path);

  11|     InputStream is = new FileInputStream(resource.getFile());

  12|      return is;

  13|  }

  14|  @Override

  15|  public OutputStream create(String path) throws IOException{

  16|      ClassPathResource resource = new ClassPathResource(path);

  17|      OutputStream os = new 

18| FileOutputStream(resource.getFile());

  19|      return os;

  20|   }

21| }

 

整好了以后把data文件夹和hanlp.properties放到项目的资源文件夹里,在配置文件里修改一下路径和IOAdapte:

1| root=

2|

3| IOAdapte=com.car.util.nlp.ResourcesFileIoAdapter