1. 程式人生 > >Java實現中文詞頻統計

Java實現中文詞頻統計

昨日有個中文詞頻統計的需求, 百度一番後, 發現一大堆標題黨文章, 講的與內容嚴重不符, 這裡就簡單記錄下自己實現的流程吧!

與英文單詞的詞頻統計不同, 中文的難點在於如何分詞, 不過好在有許多優秀的現成庫供呼叫,這裡就使用了 ansj_seg 外掛.

首先新增依賴:

下載jar
  • 訪問 http://maven.nlpcn.org/org/ansj/ 最好下載最新版 ansj_seg/
    • 同時下載nlp-lang.jar 需要和ansj_seg 配套..配套關係可以看jar包中的maven依賴,一般最新的ansj配最新的nlp-lang不會有錯。
  • 匯入到eclipse ,開始你的程式吧
maven
        <dependency>
            <groupId>org.ansj</groupId>
            <artifactId>ansj_seg</artifactId>
            <version>5.1.1</version>
        </dependency>基本用法為:
 String str = "歡迎使用ansj_seg,(ansj中文分詞)在這裡如果你遇到什麼問題都可以聯絡我.我一定盡我所能.幫助大家.ansj_seg更快,更準,更自由!" ;
 System.out.println(ToAnalysis.parse(str));
 
 歡迎/v,使用/v,ansj/en,_,seg/en,,,(,ansj/en,中文/nz,分詞/n,),在/p,這裡/r,如果/c,你/r,遇到/v,什麼/r,問題/n,都/d,可以/v,聯絡/v,我/r,./m,我/r,一定/d,盡我所能/l,./m,幫助/v,大家/r,./m,ansj/en,_,seg/en,更快/d,,,更/d,準/a,,,更/d,自由/a,!

下面就貼上程式碼:

  public static void wordFrequency() throws IOException {
        Map<String, Integer> map = new HashMap<>();

        String article = getString();
        String result = ToAnalysis.parse(article).toStringWithOutNature();
        String[] words = result.split(",");


        
for(String word: words){ String str = word.trim(); // 過濾空白字元 if (str.equals("")) continue; // 過濾一些高頻率的符號 else if(str.matches("[)|(|.|,|。|+|-|“|”|:|?|\\s]")) continue; // 此處過濾長度為1的str else if (str.length() < 2) continue; if (!map.containsKey(word)){ map.put(word, 1); } else { int n = map.get(word); map.put(word, ++n); } } Iterator<Map.Entry<String, Integer>> iterator = map.entrySet().iterator(); while (iterator.hasNext()){ Map.Entry<String, Integer> entry = iterator.next(); System.out.println(entry.getKey() + ": " + entry.getValue()); }  List<Map.Entry<String, Integer>> list = new ArrayList<>(); Map.Entry<String, Integer> entry;     while ((entry = getMax(map)) != null){ list.add(entry); } System.out.println(Arrays.toString(list.toArray())); } /** * 找出map中value最大的entry, 返回此entry, 並在map刪除此entry * @param map * @return */ public static Map.Entry<String, Integer> getMax(Map<String, Integer> map){ if (map.size() == 0){ return null; } Map.Entry<String, Integer> maxEntry = null; boolean flag = false; Iterator<Map.Entry<String, Integer>> iterator = map.entrySet().iterator(); while (iterator.hasNext()){ Map.Entry<String, Integer> entry = iterator.next(); if (!flag){ maxEntry = entry; flag = true; } if (entry.getValue() > maxEntry.getValue()){ maxEntry = entry; } } map.remove(maxEntry.getKey()); return maxEntry; } /** * 從檔案中讀取待分割的文章素材.   * 檔案內容來自簡書熱門文章: https://www.jianshu.com/p/5b37403f6ba6 * @return * @throws IOException */ public static String getString() throws IOException { FileInputStream inputStream = new FileInputStream(new File("/home/as_/IdeaProjects/SpringMaven/article-txt")); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); StringBuilder strBuilder = new StringBuilder(); String line; while((line = reader.readLine()) != null){ strBuilder.append(line); } reader.close(); inputStream.close(); return strBuilder.toString(); }

最後依舊附上圖片: