酒店评论情感分析系统(四)——
基于机器学习(分类)的酒店评论倾向性分析
本项目通过调用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)); //显示分类结果