文本分类之情感分析– 停用词和惯用语

改善特征提取往往可以对分类的accuracy(和precision和召回率)有显著的正面影响。在本文中,我将评估word_feats的两项修改特征提取的方法:

  1. 过滤停用词
  2. 包含二元语法搭配

为了有效地做到这一点,我们将修改前面的代码,这样我们就可以使用任意的特征提取函数,它接收一个文件中的词,并返回特征字典。和以前一样,我们将使用这些特征来训练朴素贝叶斯分类器。

import collections
import nltk.classify.util, nltk.metrics
from nltk.classify import NaiveBayesClassifier
from nltk.corpus import movie_reviews

def evaluate_classifier(featx):
    negids = movie_reviews.fileids('neg')
    posids = movie_reviews.fileids('pos')

    negfeats = [(featx(movie_reviews.words(fileids=[f])), 'neg') for f in negids]
    posfeats = [(featx(movie_reviews.words(fileids=[f])), 'pos') for f in posids]

    negcutoff = len(negfeats)*3/4
    poscutoff = len(posfeats)*3/4

    trainfeats = negfeats[:negcutoff] + posfeats[:poscutoff]
    testfeats = negfeats[negcutoff:] + posfeats[poscutoff:]

    classifier = NaiveBayesClassifier.train(trainfeats)
    refsets = collections.defaultdict(set)
    testsets = collections.defaultdict(set)

    for i, (feats, label) in enumerate(testfeats):
            refsets[label].add(i)
            observed = classifier.classify(feats)
            testsets[observed].add(i)

    print 'accuracy:', nltk.classify.util.accuracy(classifier, testfeats)
    print 'pos precision:', nltk.metrics.precision(refsets['pos'], testsets['pos'])
    print 'pos recall:', nltk.metrics.recall(refsets['pos'], testsets['pos'])
    print 'neg precision:', nltk.metrics.precision(refsets['neg'], testsets['neg'])
    print 'neg recall:', nltk.metrics.recall(refsets['neg'], testsets['neg'])
    classifier.show_most_informative_features()

词袋特征抽取的基准

这是词袋特征选择的特征抽取。

def word_feats(words):
    return dict([(word, True) for word in words])

evaluate_classifier(word_feats)

结果与前面的文章中的一样,但是我已经把它们包括在这里以供参考:

accuracy: 0.728
pos precision: 0.651595744681
pos recall: 0.98
neg precision: 0.959677419355
neg recall: 0.476
Most Informative Features
         magnificent = True              pos : neg    =     15.0 : 1.0
         outstanding = True              pos : neg    =     13.6 : 1.0
           insulting = True              neg : pos    =     13.0 : 1.0
          vulnerable = True              pos : neg    =     12.3 : 1.0
           ludicrous = True              neg : pos    =     11.8 : 1.0
              avoids = True              pos : neg    =     11.7 : 1.0
         uninvolving = True              neg : pos    =     11.7 : 1.0
          astounding = True              pos : neg    =     10.3 : 1.0
         fascination = True              pos : neg    =     10.3 : 1.0
             idiotic = True              neg : pos    =      9.8 : 1.0

停用词过滤

停用词是通常被认为没用的词。大多数搜索引擎忽略这些词,因为他们是如此普遍,包括他们将大大增加索引的大小,而不会提高精度和召回率。 NLTK附带了一个停用词语料列表,其中包括128个英文停用词。让我们看看当我们过滤掉这些词,会发生什么。

from nltk.corpus import stopwords
stopset = set(stopwords.words('english'))

def stopword_filtered_word_feats(words):
    return dict([(word, True) for word in words if word not in stopset])

evaluate_classifier(stopword_filtered_word_feats)

一个停用词过滤的词袋的结果是:

accuracy: 0.726
pos precision: 0.649867374005
pos recall: 0.98
neg precision: 0.959349593496
neg recall: 0.472

accuracy下降了0.2%,pos 的 precision和负recall也下降了!显然,停用词将信息添加到情感分析分类。我并没有包括最具信息量的特征,因为他们并没有改变。

二元语法搭配

正如在对精度和召回率的文章的末尾提到的,包括二元语法(连词)将可能提高分类精度。假设是,人们说这样的话“不是很大”,由于它认为“伟大”作为一个单独的词,这种负面的表达被词袋模型解释为 正 的。

