【java辦公自動化(6)】-- 自動情感分析

【java辦公自動化(6)】-- 自動情感分析

需求前言

人工智能情感分析,俺不會做,俺也不敢做,反正很牛逼。
但是用酒店的情感數據分析文章(java版),效率上很慢,還有錯誤率也及大,爲了追求程序高效,還是自己得搞個情感分析工具類。思路也是網上找到的,但大部分是用Python寫的,得改成java。過程中,也踩過不少坑,藉此分享給大家。
思路分析:對文章分詞,然後去除停用詞,找出文章中的情感詞、否定詞以及程度副詞,然後判斷每個情感詞之前是否有否定詞及程度副詞,將它之前的否定詞和程度副詞劃分爲一個組,如果有否定詞將情感詞的情感權值乘以-1,如果有程度副詞就乘以程度副詞的程度值,最後所有組的得分加起來,大於0的歸於正向,小於0的歸於負向。

效果展示

在這裏插入圖片描述

代碼展示

// # 權重初始化爲1
        float W = 1f;
        float score = 0f;
// # 情感詞下標初始化
                int sentimentIndex = 0;
//    # 情感詞的位置下標集合
               List<Integer> sentimentIndexList = getListByMap(senWord);
//    # 遍歷分詞結果(遍歷分詞結果是爲了定位兩個情感詞之間的程度副詞和否定詞)
//        for i in range(0, len(seg_result)):
        for(int i =0; i<segList.size(); i++){
//             # 如果是情感詞(根據下標是否在情感詞分類結果中判斷)
            String key = segList.get(i);
//            System.out.println(key);
            //遍歷map
            for(Map.Entry<String, String> a:senWord.entrySet()){
                if(key.equals(a.getKey())){
//                    System.out.println("鍵是"+a.getKey());
//                    System.out.println("值是"+a.getValue());
//                     # 權重*情感詞得分
                    score += W * Float.parseFloat(a.getValue());
//                    # 情感詞下標加1,獲取下一個情感詞的位置
                    sentimentIndex += 1;
                    if(sentimentIndex < sentimentIndexList.size() - 1){
// # 判斷當前的情感詞與下一個情感詞之間是否有程度副詞或否定詞
                         for( int j = sentimentIndexList.get(sentimentIndex);j < sentimentIndexList.get(sentimentIndex+1); j++){
//                              # 更新權重,如果有否定詞,取反
                             for(Map.Entry<String, String> a1:notWord.entrySet()) {
                                 String key1 = segList.get(j);
                                 if (key1.equals(a1.getKey())) {
                                     W *= -1;
                                 }
                             }
                             for(Map.Entry<String, String> a2:degreeWord.entrySet()) {
                                 String key2 = segList.get(j);
                                 if (key2.equals(a2.getKey())) {
                                     W *= Float.parseFloat(a2.getValue());
                                 }
                             }
                         }
                    }
                }
            }
//             # 定位到下一個情感詞
            if(sentimentIndex < sentimentIndexList.size() - 1){
                i = sentimentIndexList.get(sentimentIndex+1);
            }
        }
        return score;

//        # 讀取情感字典文件
        String filePath = "C:\\Users\\yanhui\\Desktop\\test\\nlp\\txt\\BosonNLP_sentiment_score.txt";
        File file = new File(filePath);
        BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
        String temp = null;
        //情感詞
        HashMap<String, String> senDict = new HashMap<>();
        while ((temp = bufferedReader.readLine()) != null) {
            String[] temps = temp.split(" ");
            if (temps.length == 2){
                senDict.put(temps[0], temps[1]);
            }
        }

難點分析

  • 1、數據 分詞技術用的是HanLP,強大快速,但是要有自己的停用詞庫,情感詞庫,否定詞庫,程度副詞庫。自然語言處理,就要學好語文,一個句子有多重表達意思,包含各種詞性。
  • 2、dic詞典,這個Python可以實現,但是java巧用HashMap<String,String>。
  • 3、Map遍歷
    for(Map.Entry<String, String> a:senWord.entrySet()){
    if(key.equals(a.getKey())){
    // System.out.println(“鍵是”+a.getKey());
    // System.out.println(“值是”+a.getValue());
  • 4、巧用權重計分 如果要計算天文數值的話,可以說是AI算力。

擴展需求

  • 1、例如微信中,判斷只接受正向的語句,負面的過濾掉不接受。有個朋友發了微信給我,今天請你吃飯。這條信息就能收到。就不用花很多時間去看各種負面消息,既影響心情又浪費時間。
  • 2、也可以判斷新聞文章的正負情感。

知識付費

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

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