转载:https://www.iteye.com/blog/dengkane-2406703

步骤:

1 有标签的数据。数据:好评文本:pos_text.txt  差评文本:neg_text.txt

2 构造特征:词,双词搭配(Bigrams),比如“手机 非常”,“非常 好用”,“好用 !”这三个搭配作为分类的特征。以此类推,三词搭配(Trigrams),四词搭配都是可以被作为特征的.

3 特征降维:使用统计方法找到信息量丰富的特征。包括:词频(Term Frequency)、文档频率(Document Frequency)、互信息(Pointwise Mutual Information)、信息熵(Information Entropy)、卡方统计(Chi-Square)等等。

4 特征表示:nltk——[ {“特征1”: True, “特征2”: True, “特征N”: True, }, 类标签 ]

5 构建分类器并预测:选出最佳算法后可以调整特征的数量来测试准确度。(1)用分类算法训练里面的训练集(Training Set),得出分类器。(2)用分类器给开发测试集分类(Dev-Test Set),得出分类结果。(3)对比分类器给出的分类结果和人工标注的正确结果,给出分类器的准确度。

其中,nltk 主要负责处理特征提取(双词或多词搭配需要使用nltk 来做)和特征选择(需要nltk 提供的统计方法)。scikit-learn 主要负责分类算法,评价分类效果,进行分类等任务。

实验:

1.处理数据。str 是全部pos+neg的数据。类型是:str()

def text():
f1 = open('pos_text.txt','r')
f2 = open('neg_text.txt','r')
line1 = f1.readline()
line2 = f2.readline()
str = ''
while line1:
str += line1
line1 = f1.readline()
while line2:
str += line2
line2 = f2.readline()
f1.close()
f2.close()
return str

2.构建特征

#把单个词作为特征
def bag_of_words(words):
d={}
for word in words:
d[word]=True
return d print(bag_of_words(text()[:5]))
{'除': True, '了': True, '电': True, '池': True, '不': True}
import nltk
from nltk.collocations import BigramCollocationFinder
from nltk.metrics import BigramAssocMeasures #把双个词作为特征,并使用卡方统计的方法,选择排名前1000的双词
def bigram(words,score_fn=BigramAssocMeasures.chi_sq,n=1000):
bigram_finder=BigramCollocationFinder.from_words(words) #把文本变成双词搭配的形式
bigrams = bigram_finder.nbest(score_fn,n) #使用卡方统计的方法,选择排名前1000的双词
newBigrams = [u+v for (u,v) in bigrams] # bigrams知识个双词列表
return bag_of_words(newBigrams) #调用bag_of_words 变成{词:True}的字典 print(bigram(text()[:5],score_fn=BigramAssocMeasures.chi_sq,n=1000))
{'了电': True, '池不': True, '电池': True, '除了': True}
#把单个词和双个词一起作为特征
def bigram_words(words,score_fn=BigramAssocMeasures.chi_sq,n=1000):
bigram_finder=BigramCollocationFinder.from_words(words)
bigrams = bigram_finder.nbest(score_fn,n)
newBigrams = [u+v for (u,v) in bigrams] word_dict = bag_of_words(words) #单个字的字典
bigrams_dict = bag_of_words(newBigrams)#二元词组的字典
word_dict.update(bigrams_dict) #把字典bigrams_dict合并到字典word_dict中
return word_dict print(bigram_words(text()[:10],score_fn=BigramAssocMeasures.chi_sq,n=1000))
{'除': True, '了': True, '电': True, '池': True, '不': True, '给': True, '力': True, ' ': True, '都': True, '很': True, ' 都': True, '不给': True, 
'了电': True, '力 ': True, '池不': True, '电池': True, '给力': True, '都很': True, '除了': True}
import jieba
#结巴分词作为特征
def read_file(filename):
stop = [line.strip() for line in open('stopword.txt','r',encoding='utf-8').readlines()] #停用词
f = open(filename,'r')
line = f.readline()
str = []
while line:
s = line.split('\t')#去掉换行符 #print('s:',s)#['……\n'] #print('s[0]:',s[0])#['……']
fenci = jieba.cut(s[0],HMM=True) #False默认值:精准模式 参数HMM=True时,就有了新词发现的能力
str.append(list(set(fenci)-set(stop)))
line = f.readline()
return str #str 是一个整个评论的列表了
print(read_file('pos_text.txt')[:2])
[['真的', '大屏', '僵尸', '好', '敢', '出色', '300', '14', '多买块', '都', '大战', '双核', '秒杀', '帮', '苹果', '一点', '一张', 'G11', '分辨率', '入手',
'地方', '植物', '会', '\n', '值得', '16G', '请', '电池', '不给力', '才', '4', '2820', '拿下', '综合', '盖', '感觉', '回答', 'C6', '选', '10', '留言', '玩机',
'大屏幕', '一起', '放', '照相', '3', '不在乎', '哥', '不是', '非常', '画面', '水果', '游戏', '本来', '再', '贵', '机子', '朋友', '之间', '果断', ' ', '不敢',
'G14', '一会', '咨询', '差', '判定', '觉得', '小', '尽量', '办公室', '想', '高', '多天', '开后', '心动', '打算', '不会', '极品飞车', '纠结', '买', '玩', '很无语',
'不到', '安徽', '阜阳', '老婆', '很', '块', '卡', '俩', '差不多', '价格', '带', '500W'], ['9', '希望', '能够', '电池', '很漂亮', '很棒', '屏幕', '不错', '寸',
'几乎', '完机', '高', '性价比', '4', 'sense', '运行', '都', '值得', '现在', '烫手', '16', '2.3', '一点', '4.3', '长时间', '霸气', '行', '软件', '解决', '入手',
'很', '确实', '瑕不掩瑜', '其实', ' ', '流畅', '兼容', '还', '3.0', '问题', '真机', '整体', '清晰', '机无', '\n']]
from nltk.probability import  FreqDist,ConditionalFreqDist
from nltk.metrics import BigramAssocMeasures #获取信息量最高(前number个)的特征(卡方统计) def jieba_feature(number):
posWords = []
negWords = []
for items in read_file('pos_text.txt'):#把集合的集合变成集合
for item in items:
posWords.append(item)
for items in read_file('neg_text.txt'):
for item in items:
negWords.append(item) word_fd = FreqDist() #可统计所有词的词频
#FreqDist中的键为单词,值为单词的出现总次数。实际上FreqDist构造函数接受任意一个列表,
#它会将列表中的重复项给统计起来,在本例中我们传入的其实就是一个文本的单词列表。 cond_word_fd = ConditionalFreqDist() #可统计积极文本中的词频和消极文本中的词频
#条件频率分布是频率分布的集合,每个频率分布有一个不同的条件,这个条件通常是文本的类别。
#条件频率分布需要处理的是配对列表,每对的形式是(条件,事件),在示例中条件为文体类别,事件为单词。
#成员方法
#conditions(),返回条件列表
#tabulate(conditions, samples),根据指定的条件和样本,打印条件频率分布表格
#plot(conditions, samples),根据给定的条件和样本,绘制条件频率分布图 for word in posWords:
word_fd[word] += 1
cond_word_fd['pos'][word] += 1 for word in negWords:
word_fd[word] += 1
cond_word_fd['neg'][word] += 1 pos_word_count = cond_word_fd['pos'].N() #积极词的数量
neg_word_count = cond_word_fd['neg'].N() #消极词的数量
total_word_count = pos_word_count + neg_word_count word_scores = {}#包括了每个词和这个词的信息量 for word, freq in word_fd.items():#word_fd={'word':count}
pos_score = BigramAssocMeasures.chi_sq(cond_word_fd['pos'][word], (freq, pos_word_count), total_word_count)
#计算积极词的卡方统计量,这里也可以计算互信息等其它统计量.
#卡方x2值描述了自变量与因变量之间的相关程度:x2值越大,相关程度也越大 neg_score = BigramAssocMeasures.chi_sq(cond_word_fd['neg'][word], (freq, neg_word_count), total_word_count) word_scores[word] = pos_score + neg_score #一个词的信息量等于积极卡方统计量加上消极卡方统计量 best_vals = sorted(word_scores.items(), key=lambda item:item[1], reverse=True)[:number] #把词按信息量倒序排序。number是特征的维度,是可以不断调整直至最优的
best_words = set([w for w,s in best_vals]) return dict([(word, True) for word in best_words])
#调整设置,分别从四种特征选取方式开展并比较效果

