[lingpipe学习笔记]基于LingPipe的文本倾向性分析

lingpipe是一个非常全面的自然语言处理工具包,它包含很多自然语言处理常用的功能,如命名实体识别,分词,词性标注,分类聚类等。下文主要讲述的是将lingpipe用到文本倾向性分析。

文本倾向性分析

转自:http://www.cnblogs.com/htynkn/archive/2012/06/17/lingpipe_1.html

文本倾向性分析(情感分析 )是将用户的观点分为“正面”和“负面”,有时候会多一个“中性”。文本倾向性分析一个比较直观的应用就是追踪用户对于一个事物的观点和偏好,比如分析豆瓣上一个电影的评论进行分析。正因为如此情感分析又被称为观点挖掘。

LingPipe

lingpipe 是alias公司开发的一款自然语言处理软件包,包括主题分类、句题检测、字符语言建模等十余个模块。而且文档完整,甚至每一个算法都有论文参考。更难能可贵的是它支持中文。

官方地址:http://alias-i.com/lingpipe/

下载地址:http://alias-i.com/lingpipe/web/download.html

LingPipe分为两个大块,一块是LingPipe核心文件,另外一块是LingPipe的模型类。需要支持中文的话需要下载Chinese Word Segmentation模块。

准备语料库

语料库在语言学上意指大量的文本,通常经过整理,具有既定格式与标记。

一般而言做情感分析有个很重要的步骤就是采集观点并进行整理,但由于应用场景不同,处理方法也不同。为了方便起见,这里使用已经处理好的语料库。Movie Review Data的polarity dataset v2.0,包含1000个正面的观点和1000个负面观点。当然这个是英文的哈。

基本极性分析

基本极性是指事物从样本来看所处的整体倾向,比如:一本书,用户对其的情感倾向是正面的,这样的断言就是一个基本极性断言。

基本极性的分析直接使用LingPipi的DynamicLMClassifier即可。

大致上来讲分为两步,第一步训练,第二步进行分析。

新建一个类名为PolarityBasic。

[java]  view plain copy
  1. public PolarityBasic(String basePath) {  
  2.         pDir =newFile(basePath,"txt_sentoken");//获取语料集  
  3.         categories = pDir.list();//获取类别  
  4.         intnGram =4;  
  5.         classifer = DynamicLMClassifier.createNGramProcess(categories, nGram);//新建动态分类器  
  6.     }  


我们先来看看如何训练。
[java]  view plain copy
  1. public void train() throwsIOException {  
  2.         for(inti =0; i < categories.length; ++i) {  
  3.             String category = categories[i];  
  4.             Classification classification =newClassification(category);//新建类别  
  5.             File dir =newFile(pDir, categories[i]);  
  6.             File[] trainFiles = dir.listFiles();  
  7.             for(intj =0; j < trainFiles.length; ++j) {  
  8.                 File trainFile = trainFiles[j];  
  9.                 if(isTrainingFile(trainFile)) {//判断一下是为了让一部分数据作为训练集、一部分作为测试集  
  10.                     String review = Files.readFromFile(trainFile,"ISO-8859-1");  
  11.                     Classified classified =newClassified(  
  12.                             review, classification);//指定内容和类别  
  13.                     classifer.handle(classified);//训练  
  14.                 }  
  15.             }  
  16.         }  
  17.     }  


这里说明一下isTrainingFile方法。我们需要一份测试集和一个训练集,但是我们只有一个语料库,只有人为分割。我原本是每次随机数一下来干的,但是有点影响速度,这里直接用文件名作为判断依据了。
[java]  view plain copy
  1. boolean isTrainingFile(File file) {  
  2.         returnfile.getName().charAt(2) !='1';//如果第2位为1就是测试集  
  3.     }  
训练完成后使用classifer就可以进行极性分析了。
[java]  view plain copy
  1. public void evaluate() throwsIOException {  
  2.         intnumTests =0;  
  3.         intnumCorrect =0;  
  4.         for(inti =0; i < categories.length; ++i) {  
  5.             String category = categories[i];  
  6.             File file =newFile(pDir, categories[i]);  
  7.             File[] testFiles = file.listFiles();  
  8.             for(intj =0; j < testFiles.length; ++j) {  
  9.                 File testFile = testFiles[j];  
  10.                 if(!isTrainingFile(testFile)) {  
  11.                     String review = Files.readFromFile(testFile,"ISO-8859-1");  
  12.                     ++numTests;  
  13.                     Classification classification = classifer.classify(review);  
  14.                     String resultCategory = classification.bestCategory();  
  15.                     if(resultCategory.equals(category))  
  16.                         ++numCorrect;  
  17.                 }  
  18.             }  
  19.         }  
  20.         System.out.println("测试总数:"+ numTests);  
  21.         System.out.println("正确数:"+ numCorrect);  
  22.         System.out.println("正确率"+ ((double) numCorrect)  
  23.                 / (double) numTests);  
  24.     }  

效果:

图片分享:

将isTrainingFile修改一下

[java]  view plain copy
  1. boolean isTrainingFile(File file) {  
  2.         returnfile.getName().charAt(2) !='2';//如果第2位为2就是测试集  
  3.     }  

图片分享:

就正确率而言怎么划分训练集和测试集影响不大。

还可以这样划分

[java]  view plain copy
  1. boolean isTrainingFile(File file) {  
  2.         return(file.getName().charAt(2) !='2')&&(file.getName().charAt(2) !='1');  
  3.     }  

扩展

基本极性分析只是文本倾向性分析一个很简单的部分,如果需要深入的话,LingPipe还可以实现主观性分析、层次极性分析等。

如果需要支持中文的话,请下载words-zh-as.CompiledSpellChecker。

最后附上三篇参考文献:

  • Bo Pang, Lillian Lee, and Shivakumar Vaithyanathan. 2002. Thumbs up? Sentiment Classification using Machine Learning Techniques. EMNLP Proceedings.
  • Bo Pang and Lillian Lee. 2004. A Sentimental Education: Sentiment Analysis Using Subjectivity Summarization Based on Minimum Cuts.ACL Proceedings.
  • Bo Pang and Lillian Lee. 2005. Seeing stars: Exploiting class relationships for sentiment categorization with respect to rating scales.ACL Proceedings.

你可能感兴趣的:([lingpipe学习笔记]基于LingPipe的文本倾向性分析)