一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - Java實現(xiàn)基于樸素貝葉斯的情感詞分析

Java實現(xiàn)基于樸素貝葉斯的情感詞分析

2021-04-19 02:21碼農(nóng)參上Dr Hydra Java教程

本文我們就來介紹一下樸素貝葉斯分類的理論基礎(chǔ)和它的實際使用。在學(xué)習(xí)樸素貝葉斯分類以及正式開始情感詞分析之前,我們首先需要了解一下貝葉斯定理的數(shù)學(xué)基礎(chǔ)。

Java實現(xiàn)基于樸素貝葉斯的情感詞分析

樸素貝葉斯(Naive Bayesian)是一種基于貝葉斯定理和特征條件獨立假設(shè)的分類方法,它是基于概率論的一種有監(jiān)督學(xué)習(xí)方法,被廣泛應(yīng)用于自然語言處理,并在機器學(xué)習(xí)領(lǐng)域中占據(jù)了非常重要的地位。在之前做過的一個項目中,就用到了樸素貝葉斯分類器,將它應(yīng)用于情感詞的分析處理,并取得了不錯的效果,本文我們就來介紹一下樸素貝葉斯分類的理論基礎(chǔ)和它的實際使用。

在學(xué)習(xí)樸素貝葉斯分類以及正式開始情感詞分析之前,我們首先需要了解一下貝葉斯定理的數(shù)學(xué)基礎(chǔ)。

貝葉斯定理

 

貝葉斯定理是關(guān)于隨機事件A和B的條件概率的定理,公式如下:

Java實現(xiàn)基于樸素貝葉斯的情感詞分析

在上面的公式中,每一項表示的意義如下:

  • P(A):先驗概率(prior probability),是在沒有任何條件限制下事件A發(fā)生的概率,也叫基礎(chǔ)概率,是對A事件概率的一個主觀判斷
  • P(A|B):在B發(fā)生的情況下A發(fā)生的可能性,也被稱為A的后驗概率(posterior probability)
  • P(B|A):似然性,也被稱為條件似然(conditional likelihood)
  • P(B):不論A是否發(fā)生,在所有情況下B發(fā)生的概率,它被稱為整體似然或歸一化常量(normalizing constant)

按照上面的解釋,貝葉斯定理可以表述為:

  • 后驗概率 = 先驗概率 * 似然性 / 歸一化常量

通俗的來說,可以理解為當我們不能確定某一個事件發(fā)生的概率時,可以依靠與該事件本質(zhì)屬性相關(guān)的事件發(fā)生的概率去推測該事件發(fā)生的概率。用數(shù)學(xué)語言來表達就是,支持某項屬性的事件發(fā)生得愈多,則該事件發(fā)生的的可能性就愈大,這個推理過程也被叫做貝葉斯推理。

在查閱的一些文檔中,P(B|A)/P(B) 可以被稱為可能性函數(shù),它作為一個調(diào)整因子,表示新信息B對事件A帶來的調(diào)整,作用是將先驗概率(主觀判斷)調(diào)整到更接近真實的概率。那么,貝葉斯定理也可以理解為:

  • 新信息出現(xiàn)后A的概率 = A的先驗概率 * 新信息帶來的調(diào)整

舉一個例子,方便大家更直觀的理解這一過程。假設(shè)統(tǒng)計了一段時間內(nèi)天氣和氣溫對于運動情況的影響,如下所示:

  1. 天氣  氣溫      運動 
  2. 晴天  非常高     游泳 
  3. 晴天  高       足球       
  4. 陰天  中       釣魚 
  5. 陰天  中       游泳 
  6. 晴天  低       游泳       
  7. 陰天  低       釣魚 

現(xiàn)在請計算在晴天,氣溫適中的情況下,去游泳的概率是多少?根據(jù)貝葉斯定理,計算過程如下:

  1. P(游泳|晴天,中溫)=P(晴天,中溫|游泳)*P(游泳)/P(晴天,中溫) 
  2.         =P(晴天|游泳)*P(中溫|游泳)*P(游泳)/[P(晴天)*P(中溫)] 
  3.         =2/3 * 1/3 *1/2 / (1/2 *1/3 ) 
  4.         =2/3 

最終得出去游泳的概率是2/3,上面就是基于貝葉斯定理,根據(jù)給定的特征,計算事件發(fā)生概率大小的過程。

