首页 > 编程知识 正文

python进行文本情感分析(如何用python进行文本分析)

时间:2023-05-03 09:22:31 阅读:344 作者:931

今天带大家完成一个中文文本情感分析的机器学习项目。一般流程如下:

数据和处理

数据情况

这里的数据是公众评论上的评论数据(rrdm老师提供),主要是评论文字和评分。让我们先读入数据,看看数据:

将numpy作为np导入

进口熊猫作为pd

data=pd.read_csv('data1.csv ')

data.head()

情感分裂

看看星域的独特价值。分数是1,2,4和5。

中文文本情感分析属于我们的分类问题(即否定和肯定)。这是分数。然后我们设计代码,使得小于3的分数为负(0),大于3的分数为正(1)。

定义一个函数,然后使用apply方法获得一个新列(数据分析中的知识点)。

def make_label(star):

如果从3:开始

返回1

else:

返回0

数据['情绪']=data.star.apply(make_label)

工具包(snownlp)

首先,我们不使用机器学习的方法。我们使用第三个库(snownlp),可以直接分析文本的情绪(记得安装),使用方法也很简单。返回正概率。

从snownlp导入SnowNLP

Text1='这东西不错'

文本2=“这东西是垃圾”

s1=SnowNLP(文本1)

s2=SnowNLP(文本2)

印刷品(s1 .情感,s2 .情感)

#结果0。58860 . 88888888861

这样,我们定义大于0.6的值为正,同样的方法可以得到结果。

def snow_result(comemnt):

s=SnowNLP(comemnt)

如果s .情绪=0.6:

返回1

else:

返回0

data[' snlp _ result ']=data.comment . apply(snow _ result)

前五行的结果看起来很差(五分之二是对的),那么有多少是对的呢?我们可以把结果和情感字段进行比较,如果相等我就计数,这样除以总样本后就可以看到大概的精度。

计数=0

对于范围内的I(len(数据)):

if data.iloc[i,2]==data.iloc[i,3]:

计数=1

打印(计数/镜头(数据))

#结果0.763

朴素贝叶斯

用前面第三库的方法,结果不是特别理想(0.763),这个方法有一个很大的缺点:针对性差。

你什么意思?众所周知,不同场景下的语言表达是不同的。例如,这在产品评估中很有用,但在博客评论中可能不适用。

因此,我们需要为这个场景训练自己的模型。本文将使用sklearn实现朴素贝叶斯模型(原理将在后面解释)。先发slearn备忘单(下面高清有下载地址)。

大致过程是:

导入数据分割数据预处理训练模型测试模型

解吧分词

首先,我们对评论数据进行分段。为什么要分词?中文和英文不一样,比如我爱python,用空格分割单词;我们中文不一样,比如我喜欢编程,我们要把它分为I/like/program(

通过空格隔开),这个主要是为了后面词向量做准备。

import jieba def chinese_word_cut(mytext): return " ".join(jieba.cut(mytext)) data['cut_comment'] = data.comment.apply(chinese_word_cut)

划分数据集

分类问题需要x(特征),和y(label)。这里分词后的评论为x,情感为y。按8:2的比例切分为训练集和测试集。

X = data['cut_comment'] y = data.sentiment from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=22)

词向量(数据处理)

电脑是没法识别文字的,只能识别数字。那文本怎么处理了,最简单的就是词向量。什么是词向量,我们通过一个案例来说明下,下面是我们的文本:

I love the dog I hate the dog

词向量处理后就是这样的:

简单的说,词向量就是我们将整个文本出现的单词一一排列,然后每行数据去映射到这些列上,出现的就是1,没出现就是0,这样,文本数据就转换成了01稀疏矩阵(这也是上文中文分词的原因,这样一个词就是一个列)。

好在,sklearn中直接有这样的方法给我们使用。CountVectorizer方法常用的参数:

max_df:在超过这一比例的文档中出现的关键词(过于平凡),去除掉。min_df:在低于这一数量的文档中出现的关键词(过于独特),去除掉。token_pattern:主要是通过正则处理掉数字和标点符号。stop_words:设置停用词表,这样的词我们就不会统计出来(多半是虚拟词,冠词等等),需要列表结构,所以代码中定义了一个函数来处理停用词表。from sklearn.feature_extraction.text import CountVectorizer def get_custom_stopwords(stop_words_file): with open(stop_words_file) as f: stopwords = f.read() stopwords_list = stopwords.split('n') custom_stopwords_list = [i for i in stopwords_list] return custom_stopwords_list stop_words_file = '哈工大停用词表.txt' stopwords = get_custom_stopwords(stop_words_file) vect = CountVectorizer(max_df = 0.8, min_df = 3, token_pattern=u'(?u)\b[^\d\W]\w+\b', stop_words=frozenset(stopwords))

如果想看到底出来的是什么数据,可通过下面代码查看。

test = pd.DataFrame(vect.fit_transform(X_train).toarray(), columns=vect.get_feature_names()) test.head()

训练模型

训练模型,很简单,用的是朴素贝叶斯算法,结果为0.899,比之前的snownlp好很多了。

from sklearn.naive_bayes import MultinomialNB nb = MultinomialNB() X_train_vect = vect.fit_transform(X_train) nb.fit(X_train_vect, y_train) train_score = nb.score(X_train_vect, y_train) print(train_score) # result 0.899375

测试数据

当然,我们需要测试数据来验证精确度了,结果为0.8275,精度还是不错的。

X_test_vect = vect.transform(X_test) print(nb.score(X_test_vect, y_test)) # result 0.8275

当然,我们也可以将结果放到data数据中:

X_vec = vect.transform(X) nb_result = nb.predict(X_vec) data['nb_result'] = nb_result

讨论和不足

样本量少模型没调参没有交叉验证

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。

  • 相关阅读