def build_features():
feature = bag_of_words(text())#第一种:单个词
#feature = bigram(text(),score_fn=BigramAssocMeasures.chi_sq,n=500)#第二种:双词
#feature = bigram_words(text(),score_fn=BigramAssocMeasures.chi_sq,n=500)#第三种:单个词和双个词
#feature = jieba_feature(300)#第四种:结巴分词 posFeatures = []
for items in read_file('pos_text.txt'):
a = {}
for item in items: #item是每一句的分词列表
if item in feature.keys():
a[item]='True'
posWords = [a,'pos'] #为积极文本赋予"pos"
posFeatures.append(posWords) negFeatures = []
for items in read_file('neg_text.txt'):
a = {}
for item in items:
if item in feature.keys():
a[item]='True'
negWords = [a,'neg'] #为消极文本赋予"neg"
negFeatures.append(negWords) return posFeatures,negFeatures
#获得训练数据

posFeatures,negFeatures = build_features()

from random import shuffle
import sklearn
from nltk.classify.scikitlearn import SklearnClassifier
from sklearn.svm import SVC, LinearSVC, NuSVC
from sklearn.naive_bayes import MultinomialNB, BernoulliNB
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score shuffle(posFeatures)
shuffle(negFeatures) #把文本的排列随机化 train = posFeatures[300:]+negFeatures[300:]#训练集(70%)
test = posFeatures[:300]+negFeatures[:300]#验证集(30%) data,tag = zip(*test)#分离测试集合的数据和标签,便于验证和测试 def score(classifier):
classifier = SklearnClassifier(classifier)
classifier.train(train) #训练分类器
pred = classifier.classify_many(data) #给出预测的标签
n = 0
s = len(pred)
for i in range(0,s):
if pred[i]==tag[i]:
n = n+1
return n/s #分类器准确度 print('BernoulliNB`s accuracy is %f' %score(BernoulliNB()))
print('MultinomiaNB`s accuracy is %f' %score(MultinomialNB()))
print('LogisticRegression`s accuracy is %f' %score(LogisticRegression(solver='lbfgs')))
print('SVC`s accuracy is %f' %score(SVC(gamma='scale')))
print('LinearSVC`s accuracy is %f' %score(LinearSVC()))
#print('NuSVC`s accuracy is %f' %score(NuSVC()))

3.结果

# BernoulliNB`s accuracy is 0.858333
# **** MultinomiaNB`s accuracy is 0.871667*****
# LogisticRegression`s accuracy is 0.820000
# SVC`s accuracy is 0.805000
# LinearSVC`s accuracy is 0.795000
#第四种:结巴分词
# **** BernoulliNB`s accuracy is 0.761667*****
# MultinomiaNB`s accuracy is 0.701667
# LogisticRegression`s accuracy is 0.756667
# SVC`s accuracy is 0.688333
# LinearSVC`s accuracy is 0.733333
#第三种:单个词和双个词
# ***** BernoulliNB`s accuracy is 0.773333******
# MultinomiaNB`s accuracy is 0.688333
# LogisticRegression`s accuracy is 0.726667
# SVC`s accuracy is 0.661667
# LinearSVC`s accuracy is 0.726667
#第二种:双词
# BernoulliNB`s accuracy is 0.641667
# MultinomiaNB`s accuracy is 0.616667
#***** LogisticRegression`s accuracy is 0.668333*****
# SVC`s accuracy is 0.545000
# LinearSVC`s accuracy is 0.653333
#第一种:单个词