貝葉斯分析的思路對于由證據(jù)的積累來推測一個事物的發(fā)生的概率具有重大作用,當我們要預(yù)測一個事物,首先會根據(jù)已有的經(jīng)驗和知識推斷一個先驗概率,然后在新證據(jù)不斷的積累的情況下調(diào)整這個概率。整個通過累積證據(jù)來得到一個事件發(fā)生概率的過程我們稱為貝葉斯分析。這樣,貝葉斯底層的思想就可以概括為,如果能夠掌握一個事情的全部信息,就能夠計算出它的一個客觀概率。

另外,在貝葉斯公式的基礎(chǔ)上進行變形,可以得到下面的公式:

Java實現(xiàn)基于樸素貝葉斯的情感詞分析

其中B1,B2,…,Bj是一個完備事件組,上面的公式可以表示在事件A已經(jīng)發(fā)生的條件下,尋找導(dǎo)致A發(fā)生的各種“原因”的Bi的概率。

樸素貝葉斯

 

在學(xué)習(xí)樸素貝葉斯之前,首先需要對貝葉斯分類進行一下了解,貝葉斯分類通過預(yù)測一個對象屬于某個類別的概率,通過比較不同類別概率的大小預(yù)測其最可能從屬的類別,是基于貝葉斯定理而構(gòu)成出來的。在處理大規(guī)模數(shù)據(jù)集時,貝葉斯分類器表現(xiàn)出較高的分類準確性。

貝葉斯分類在處理一個未知類型的樣本X時,可以先算出X屬于每一個類別Ci的概率 P(Ci|X),然后選擇其中概率最大的類別。假設(shè)有兩個特征變量x和y,并且存在兩個分類類別C1和C2,結(jié)合貝葉斯定理:

  • 如果P(C1|x,y) > P(C2|x,y),說明在x和y發(fā)生的條件下,C1比C2發(fā)生的概率要大,那么它應(yīng)該屬于類別C1
  • 反之如果P(C1|x,y) < P(C2|x,y),那么它應(yīng)該屬于類別C2

而樸素貝葉斯模型(Naive Bayesian Model)作為一種強大的預(yù)測建模算法,它在貝葉斯定理的基礎(chǔ)上進行了簡化,假定了目標的特征屬性之間相互獨立,這也是它被形容為“樸素”的原因。在實際情況中如果屬性之間存在關(guān)聯(lián),那么分類準確率會降低,不過對于解決絕大部分的復(fù)雜問題非常有效。

設(shè)在樣本數(shù)據(jù)集D上,樣本數(shù)據(jù)的特征屬性集為Java實現(xiàn)基于樸素貝葉斯的情感詞分析,類變量可被分為Java實現(xiàn)基于樸素貝葉斯的情感詞分析,即數(shù)據(jù)集D可以被分為Java實現(xiàn)基于樸素貝葉斯的情感詞分析個類別。我們假設(shè)Java實現(xiàn)基于樸素貝葉斯的情感詞分析相互獨立,那么由貝葉斯定理可得:

Java實現(xiàn)基于樸素貝葉斯的情感詞分析

對于相同的測試樣本,分母P(X)的大小是固定不變的,因此在比較后驗概率時,我們可以只比較分子的大小即可。

在這里解釋一下貝葉斯定理、貝葉斯分類和樸素貝葉斯之間的區(qū)別,貝葉斯定理作為理論基礎(chǔ),解決了概率論中的逆概率問題,在這個基礎(chǔ)上人們設(shè)計出了貝葉斯分類器,而樸素貝葉斯是貝葉斯分類器中的一種,也是最簡單和常用的分類器,可以使用下面的圖來表示它們之間的關(guān)系:

Java實現(xiàn)基于樸素貝葉斯的情感詞分析

在實際應(yīng)用中,樸素貝葉斯有廣泛的應(yīng)用,在文本分類、垃圾郵件過濾、情感預(yù)測及釣魚網(wǎng)站的檢測方面都能夠起到良好的效果。為了訓(xùn)練樸素貝葉斯模型,我們需要先在訓(xùn)練集的基礎(chǔ)上對分類好的數(shù)據(jù)進行訓(xùn)練,計算出先驗概率和每個屬性的條件概率,計算完成后,概率模型就可以使用貝葉斯原理對新數(shù)據(jù)進行預(yù)測。

貝葉斯推斷與人腦的工作機制很像,這也是它為什么能夠成為機器學(xué)習(xí)的基礎(chǔ),大腦的決策過程就是先對事物進行主觀判斷,然后搜集新的信息,優(yōu)化主觀判斷,如果新的信息符合這個主觀判斷,那就提高主觀判斷的可信度,如果不符合,就降低主觀判斷的可信度。

