当前位置: 首页 > 工具软件 > FudanNLP > 使用案例 >

使用FudanNLP分词工具分词并移除停用词

卢开济
2023-12-01

所做工作需要对中文文本分词并移除停用词

/**
 * @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;
	}


上述Java代码可实现中文分词并移除停用词,在不考虑分词算法的前提下,分词效果由自己所提供的字典决定。

另外选择合适的停用词表也有助于分词结果的展示,必要时可根据工作需要自行增删。



在移除停用词时,参考链接:

http://wugh.github.io/wen-ben-fen-lei.html

 类似资料: