要想完成一个中文词频统计功能,首先必须使用一个中文分词器,这里使用的是中科院的。下载地址是http://ictclas.nlpir.org/downloads,由于本人电脑系统是win32位的,因此下载的是 NLPIR-JNI-发布包.zip,解压之后导入myeclipse,这里我并没有使用该项目自带的Test,而是根据该网站上提供的API进行开发。首先要做的是改写nlpir.properties中的dll_or_so_path属性,要改成项目中的NLPIR_JNI.dll的绝对路径。下面贴出我的代码:
1 import java.io.IOException; 2 import java.io.UnsupportedEncodingException; 3 4 import kevin.zhang.NLPIR; 5 6 7 8 public class WordCut { 9 10 /** 11 * @param args 12 * @throws IOException 13 */ 14 public static void main(String[] args) throws IOException { 15 // TODO Auto-generated method stub 16 String test = "张华平推出的NLPIR分词系统,又名ICTCLAS2013,新增新词识别、关键词提取、微博分词功能。"; 17 wordCut(test); 18 19 20 } 21 public static void wordCut(String stringInput) throws IOException{ 22 NLPIR nlpir = new NLPIR(); 23 String argu="C:\Users\Press-Lab\Desktop\20130702101845_NLPIR-JNI-发布包\NLPIR-JNI-发布包\NLPIR_Test\"; 24 System.out.println("NLPIR init"); 25 if(nlpir.NLPIR_Init(argu.getBytes("GB2312"),0,"0".getBytes("GB2312")) == false){ 26 System.out.println("init failed"); 27 return; 28 } 29 byte nativeBytes[] = nlpir.NLPIR_ParagraphProcess(stringInput.getBytes("GB2312"), 0); 30 String nativeStr = new String(nativeBytes, 0, nativeBytes.length, "GB2312"); 31 System.out.println("分词结果为: " + nativeStr); 32 33 34 35 } 36 37 }
这里要当心地23行和25行,和官网上提供的文档略有差异,argu的路径是项目中的Data文件的上一层目录的绝对路径。29行中第二参数0代表着不需要词性标注,1表示需要。
然后这里就可以输出切分完词的字符串。下一步是对" "隔开的词统计词频,并按照降序的目录打印出来。不多说,贴代码。
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; public class WordCount { public static void main(String[] args){ String wordsinput = "张华平 推出 的 NLPIR 分词 系统 , 又 名 ICTCLAS2013 , 新增 新词 识别 、 的 关键词 的 提取 、 微 博 分词 功能"; HashMap<String, Integer> wordMap = new HashMap<String, Integer>(); String[] words = wordsinput.split(" "); for(int i = 0; i < words.length ; i++){ if(!wordMap.containsKey(words[i])){ wordMap.put(words[i], 1); }else{ int val = wordMap.get(words[i]); wordMap.put(words[i],val + 1); } } List<Map.Entry<String, Integer>> infoIds = new ArrayList<Map.Entry<String, Integer>>( wordMap.entrySet()); Collections.sort(infoIds, new Comparator<Map.Entry<String, Integer>>() { public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) { return ( o2.getValue()-o1.getValue()); } }); for (int i = 0; i < infoIds.size(); i++) { Entry<String,Integer> ent=infoIds.get(i); System.out.println(ent.getKey()+"="+ent.getValue()); } } }
这路是打印出所有的词频,可以按照自己的需求,去掉标点符号和没有的助词。