为了找到显著二元词组,我们可以使用nltk.collocations.BigramCollocationFinder和nltk.metrics.BigramAssocMeasures。该BigramCollocationFinder维持2个内部FreqDists,一个是独立单词的频率,另一个是二元词组的频率。一旦有了这些频率分布,它可以利用BigramAssocMeasures提供的打分函数为单独的二元词组打分,比如卡方。这些计分函数度量2个词的搭配关系,二元组基本上是与每个独立的词的出现一样频繁。

import itertools
from nltk.collocations import BigramCollocationFinder
from nltk.metrics import BigramAssocMeasures

def bigram_word_feats(words, score_fn=BigramAssocMeasures.chi_sq, n=200):
    bigram_finder = BigramCollocationFinder.from_words(words)
    bigrams = bigram_finder.nbest(score_fn, n)
    return dict([(ngram, True) for ngram in itertools.chain(words, bigrams)])

evaluate_classifier(bigram_word_feats)

一些实验后,我发现,对每个文件使用200个最好的二元组产生了很大的成效:

accuracy: 0.816
pos precision: 0.753205128205
pos recall: 0.94
neg precision: 0.920212765957
neg recall: 0.692
Most Informative Features
         magnificent = True              pos : neg    =     15.0 : 1.0
         outstanding = True              pos : neg    =     13.6 : 1.0
           insulting = True              neg : pos    =     13.0 : 1.0
          vulnerable = True              pos : neg    =     12.3 : 1.0
   (‘matt‘, ‘damon‘) = True              pos : neg    =     12.3 : 1.0
      (‘give‘, ‘us‘) = True              neg : pos    =     12.3 : 1.0
           ludicrous = True              neg : pos    =     11.8 : 1.0
         uninvolving = True              neg : pos    =     11.7 : 1.0
              avoids = True              pos : neg    =     11.7 : 1.0
(‘absolutely‘, ‘no‘) = True              neg : pos    =     10.6 : 1.0

是的,你没有看错,Matt Damon显然是在电影评论中正向情绪的最佳指标之一。但是,尽管如此,这也是值得的结果

  • 精度可达近9%
  • POS精度已经增加了10%,召回率只有4%的降幅
  • 负召回已经增加了21%,precision只有不到4%的降幅

所以看来二元组的假设是正确的,包括显著二元组可以提高分类效率。请注意,它是显著的二元组所以提高了效率。我试着用nltk.util.bigrams包括所有的二元组,结果只比基准高几个点。这证明了只包括显著的特征可以提高精度,相比使用所有功能的想法。在以后的文章中,我将尝试修剪下单个词的特征,只包括显著词。

原文:http://streamhacker.com/2010/05/24/text-classification-sentiment-analysis-stopwords-collocations/

时间: 2024-10-10 12:26:27

文本分类之情感分析– 停用词和惯用语的相关文章

文本分类之情感分析 – 朴素贝叶斯分类器

情感分析正成为研究和社交媒体分析的热点领域,尤其是在用户评论和微博上.它是文本挖掘的一种特殊情况,一般关注在识别正反观点上,虽然它常不很准确,它仍然是有用的.为简单起见(因为训练数据容易获取),我将重点放在2个可能的情感分类:积极的和消极的. NLTK 朴素贝叶斯分类 NLTK附带了所有你需要的情感分析的入手的东西:一份带有分为POS和NEG类别的电影评论语料,以及一些可训练分类器.我们先从一个简单的NaiveBayesClassifier作为基准,用布尔特征提取. 词袋特征提取 所有NLTK分

文本分类之情感分析– 去除低信息量的特征

当你的分类模型有数百个或数千个特征,由于是文本分类的情况下,许多(如果不是大多数)的特点是低信息量的,这是一个不错的选择.这些特征对所有类都是通用的,因此在分类过程中作出很小贡献.个别是无害的,但汇总的话,低信息量的特征会降低性能. 通过消除噪声数据给你的模型清晰度,这样就去除了低信息量特征.它可以把你从过拟合和维数灾难中救出来.当你只使用更高的信息特征,可以提高性能,同时也降低了模型的大小,从而导致伴随着更快的训练和分类的是,使用更少的内存的大小.删除特征似乎直觉错了,但请等你看到结果. 高信

