所做工作需要对中文文本分词并移除停用词
/**
* @function 使用两个字典进行分词,并移除停用词
* @author Peter
* @date 2014-07-17
*/
package fnlp.segment;
import java.util.List;
import edu.fudan.ml.types.Dictionary;
import edu.fudan.nlp.cn.tag.CWSTagger;
import edu.fudan.nlp.corpus.StopWords;
// import gnu.trove.set.hash.THashSet;
public class MultiDictSegment {
public static void main(String[] args) {
// TODO Auto-generated method stub
String str = "健康咨询描述: 我怀第二个孩子的时候就血压高了,一直到孩子3,4岁吧才吃药。" +
"但吃什么药血压都是在100-140.我今年做了个泌尿系肉。医生给我开了硝苯地平控释片。" +
"我觉得吃了一段时间老是咳嗽,我想问一下我能还吃吗 ";
try {
// 添加单词到字典中
/*String str1 = "波依定";
String str2 = "厄贝沙坦氢氯吃噻嗪";
THashSet<String> ths = new THashSet<String>();
ths.add(str1);
ths.add(str2);*/
Dictionary dict = new Dictionary();
// 添加两个字典文件
dict.addFile("./models/dict.txt");
dict.addFile("./models/dict_drug.txt");
// seg.m为模型文件名
CWSTagger cwst = new CWSTagger("./models/seg.m");
cwst.setDictionary(dict);
String[] words = cwst.tag(str).split("\\s+");
StopWords stopWords = new StopWords("./models/stopwords/StopWords.txt");
// 对分词的结果去除停用词
List<String> baseWords = stopWords.phraseDel(words);
for(int i=0; i<baseWords.size(); i++) {
System.out.print(baseWords.get(i) + " ");
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
结果如下:第二 孩子 血压 一直 孩子 吃药 药血压 今年 泌尿系肉 医生 觉得 时间 咳嗽 吗
FudanNLP源码中在删除停用词时有一些武断,不仅过滤了停用词表中的单词,而且过滤了长度大于4的单词,这就需要自己修改源码以适应工作需求。
public boolean isStopWord(String word) {
if (word.length() == 1 || word.length()>4)
return true;
if (noise.matcher(word).matches())
return true;
if (sWord.contains(word))
return true;
return false;
}
另外选择合适的停用词表也有助于分词结果的展示,必要时可根据工作需要自行增删。
在移除停用词时,参考链接: