(4.3)基于机器学习(分类)的酒店评论倾向性分析

酒店评论情感分析系统(四)——

基于机器学习(分类)的酒店评论倾向性分析

  本项目通过调用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));  //显示分类结果    

 

 

 

posted @ 2014-10-17 16:05  CherishFu  阅读(1801)  评论(9编辑  收藏  举报