事情是這樣的,最近實驗室在搞一個Java Web的項目,用的Spring MVC的框架。項目組有很多沒做過Spring的學(xué)弟學(xué)妹,為了提高效率,我讓大家自己先拋開Spring來寫自己負(fù)責(zé)的模塊,我來把各個模塊在Spring里集成。?
項目里有一個文本分析的模塊是一個學(xué)妹負(fù)責(zé)的,里面用到了HanLP,我在集成的時候直接用maven添加的依賴,等集成好了測試的時候發(fā)現(xiàn)怎么也測不過,問了學(xué)妹才發(fā)現(xiàn)為了做實體識別,她用了一個很有意思的方法,自己改了HanLP的詞典,手動加了好多詞,而且后期版本迭代中還有可能繼續(xù)改。。。。
改了HanLP的詞典就意味著不能用maven直接導(dǎo)入倉庫里的包了,只能直接將修改后的data文件放到本地,然后指定路徑給HanLP。搜了一下網(wǎng)上很多方法,都是在項目部署的時候,把HanLP的詞典數(shù)據(jù)放到服務(wù)器上一個固定位置上,然后再配置HanLP的配置文件,指定一個固定位置。這種方法雖然直接,但是不能把HanLP的詞典數(shù)據(jù)跟整個項目打包到一起,管理起來很麻煩。倘若把數(shù)據(jù)直接作為項目的資源文件,部署到Tomcat上后無論怎么在配置里寫路徑都會提示找不到詞典文件。研究了一下HanLP的issue之后,我發(fā)現(xiàn)這個項目支持自定義讀寫文件的IO類。在一個將詞典數(shù)據(jù)放到HDFS上的一個blog啟發(fā)下,我想了一個很雞賊的方法,我重寫一個IOAdapter類,使用讀寫靜態(tài)資源文件的方法讀取詞典數(shù)據(jù)了,這樣不就可以把data跟項目打包到一起了嘛。
代碼如下:
package com.car.util.nlp;
import com.hankcs.hanlp.corpus.io.IIOAdapter;
import org.springframework.core.io.ClassPathResource;
import java.io.*;
public class ResourcesFileIoAdapter implements IIOAdapter{
? ? @Override
? ? public InputStream open(String path) throws IOException {
? ? ? ? ClassPathResource resource = new ClassPathResource(path);
? ? ? ? InputStream is = new FileInputStream(resource.getFile());
? ? ? ? return is;
? ? }
? ? @Override
? ? public OutputStream create(String path) throws IOException{
? ? ? ? ClassPathResource resource = new ClassPathResource(path);
? ? ? ? OutputStream os = new FileOutputStream(resource.getFile());
? ? ? ? return os;
? ? }
}
整好了之后把data文件夾和hanlp.properties放到項目的資源文件夾里,在配置文件里修改一下路徑和IOAdapte:
root=
IOAdapte=com.car.util.nlp.ResourcesFileIoAdapter
不知道正確的解決方案應(yīng)該是啥,感覺這個方法還是很雞賊的。
文章來源于狼血wolfblood的博客
評論
查看更多