今天遇到一个比较无奈的问题。在用paoding的时候,我发现一些词组我认为是有用,却被它过滤掉,查看了一下源代码,发现有加载过x-noise-word,于是我将x-noise-word里面关于我需要的词组删除掉,那么这样是变成有用的词了吧。比如说x-noise-word里面有"什么",我删除掉,分词的时候,就认为"什么"是有用的词组。
事实上,修改后,发现没有效果。因为个人看paoding源代码比较吃力,没能力弄明白。于是,有了一个异想天开的想法。
在分词之后,它认为没有用的词组,我把它修改成有用的词组,那不是解决问题了。有了想法,就有干劲。
花了一个下午,把这个问题解决掉。代码如下:
package net.paoding.analysis.dictionary;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Hashtable;
public class ContraryStopWord {
private static final String DEFAULT_DIC_PATH = "dic/contrary-stopword.dic";
private String UNSTOPWORD = null;
private static Hashtable<String,Integer> HSW = new Hashtable<String,Integer>();
private static ContraryStopWord unStopWord = new ContraryStopWord();
public static ContraryStopWord getInstance(){
return unStopWord;
}
private ContraryStopWord(){
loadContraryStopwordDic();
}
private void loadContraryStopwordDic()
{
FileInputStream in = null;
BufferedReader breader = null;
try {
in = new FileInputStream(new File(this.DEFAULT_DIC_PATH));
breader = new BufferedReader(new InputStreamReader(in));
String line = breader.readLine();
while(line!=null){
hswAdd(line);
line = breader.readLine();
}
} catch (IOException ex) {
ex.printStackTrace();
} finally {
try {
if(breader!=null){
breader.close();
}
if(in!=null){
in.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private void setMode(String UNSTOPWORD)
{
this.UNSTOPWORD = UNSTOPWORD;
}
private void hswAdd(String key)
{
HSW.put(key, 1);
}
public boolean hswGet(String key)
{
return HSW.get(key)==null?true:false;
}
public static void main(String args[]){
ContraryStopWord word = ContraryStopWord.getInstance();
word.hswGet("");
}
}
dic/contrary-stopword.dic
就是反停用词的文件。
比如,在文件里面写
什么
为什么
....
最后在net.paoding.analysis.dictionary找到Word类
private ContraryStopWord contraryStopWord = ContraryStopWord.getInstance();
public boolean isNoise() {
if(!contraryStopWord.hswGet(text)){
return false;
}
return isNoiseCharactor() || isNoiseWord();
}
填写上面两个代码
在分词的时候,就能起到反停用词的作用。