代碼實現(xiàn)

 

在對理論有了基本的了解后,我們開始分析怎樣將樸素貝葉斯應(yīng)用于我們文本處理的情感詞分析中。主要步驟如下:

  • 對訓(xùn)練集和測試集完成文本分詞,并通過主觀判斷標注所屬的分類
  • 對訓(xùn)練集進行訓(xùn)練,統(tǒng)計每個詞匯出現(xiàn)在分類下的次數(shù),計算每個類別在訓(xùn)練樣本中的出現(xiàn)頻率、及每個特征屬性對每個類別的條件概率(即似然概率)
  • 將訓(xùn)練好的模型應(yīng)用于測試集的樣本上,根據(jù)貝葉斯分類計算樣本在每個分類下的概率大小
  • 比較在各個分類情況下的概率大小,推測文本最可能屬于的情感分類

使用流程圖表示:

Java實現(xiàn)基于樸素貝葉斯的情感詞分析

1、準備階段

 

首先準備數(shù)據(jù)集,這里使用了對某酒店的評論數(shù)據(jù),根據(jù)主觀態(tài)度將其分為“好評”或“差評”這兩類待分類項,對每行分詞后的語句打好了情感標簽,并且已經(jīng)提前對完整語句完成了對分詞,數(shù)據(jù)格式如下:

Java實現(xiàn)基于樸素貝葉斯的情感詞分析

在每行的數(shù)據(jù)的頭部,是添加的“好評”或“差評”標簽,標簽與分詞采用tab分割,詞語之間使用空格分割。按照比例,將數(shù)據(jù)集的80%作為訓(xùn)練集,剩余20%作為測試集,分配過程盡量保證隨機原則。

2、訓(xùn)練階段

 

