基于LingPipe的文本倾向性分析--LingPipe学习笔记

文本倾向性分析

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

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。

?
public  PolarityBasic(String basePath) {
         pDir = new  File(basePath, "txt_sentoken" ); //获取语料集
         categories = pDir.list(); //获取类别
         int  nGram = 4 ;
         classifer = DynamicLMClassifier.createNGramProcess(categories, nGram); //新建动态分类器
     }

我们先来看看如何训练。

?
public  void  train() throws  IOException {
         for  ( int  i = 0 ; i < categories.length; ++i) {
             String category = categories[i];
             Classification classification = new  Classification(category); //新建类别
             File dir = new  File(pDir, categories[i]);
             File[] trainFiles = dir.listFiles();
             for  ( int  j = 0 ; j < trainFiles.length; ++j) {
                 File trainFile = trainFiles[j];
                 if  (isTrainingFile(trainFile)) { //判断一下是为了让一部分数据作为训练集、一部分作为测试集
                     String review = Files.readFromFile(trainFile, "ISO-8859-1" );
                     Classified classified = new  Classified(
                             review, classification); //指定内容和类别
                     classifer.handle(classified); //训练
                 }
             }
         }
     }

这里说明一下isTrainingFile方法。我们需要一份测试集和一个训练集,但是我们只有一个语料库,只有人为分割。我原本是每次随机数一下来干的,但是有点影响速度,这里直接用文件名作为判断依据了。

?
boolean  isTrainingFile(File file) {
         return  file.getName().charAt( 2 ) != '1' ; //如果第2位为1就是测试集
     }

训练完成后使用classifer就可以进行极性分析了。

?
public  void  evaluate() throws  IOException {
         int  numTests = 0 ;
         int  numCorrect = 0 ;
         for  ( int  i = 0 ; i < categories.length; ++i) {
             String category = categories[i];
             File file = new  File(pDir, categories[i]);
             File[] testFiles = file.listFiles();
             for  ( int  j = 0 ; j < testFiles.length; ++j) {
                 File testFile = testFiles[j];
                 if  (!isTrainingFile(testFile)) {
                     String review = Files.readFromFile(testFile, "ISO-8859-1" );
                     ++numTests;
                     Classification classification = classifer.classify(review);
                     String resultCategory = classification.bestCategory();
                     if  (resultCategory.equals(category))
                         ++numCorrect;
                 }
             }
         }
         System.out.println( "测试总数:"  + numTests);
         System.out.println( "正确数:"  + numCorrect);
         System.out.println( "正确率"  + (( double ) numCorrect)
                 / ( double ) numTests);
     }

效果:

lingpipe1

将isTrainingFile修改一下

?
boolean  isTrainingFile(File file) {
         return  file.getName().charAt( 2 ) != '2' ; //如果第2位为2就是测试集
     }

lingpipi2

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

还可以这样划分

?
boolean  isTrainingFile(File file) {
         return  (file.getName().charAt( 2 ) != '2' )&&(file.getName().charAt( 2 ) != '1' );
     }

扩展

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

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

最后附上三篇参考文献:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值