Python之ML–情感分析
深入研究自然语言处理(natual language processing,NLP)领域的一个分支–情感分析(sentiment analysis)
主要知识点如下:
清洗和准备数据
基于文本文档构建特征向量
训练机器学习模型用于区分电影的正面与负面评论
使用out-of-core学习处理大规模文本数据集
一.获取IMDb电影评论数据集
情感分析,有时也称为观点挖掘(opinion mining),是NLP领域一个非常流行的分支;它分析的是文档的情感倾向(polarity).情感分析的一个常见任务就是根据作者对某一主题所表达的观点或是情感来对文档进行分类
我们使用互联网电影数据库(Internet Movie Database,IMDb)数据集来进行测试.此数据集包含50000个关于电影的正面或负面的评论,正面的意思是影片在IMDb数据集中的评分高于6星,而负面的意思是影片的评分低于5星.我们可以通过链接:http://ai.stanford.edu/~amaas/data/sentiment/,下载电影评论数据集
aclImdb.zip
在成功提取数据集后,我们现在着手将从压缩文件中得到的各文本文档组合为一个CSV文件.把电影的评论读取到pandas的DataFrame对象中.为了实现对处理过程的可视化,同时能够预测剩余处理时间,我们将用到pyprind包
import pyprind
import pandas as pd
import os
pbar=pyprind.ProgBar(50000)
labels={'pos':1,'neg':0}
df=pd.DataFrame()
for s in ('test','train'):
for l in ('pos','neg'):
path="./data/aclImdb/%s/%s"%(s,l)
for file in os.listdir(path):
with open(os.path.join(path,file),'rb') as infile:
txt=infile.read()
df=df.append([[txt,labels[l]]],ignore_index=True)
pbar.update()
df.columns=['review','sentiment']
0% [##############################] 100% | ETA: 00:00:00
Total time elapsed: 00:03:46
执行上述代码,我们首先初始化了一个包含50000次迭代的进度条对象pbar,这也是我们准备读取的文档的数量.使用嵌套的for循环,我们迭代读取aclImdb目录下的train和test两个子目录,以及pos和neg二级子目录下的文本文件,并将其附加到DataFrame对象df中,同时加入的还有文档对应的整数型类标(1代表正面,0代表负面)
由于集成处理过后数据集中的类标是经过排序的,我们现在将使用np.random子模块下的permutation函数对DataFrame对象进行重排
import numpy as np
np.random.seed(0)
df=df.reindex(np.random.permutation(df.index))
df.to_csv('./data/movie_data.csv',index=False)
读取并输出前5个样本摘要,以此来快速确认数据以按正确格式存储
df=pd.read_csv('./data/movie_data.csv')
df.head(5)
review
sentiment
0
b’In 1974, the teenager Martha Moxley (Maggie …
1
1
b"OK… so… I really like Kris Kristofferson…
0
2
b’SPOILER Do not read this, if you think…
0
3
b’hi for all the people who have seen this won…
1
4
b’I recently bought the DVD, forgetting just h…
0
二.词袋模型简介
我们将介绍词袋模型(bag-of-words model),它将文本以数值特征向量的形式来表示.词袋模型的理念很简单,可描述如下:
我们在整个文档集上为每个词汇创建了唯一的标记,例如单词
我们为每个文档构建一个特征向量,其中包含每个单词在此文档中出现的次数
1.将单词转换为特征向量
根据每个文档中的单词数量构建词袋模型,我们可以使用scikit-learn中的CountVectorizer类.CountVectorizer以文本数据数组作为输入,其中文本数据可以是个文档或仅仅是个句子,返回的就是我们所要构建额词袋模型
import numpy as np
from sklearn.feature_extraction.text import CountVectorizer
count=CountVectorizer()
docs=np.array([
'The sum is shining',
'The weather is sweet',
'The sum is shining and the weather is sweet'
])
bag=count.fit_transform(docs)
通过调用CountVectorizer的fit_transform方法,我们构建了词袋模型的词汇库,并将下面三个