sklearn+nltk ——情感分析(积极、消极)的更多相关文章

  1. Python爬虫和情感分析简介

    摘要 这篇短文的目的是分享我这几天里从头开始学习Python爬虫技术的经验,并展示对爬取的文本进行情感分析(文本分类)的一些挖掘结果. 不同于其他专注爬虫技术的介绍,这里首先阐述爬取网络数据动机,接着 ...

  2. 文本情感分析(一):基于词袋模型(VSM、LSA、n-gram)的文本表示

    现在自然语言处理用深度学习做的比较多,我还没试过用传统的监督学习方法做分类器,比如SVM.Xgboost.随机森林,来训练模型.因此,用Kaggle上经典的电影评论情感分析题,来学习如何用传统机器学习 ...

  3. 文本情感分析(二):基于word2vec、glove和fasttext词向量的文本表示

    上一篇博客用词袋模型,包括词频矩阵.Tf-Idf矩阵.LSA和n-gram构造文本特征,做了Kaggle上的电影评论情感分类题. 这篇博客还是关于文本特征工程的,用词嵌入的方法来构造文本特征,也就是用 ...

  4. NTLK情感分析安装与使用的两种方式 nltk-python

    下载安装到实战详细步骤 NLTK下载安装 先使用pip install nltk 安装包 然后运行下面两行代码会弹出如图得GUI界面,注意下载位置,然后点击下载全部下载了大概3.5G. import ...

  5. 矩池云 | Tony老师解读Kaggle Twitter情感分析案例

    今天Tony老师给大家带来的案例是Kaggle上的Twitter的情感分析竞赛.在这个案例中,将使用预训练的模型BERT来完成对整个竞赛的数据分析. 导入需要的库 import numpy as np ...

  6. Stanford NLP学习笔记:7. 情感分析(Sentiment)

    1. 什么是情感分析(别名:观点提取,主题分析,情感挖掘...) 应用: 1)正面VS负面的影评(影片分类问题) 2)产品/品牌评价: Google产品搜索 3)twitter情感预测股票市场行情/消 ...

  7. 情感分析的现代方法(包含word2vec Doc2Vec)

    英文原文地址:https://districtdatalabs.silvrback.com/modern-methods-for-sentiment-analysis 转载文章地址:http://da ...

  8. 如何科学地蹭热点:用python爬虫获取热门微博评论并进行情感分析

    前言:本文主要涉及知识点包括新浪微博爬虫.python对数据库的简单读写.简单的列表数据去重.简单的自然语言处理(snowNLP模块.机器学习).适合有一定编程基础,并对python有所了解的盆友阅读 ...

  9. 使用Spark MLlib进行情感分析

    使用Spark MLlib进行情感分析             使用Spark MLlib进行情感分析 一.实验说明 在当今这个互联网时代,人们对于各种事情的舆论观点都散布在各种社交网络平台或新闻提要 ...

随机推荐

  1. 校内题目T2695 桶哥的问题——吃桶

    同T2一样外校蒟蒻可能没看过: 题目描述: 题目背景 @桶哥 桶哥的桶没有送完. 题目描述 桶哥的桶没有送完,他还有n个桶.他决定把这些桶吃掉.他的每一个桶两个属性:种类aia_iai​和美味值bib ...

  2. linux线程的实现(转)

    原文:https://www.cnblogs.com/zhaoyl/p/3620204.html 首先从OS设计原理上阐明三种线程:内核线程.轻量级进程.用户线程 内核线程 内核线程就是内核的分身,一 ...

  3. ubuntu 添加新用户并赋予root权限

    1 sudo adduser wolbo 2 sudo vim /etc/sudoers root ALL=(ALL) ALLwolbo ALL=(ALL) ALL wolbo ALL=(ALL) N ...

  4. linux 文件查找 find命令详解

    一,从索引库查找文件:locate 索引库:操作系统会周期性的遍历根文件系统,然后生成索引库 手动更新索引库:updatedb 语法:locate [OPTION]... PATTERN... 只匹配 ...

  5. JS 循环遍历 总结

    一.循环遍历语句 for...in... (ES5) 语法:javascript for(keys in obj){} 适用:遍历对象 说明: 1.keys表示obj对象的每一个键值对的键(键名),所 ...

  6. 你可能用到的Spring工具类?

    现在绝大部分项目都已经拥抱Spring生态,掌握Spring常用的工具类,是非常重要,零成本增加编码效率. 一.常用工具类 ObjectUtils org.springframework.util.O ...

  7. 测试工具Telerik Test Studio发布R2 2019|支持VS 2019

    Telerik Test Studio是一个用于功能性Web.桌面和移动测试的直观测试自动化工具,它能轻松地实现自动化测试.同时会为GUI.性能.加载和API测试提供完整的自动化测试解决方案. |更多 ...

  8. .NET界面控件DevExpress全新发布v19.1.4|更改DCT解码器

    DevExpress Universal Subscription(又名DevExpress宇宙版或DXperience Universal Suite)是全球使用广泛的.NET用户界面控件套包,De ...

  9. python类库32[序列化和反序列化之pickle]

      一 pickle pickle模块用来实现python对象的序列化和反序列化.通常地pickle将python对象序列化为二进制流或文件.   python对象与文件之间的序列化和反序列化: pi ...

  10. mysql NULL函数 语法

    mysql NULL函数 语法 作用:如果表中的某个列是可选的,那么我们可以在不向该列添加值的情况下插入新记录或更新已有的记录.这意味着该字段将以 NULL 值保存. 说明:NULL 值的处理方式与其 ...