Spring MVCD框架中調用HanLP分詞的方法

項目簡要:關於java web的一個項目,用的Spring MVCd 框架。鑑於參與此次項目的人中並不是所人都做的Spring,爲了能夠提高效率,建議大家是先拋開SPring來寫自己負責的模塊,最後再把各個模塊在Spring裏面集成。

項目裏有一個文本分析的模塊是一個同學用hanlp寫的,由於在最後集成的時候直接使用maven添加的依賴,但最終測試時無法通過。後經分析發現她坐了實體識別,是自己改了hanlp的詞典,手動加了很多詞,而且在後期版本的迭代中還有可能繼續改了hanlp的詞典,這就意味着不能用maven直接導入倉庫裏的包了,只有將修改後的data文件放到本地,然後指定路徑給hanlp。

網上有一些解決的方法,但都是在項目部署的時候,把hanlp的詞典數據放到服務器上一個固定位置上,然後再配置hanlp的配置文件,指定一個固定位置。這種方法雖然比較直接,但是並不能夠把hanlp的詞典數據與整個項目打包到一起,後期的管理也比較麻煩。倘若把數據直接作爲項目的資源文件,部署到Tomcat上後無論怎麼在配置裏寫路徑都會提示找不到詞典文件。

在分析了HanLP的issue之後,發現這個項目支持自定義讀寫文件的IO類。在一個將詞典數據放到HDFS上的一個blog啓發下,嘗試通過重寫一個IOAdapter類,使用讀寫靜態資源文件的方法讀取詞典數據了,這樣不就可以把data跟項目打包到一起了。

代碼如下:

1| package com.car.util.nlp;

2|

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

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

5| import java.io.*;

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章