【從入門到放棄-Java】工具-詞頻分析

前言

最近有根據文件內容進行詞頻分析的需求,如果是純英文的,寫個程序處理比較容易,但涉及到中文詞頻分析,最關鍵的一步就是中文分詞。

搜了不少文章,最後找到一篇比較好用的 Java實現中文詞頻統計。主要利用了ansj_seg進行中文分詞,分詞後再進行詞頻統計。

針對文章中提供的代碼示例,做了稍許改動,貼在下面 做個記錄。

依賴

添加最新版ansj_seg依賴

<dependency>
    <groupId>org.ansj</groupId>
    <artifactId>ansj_seg</artifactId>
    <version>5.1.6</version>
</dependency>

代碼實現

代碼可見 AloofJr

package com.my.tools.ansj;

import com.alibaba.common.lang.StringUtil;
import org.ansj.splitWord.analysis.ToAnalysis;

import java.io.*;
import java.util.*;
/**
 * 對文件中文分詞後,根據詞頻排序輸出
 * @author wq
 * @date 2020/4/8
 */
public class Analysis {
    public static void main(String[] args) throws IOException {
        wordFrequency("");
    }

    public static void wordFrequency(String path) throws IOException {
        List<Map.Entry<String, Integer>> wordList = getWordList(path);
        wordList.forEach(entry -> {
            System.out.println(entry.getKey() + "\t" + entry.getValue());
        });
    }

    /**
     * 獲取 分詞-詞頻 列表
     * */
    private static List<Map.Entry<String, Integer>> getWordList(String path) throws IOException {
        Map<String, Integer> map = new HashMap<>(16);

        String result = ToAnalysis.parse(getString(path)).toStringWithOutNature();

        //分詞後的內容,分詞間使用英文逗號分隔。
        String[] words = result.split(",");

        for (String word : words) {

            String str = word.trim();

            // 過濾空白字符

            if (StringUtil.isBlank(str)) {
                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);

            }

        }

        return sortByValue(map);
    }

    /**
     * 根據詞頻從高到低排序
     * */
    private static List<Map.Entry<String, Integer>> sortByValue(Map<String, Integer> map) {
        if (map == null) {
            return null;
        }
        List<Map.Entry<String, Integer>> list = new ArrayList<>();
        list.addAll(map.entrySet());

        Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
            @Override
            public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
                return o2.getValue().compareTo(o1.getValue());
            }
        });

        return list;
    }

    /**
     * 獲取文件內容
     * */
    private static String getString(String path) throws IOException {

        FileInputStream inputStream = new FileInputStream(new File(path));

        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();

    }
}

參考

作者:Asche   

出處:https://www.cnblogs.com/asche/p/9673611.html

更多文章

見我的博客:https://nc2era.com

written by AloofJr,轉載請註明出處

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章