酒店評論情感分析系統(四)——
基於機器學習(分類)的酒店評論傾向性分析
本項目通過調用LingPipe中的DynamicLMClassifier,對已標注的“中文情感挖掘酒店評論語料”庫的學習,構造一個基本極性分析的分類器。然后用此分類器對GUI界面輸入的評論文本進行基本極性分析(Positive (favorable) vs. Negative (unfavorable)),返回的結果是對評論文本的總體評價。
環境:
1. 操作系統:windows7,X86,32位
2. Java JDK1.6
3. Eclipse3.4
4. LingPipe4.1
5. NetBeans6.9
項目運行圖示:
下面介紹一下項目是如何實現的。
前提條件:
1) 在Eclipse中新建一個名為SentimentAnalysis工程,配置LingPipe開源包
2) 在SentimentAnalysis工程下創建一個目錄POLARITY_DIR\ txt_sentoken,里面放置語料庫【”中文情感挖掘酒店評論語料”】,其中包含10000個已標注的文本。
構造分類器
在項目下新建一個類MyClassifier,用來訓練分類器。
1 package my.SentimentAnalysis;
2
3 import com.aliasi.util.Files;
4 import com.aliasi.classify.Classification;
5 import com.aliasi.classify.Classified;
6 import com.aliasi.classify.DynamicLMClassifier;
7 import com.aliasi.lm.NGramProcessLM;
8
9 import java.io.File;
10 import java.io.IOException;
11
12 public class MyClassifier {
13 //定義變量和初始化
14 File mPolarityDir;
15 String[] mCategories;
16 DynamicLMClassifier<NGramProcessLM> tClassifier;
17
18 MyClassifier() {
19 int nGram = 8;
20 mPolarityDir = new File("POLARITY_DIR/txt_sentoken"); //獲取語料集
21 mCategories = mPolarityDir.list(); //獲取類別
22 tClassifier = DynamicLMClassifier.createNGramProcess(mCategories,nGram); //構造分類器
23 try {
24 train();
25 } catch (ClassNotFoundException e) {
26 // TODO Auto-generated catch block
27 e.printStackTrace();
28 } catch (IOException e) {
29 // TODO Auto-generated catch block
30 e.printStackTrace();
31 }
32 }
33
34 //分類器訓練
35 void train() throws ClassNotFoundException,IOException {
36 for (int i = 0; i < mCategories.length; ++i) {
37 String category = mCategories[i];
38 Classification classification = new Classification(category);
39 File file = new File(mPolarityDir,mCategories[i]);
40 File[] trainFiles = file.listFiles();
41 for (int j = 0; j < trainFiles.length; ++j) {
42 File trainFile = trainFiles[j];
43 String review = Files.readFromFile(trainFile,"ISO-8859-1");
44 Classified<CharSequence> classified = new Classified<CharSequence>(review,classification);
45 tClassifier.handle(classified);
46 }
47 }
48 }
49
50 //返回分類器
51 public DynamicLMClassifier<NGramProcessLM> getClassifier(){
52 return tClassifier;
53 }
54 }
補充:
此分類器的正確率為82.88%,在10000個評論文本中,通過對9778個文本進行訓練,對222個文本進行測試。
構造GUI界面
本項目的GUI界面是在NetBeans平台下,利用JFrame窗體中的awt與swing組件,通過自由拖放和組件相關事件的處理而生成,此處細節不予說明,如有需要,可以自行參考NetBeans的學習教程。
定義和初始化分類器變量:
1 DynamicLMClassifier<NGramProcessLM> sClassifier;
2 MyClassifier mClassifier = new MyClassifier();
3 /** Creates new form SentimentAnalysisUI */
4 public SentimentAnalysisUI() {
5 initComponents();
6 sClassifier = mClassifier.getClassifier(); //分類器
7 }
界面中commit按鈕所觸發的事件:
1 String temp,review, result = null;
2 temp = String.valueOf(jTextArea1.getText()); //界面輸入的評論文本
3 review = new String(temp.getBytes("GB2312"),"ISO-8859-1"); //文本編碼轉換
4 Classification classification = sClassifier.classify(review); //分類
5 result = String.valueOf(classification.bestCategory()); //分類結果
6 jTextArea2.setText(String.valueOf(result)); //顯示分類結果
