【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辦公自動化】系列文章。