在訓(xùn)練階段,主要完成詞頻的統(tǒng)計工作。讀取訓(xùn)練集,統(tǒng)計出每個詞屬于該分類下出現(xiàn)的次數(shù),用于后續(xù)求解每個詞出現(xiàn)在各個類別下的概率,即詞匯與主觀分類情感之間的關(guān)系:

  1. private static void train(){ 
  2.     Map<String,Integer> parameters = new HashMap<>(); 
  3.     try(BufferedReader br = new BufferedReader(new FileReader(trainingData))){  //訓(xùn)練集數(shù)據(jù) 
  4.         String sentence; 
  5.         while(null!=(sentence=br.readLine())){ 
  6.             String[] content = sentence.split("\t| "); //以tab或空格分詞 
  7.             parameters.put(content[0],parameters.getOrDefault(content[0],0)+1); 
  8.             for (int i = 1; i < content.length; i++) { 
  9.                 parameters.put(content[0]+"-"+content[i], parameters.getOrDefault(content[0]+"-"+content[i], 0)+1); 
  10.             } 
  11.         } 
  12.     }catch (IOException e){ 
  13.         e.printStackTrace(); 
  14.     } 
  15.     saveModel(parameters); 

將訓(xùn)練好的模型保存到文件中,可以方便在下次使用時不用重復(fù)進行模型的訓(xùn)練:

  1. private static void saveModel(Map<String,Integer> parameters){ 
  2.     try(BufferedWriter bw =new BufferedWriter(new FileWriter(modelFilePath))){ 
  3.         parameters.keySet().stream().forEach(key->{ 
  4.             try { 
  5.                 bw.append(key+"\t"+parameters.get(key)+"\r\n"); 
  6.             } catch (IOException e) { 
  7.                 e.printStackTrace(); 
  8.             } 
  9.         }); 
  10.         bw.flush(); 
  11.     }catch (IOException e){ 
  12.         e.printStackTrace(); 
  13.     } 

查看保存好的模型,數(shù)據(jù)的格式如下:

  1. 好評-免費送 3 
  2. 差評-真煩 1 
  3. 好評-禮品 3 
  4. 差評-臟亂差 6 
  5. 好評-解決 15 
  6. 差評-挨宰 1 
  7. …… 

這里對訓(xùn)練的模型進行保存,所以如果后續(xù)有同樣的分類任務(wù)時,可以直接在訓(xùn)練集的基礎(chǔ)上進行計算,對于分類速度要求較高的任務(wù),能夠有效的提高計算的速度。

3、加載模型

 

加載訓(xùn)練好的模型:

  1. private static HashMap<String, Integer> parameters = null;  //用于存放模型 
  2. private static Map<String, Double> catagory=null
  3. private static String[] labels = {"好評""差評""總數(shù)","priorGood","priorBad"}; 
  4.  
  5. private static void loadModel() throws IOException { 
  6.     parameters = new HashMap<>(); 
  7.     List<String> parameterData = Files.readAllLines(Paths.get(modelFilePath)); 
  8.     parameterData.stream().forEach(parameter -> { 
  9.         String[] split = parameter.split("\t"); 
  10.         String key = split[0]; 
  11.         int value = Integer.parseInt(split[1]); 
  12.         parameters.put(key, value); 
  13.     }); 
  14.  
  15.     calculateCatagory(); //分類 

對詞進行分類,統(tǒng)計出好評及差評的詞頻總數(shù),并基于它們先計算得出先驗概率:

  1. //計算模型中類別的總數(shù) 
  2. public static void calculateCatagory() { 
  3.     catagory = new HashMap<>(); 
  4.     double good = 0.0; //好評詞頻總數(shù) 
  5.     double bad = 0.0;   //差評的詞頻總數(shù) 
  6.     double total;   //總詞頻 
  7.  
  8.     for (String key : parameters.keySet()) { 
  9.         Integer value = parameters.get(key); 
  10.         if (key.contains("好評-")) { 
  11.             good += value; 
  12.         } else if (key.contains("差評-")) { 
  13.             bad += value; 
  14.         } 
  15.     } 
  16.     total = good + bad; 
  17.     catagory.put(labels[0], good); 
  18.     catagory.put(labels[1], bad); 
  19.     catagory.put(labels[2], total); 
  20.     catagory.put(labels[3],good/total); //好評先驗概率 
  21.     catagory.put(labels[4],bad/total); //差評先驗概率 

查看執(zhí)行完后的統(tǒng)計值:

Java實現(xiàn)基于樸素貝葉斯的情感詞分析

“好評”對應(yīng)的詞匯出現(xiàn)的總次數(shù)是46316個,“差評”對應(yīng)的詞匯出現(xiàn)的總次數(shù)是77292個,訓(xùn)練集詞頻總數(shù)為123608個,并可基于它們計算出它們的先驗概率:

  1. 該文檔屬于某個類別的條件概率= 該類別的所有詞條詞頻總數(shù) / 所有詞條的詞頻總數(shù) 

4、測試階段

 

測試階段,加載我們提前準備好的測試集,對每一行分詞后的評論語句進行主觀情感的預(yù)測:

  1. private static void predictAll() { 
  2.     double accuracyCount = 0.;//準確個數(shù) 
  3.     int amount = 0;    //測試集數(shù)據(jù)總量 
  4.  
  5.     try (BufferedWriter bw = new BufferedWriter(new FileWriter(outputFilePath))) { 
  6.         List<String> testData = Files.readAllLines(Paths.get(testFilePath));    //測試集數(shù)據(jù) 
  7.         for (String instance : testData) { 
  8.             String conclusion = instance.substring(0, instance.indexOf("\t"));  //已經(jīng)打好的標簽 
  9.             String sentence = instance.substring(instance.indexOf("\t") + 1); 
  10.             String prediction = predict(sentence);  //預(yù)測結(jié)果 
  11.  
  12.             bw.append(conclusion + " : " + prediction + "\r\n"); 
  13.             if (conclusion.equals(prediction)) { 
  14.                 accuracyCount += 1.; 
  15.             } 
  16.             amount += 1; 
  17.         } 
  18.         //計算準確率 
  19.         System.out.println("accuracyCount: " + accuracyCount / amount); 
  20.     } catch (Exception e) { 
  21.         e.printStackTrace(); 
  22.     } 

在測試中,調(diào)用下面的predict方法進行分類判斷。在計算前,再來回顧一下上面的公式,在程序中進行簡化運算:

Java實現(xiàn)基于樸素貝葉斯的情感詞分析

對于同一個預(yù)測樣本,分母相同,所以我們可以只比較分子Java實現(xiàn)基于樸素貝葉斯的情感詞分析的大小。對分子部分進行進一步簡化,對于連乘預(yù)算,我們可以對其進行對數(shù)操作,變成各部分相加:

Java實現(xiàn)基于樸素貝葉斯的情感詞分析

這樣對于概率的大小比較,就可以簡化為比較 先驗概率和各個似然概率分別取對數(shù)后相加的和。先驗概率我們在之前的步驟中已經(jīng)計算完成并保存,所以這里只計算各詞匯在分類條件下的似然概率即可。predict方法的實現(xiàn)如下:

  1. private static String predict(String sentence) { 
  2.     String[] features = sentence.split(" "); 
  3.     String prediction; 
  4.  
  5.     //分別預(yù)測好評和差評 
  6.     double good = likelihoodSum(labels[0], features) + Math.log(catagory.get(labels[3])); 
  7.     double bad = likelihoodSum(labels[1], features) + Math.log(catagory.get(labels[4])); 
  8.     return good >= bad?labels[0]:labels[1]; 

在其中調(diào)用likelihood方法計算似然概率的對數(shù)和:

  1. //似然概率的計算 
  2. public static double likelihoodSum(String label, String[] features) { 
  3.     double p = 0.0; 
  4.     Double total = catagory.get(label) + 1;//分母平滑處理 
  5.     for (String word : features) { 
  6.         Integer count = parameters.getOrDefault(label + "-" + word, 0) + 1;//分子平滑處理 
  7.         //計算在該類別的情況下是該詞的概率,用該詞的詞頻除以類別的總詞頻 
  8.         p += Math.log(count / total); 
  9.     } 
  10.     return p; 

在計算似然概率的方法中,如果出現(xiàn)在訓(xùn)練集中沒有包括的詞匯,那么會出現(xiàn)它的似然概率為0的情況,為了防止這種情況,對分子分母進行了分別加1的平滑操作。

最后在主函數(shù)中調(diào)用上面的步驟,最終如果計算出基于樣本的好評概率大于等于差評概率,那么將它分類劃入“好評”,反之劃入“差評”類別,到此就完成了訓(xùn)練和測試的全過程:

  1. public static void main(String[] args) throws IOException { 
  2.     train(); 
  3.     loadModel(); 
  4.     predictAll(); 

執(zhí)行全部代碼,結(jié)果如下,可以看到獲取了93.35%的準確率。

Java實現(xiàn)基于樸素貝葉斯的情感詞分析

對比最后輸出的文檔中的標簽與預(yù)測結(jié)果,可以看到,預(yù)測結(jié)果的準確度還是非常高的。

5、總結(jié)

 

在上面的例子中,還有一些可以進行改進的地方,例如可以在前期建立情感詞庫,在特征值提取的過程中只提取情感詞,去除其余無用詞匯(如介詞等)對分類的影響,只選取關(guān)鍵的代表詞作為特征提取,達到更高的分類效率。另外,可以在建立詞庫時,將測試集的情感詞也放入詞庫,避免出現(xiàn)在某個分類條件下似然概率為零的情況,簡化平滑步驟。

此外,樸素貝葉斯的分類對于追加訓(xùn)練集的情況有很好的應(yīng)用,如果訓(xùn)練集不斷的增加,可以在現(xiàn)有訓(xùn)練模型的基礎(chǔ)上添加新的樣本值、或?qū)σ延械臉颖局档膶傩赃M行修改,在此基礎(chǔ)上,可以實現(xiàn)增量的模型修改。

原文地址:https://mp.weixin.qq.com/s/YS-eyr-kn26jFPKRNTiFHg

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 99国内精品久久久久久久黑人 | 全肉一女n男np高h乳 | 日韩欧美a| 火影小南被爆羞羞网站进入 | 国产大片网站 | 亚洲人影院 | 美女翘臀跪床被打屁股作文 | 息与子中文字幕在线 | 日日爽日日操 | 好男人好资源在线观看免费 | 91午夜视频 | caopren免费视频国产 | 亚洲免费视频一区二区三区 | 手机在线观看国产精选免费 | 亚久久伊人精品青青草原2020 | 男人的天堂在线观看视频不卡 | free哆拍拍免费永久视频 | 国产九九视频在线观看 | 亚洲色图中文字幕 | 欧美日韩视频在线成人 | caoporm国产精品视频免费 | 99日影院在线播放 | xx顶级欧美熟妞xxhd | 日韩欧美一区二区三区免费观看 | 色在线免费 | 幻女free性摘花第一次 | 77成人影视 | 激情综合 | 亚洲AV无码乱码国产麻豆穿越 | 俄罗斯一级淫片bbbb | 草莓香蕉绿巨人丝瓜榴莲污在线观看 | 精品一区久久 | 久久足恋网 | 97国产蝌蚪视频在线观看 | 色婷婷在线视频 | 日本欧美强乱视频在线 | 热99这里只有精品 | 亚洲欧美视频在线播放 | 99热色 | 国内激情自拍 | 三上悠亚精品专区久久 |