如何用java完成一個中文詞頻統計程序


  要想完成一個中文詞頻統計功能,首先必須使用一個中文分詞器,這里使用的是中科院的。下載地址是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());  
		      
		}  
	}
		

}

  這路是打印出所有的詞頻,可以按照自己的需求,去掉標點符號和沒有的助詞。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM