【java辦公自動化(8)】-- 樸素貝葉斯自動新聞分類

【java辦公自動化(8)】-- 樸素貝葉斯自動新聞分類

自動新聞分類,很簡單,只需要一億點細節,再經過2千年後,數據已經分類好了,我當時害怕極了。

我們已經用樸素貝葉斯自動篩選垃圾郵件,自動檢測人名性別。同理,今天實現自動將文章分類。首先,需要足夠足夠多的文本數據。。。


1、特徵表示

一篇新聞中,可以把新聞中出現的詞作爲特徵向量表示出來,如 X = {昨日,是,國內,投資,市場…}


2、特徵選擇

特徵中由於一些詞對分類沒有比較顯著的幫助,甚至會有導致一些噪音,
因此,我們需要減一億點細節。。。
我們需要去除,如“是”、“昨日”等,經過選擇的特徵可能是 X = {國內,投資,市場…}


3、模型選擇

特徵中由於一些詞對分類沒有比較顯著的幫助,甚至會有導致一些噪音,
因此,我們需要減一億點細節。。。
我們需要去除,如“是”、“昨日”等,經過選擇的特徵可能是 X = {國內,投資,市場…}

實戰步驟:
創建文件夾,創建文件,多線程爬取,js模擬點擊獲取內容。在這裏插入圖片描述

在這裏插入圖片描述

for(var i = 0;i<100;i++){
    $(".more").click();
}
int b = f33.length + 1;
                                key44 = b+"";
                                if(key44.length() == 1){
                                    key44 = "000"+key44;
                                }else if(key44.length() == 2){
                                    key44 = "00"+key44;
                                }else if(key44.length() == 3){
                                    key44 = "0"+key44;
                                }
                                key44 = key44+".txt";
 * 多項式樸素貝葉斯分類結果
 * P(C_i|w_1,w_2...w_n) = P(w_1,w_2...w_n|C_i) * P(C_i) / P(w_1,w_2...w_n)
 * = P(w_1|C_i) * P(w_2|C_i)...P(w_n|C_i) * P(C_i) / (P(w_1) * P(w_2) ...P(w_n))

在這裏插入圖片描述

難點:

深度優先遍歷

Files.walkFileTree(Paths.get(trainFileDir.getAbsolutePath()), new SimpleFileVisitor<Path>() {
            @Override// 正在訪問一個文件時要幹啥
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
                musicList2.add(file.toFile());
                String filePath = file.toFile().getAbsolutePath();
                //分詞處理,獲取每條訓練集文本的詞和詞頻
                Map<String, Integer> contentSegs = null;
                try {
                    contentSegs = IKWordSegmentation.segString(FileOptionUtil.readFile(filePath));
                } catch (Exception e) {
                    e.printStackTrace();
                }
                if (allTrainFileSegsMap.containsKey(trainFileDir.getName())) {
                    Map<String, Map<String, Integer>> allSegsMap = allTrainFileSegsMap.get(trainFileDir.getName());
                    allSegsMap.put(filePath, contentSegs);
                    allTrainFileSegsMap.put(trainFileDir.getName(), allSegsMap);
                } else {
                    Map<String, Map<String, Integer>> allSegsMap = new HashMap<String, Map<String, Integer>>();
                    allSegsMap.put(filePath, contentSegs);
                    allTrainFileSegsMap.put(trainFileDir.getName(), allSegsMap);
                }

福利函數:

/**
     * 詞頻統計
     *
     * @param content     內容
     * @param frequencies 詞頻;key:詞語;value:出現次數
     * @return
     * @throws IOException
     */
    public static Map<String, Integer> count(String content, Map<String, Integer> frequencies) throws IOException {
        if (frequencies == null) {
            frequencies = new HashMap<>();
        }
        if (StringUtils.isBlank(content)) {
            return frequencies;
        }

        IKSegmenter ikSegmenter = new IKSegmenter(new StringReader(content), true);

        Lexeme lexeme;
        while ((lexeme = ikSegmenter.next()) != null) {
            final String text = lexeme.getLexemeText();

            if (text.length() > 1) {
                //遞增
                if (frequencies.containsKey(text)) {
                    frequencies.put(text, frequencies.get(text) + 1);
                } else {//首次出現
                    frequencies.put(text, 1);
                }
            }
        }

        return frequencies;


    }

    /**
     * 按出現次數,從高到低排序
     *
     * @param data
     * @return
     */
    public static List<Map.Entry<String, Integer>> order(Map<String, Integer> data) {
        List<Map.Entry<String, Integer>> result = new ArrayList<>(data.entrySet());
        Collections.sort(result, new Comparator<Map.Entry<String, Integer>>() {
            @Override
            public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
                return o2.getValue() - o1.getValue();
            }
        });
        return result;
    }

福利類:

public class FileOptionUtil {
    public static void main(String[] args) {
        readDirs("C:\\Users\\yanhui\\Desktop\\課件和代碼\\第2課\\Lecture_2\\Lecture_2\\Naive-Bayes-Text-Classifier\\Database\\SogouC\\Sample");
    }

    public static List<String> readDirs(String absolutePath) {
        List<String> readDirs = new ArrayList<>();
        File Dir = new File(absolutePath);
        //獲取文件夾路徑下的所有java文件
        File[] arr = Dir.listFiles();//獲取文件或文件夾對象
        for (File file : arr) {//遍歷File數組
            if (file.isFile() && file.getName().endsWith(".txt")) {//判斷對象是否是以.java結尾的類型的文件,是的話就輸出
                readDirs.add(file.getAbsolutePath());
            } else if (file.isDirectory()) {//判斷是否是目錄,是的話,就繼續調用PrintJavaFile()方法進行遞歸
                readDirs(file.getAbsolutePath());
            }
        }
        return readDirs;
    }

    public static String readFile(String filePath) {
        return _txtUtils.readTxtFile(filePath);
    }
}

知識付費

如需獲取代碼,請加WX(bin490647751),支付9.9元,可獲取【java辦公自動化】系列文章。

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