文本分类之情感分析– 准确率和召回率

Accuracy不是评估分类器的有效性的唯一度量.另外两个有用的指标是precision和recall.这两个度量可提供二元分类器的性能特征的更多视角. 分类器的 Precision Precision度量一个分类器的正确性.较高的精确度意味着更少的误报,而较低精度意味着更多的误报.这经常与recall相反,作为一种简单的方法来提高精度,以减少召回. 分类器的 Recall 召回度量分类器的完整性,或灵敏度.较高的召回意味着更少的假负,而较低的召回意味着更多的假负.提高召回率往往可以降低精确度,

谷歌做了45万次不同类型的文本分类后,总结出一个通用的“模型选择算法”...

谷歌做了45万次不同类型的文本分类后,总结出一个通用的"模型选择算法"... 2018年07月25日 17:43:55 阅读数:6 新智元报道 来源:developers.google.com 编译:肖琴.大明 [导读]谷歌官方推出"文本分类"指南教程.为了最大限度地简化选择文本分类模型的过程,谷歌在进行大约450K的文本分类实验后,总结出一个通用的"模型选择算法",并附上一个完整的流程图,非常实用. 文本分类(Text classificati

2.中文文本分类

这这一篇博客中,将系统介绍中文文本分类的流程和相关算法.先从文本挖掘的大背景开始,以文本分类算法为中心,介绍中文文本分类项目的流程以及相关知识,知识点设计中文分词,向量空间模型,TF-IDF方法,几个典型的文本分类算法和评价指标等. 本篇主要有: 朴素的贝叶斯算法 KNN最近邻算法. 2.1 文本挖掘与文本分类的概念 简单来说,文本挖掘就是从已知的大量文本数据中提取一些未知的最终可能用过的知识的过程,也就是从非结构化的文本中寻找知识的过程.文本挖掘主要领域有: 搜索和信息检索:存储和文本文档的检

NLP系列(2)_用朴素贝叶斯进行文本分类(上)

作者:寒小阳 && 龙心尘 时间:2016年1月. 出处:http://blog.csdn.net/longxinchen_ml/article/details/50597149 http://blog.csdn.net/han_xiaoyang/article/details/50616559 声明:版权全部,转载请联系作者并注明出处 1. 引言 贝叶斯方法是一个历史悠久.有着坚实的理论基础的方法,同一时候处理非常多问题时直接而又高效.非常多高级自然语言处理模型也能够从它演化而来.因此,

中文文本分类

本文介绍文本挖掘与文本分类的一些基本概念和流程,为后续学习分类算法做好铺垫. 一. 文本挖掘的概念 文本挖掘(Text Mining)是从非结构化文本信息中获取用户感兴趣或者有用的模式 的过程.其中被普遍认可的文本挖掘定义如下:文本挖掘是指从大量文本数据中抽取事先未知的.可理解的.最终可用的知识的过程,同时运用这些知识更好地组织信息以便将来参考. 简言之,文本挖掘就是从非结构化的文本中寻找知识的过程. 文本挖掘的七个主要领域: (1)搜索和信息检索(IR):存储和文本文档的检索,包括搜索引擎和关

BERT 预训练模型及文本分类

BERT 预训练模型及文本分类 介绍 如果你关注自然语言处理技术的发展,那你一定听说过 BERT,它的诞生对自然语言处理领域具有着里程碑式的意义.本次试验将介绍 BERT 的模型结构,以及将其应用于文本分类实践. 知识点 语言模型和词向量 BERT 结构详解 BERT 文本分类 BERT 全称为 Bidirectional Encoder Representations from Transformer,是谷歌在 2018 年 10 月发布的语言表示模型.BERT 通过维基百科和书籍语料组成的庞

文本分类实战

文本分类实战 分类任务 算法流程 数据标注 特征抽取 特征选择 分类器 训练与评估 坑 分词 特征重要度 有偏训练集 模型大小优化 One More Thing… term 扩展 Distributed Representation 分类任务 其实工程上对于文本分类的需求还是挺多的,主要可以分为下面两类,并对每类给了两个例子. 二分类   色情新闻分类 这是一个非平衡数据集的二分类问题,因为色情新闻数是远小于非色情新闻数的.   判断是否医疗Query 这个就关系到搜索变现了,还记得莆田系”事件