驭,Python中文文本情感剖析,贵州旅游

今日带咱们完结一个中文文本情感分析的机器学习项目,大约的流程如下:

数据明格斯迪格斯怎样打状况和处理

数据状况

这儿的数据为大众点评上的谈论数据(王树义教师供给),首要便是谈论文字和打分。咱们首要读入数据,看下数据的状况:

import n驭,Python中文文本情感分析,贵州旅行umpy as np
import pandas as pd
data = pd.read_csv('data1.csv')
data.head()

情感区分

对star字段看仅有值,打分有1,2,4,5。

中文文本情感分析归于咱们的分类问题(也便是消沉和活跃),这儿是分数,那咱们规划代码,让分数小于3的为消沉(0),大于3的便是活跃(1)。

界说一个函数,然后用apply办法,这样就得到了一个新列(数据分析里的知识点)

def make_label(star):
if star > 3:
return 1
else:
return 0

data['sentiment'] = data.star.apply(make_label)

工具包(snownlp)

咱们首要不必大胸妹子机器学习办法,咱们用一个第三库(snownlp),这个库能够直接对文本进行情感分析(记住装置),运用办法也是很简略。回来的是活跃性的概率。

from snownlp import SnowNLP
text1 = '这个东西不错'
text2 = '这个东西很废物'
s1 = SnowNLP(text1)
s2 = SnowNLP(text2)
print(s1.sentiments,s2.sentiments)
# result 0.8623218777387431 0.21406279508712744

这样,咱们就界说大于0.6,便是活跃的,相同的办法,就能得到成果。

def snow_result(comemnt):
s = SnowNLP(comemnt)
if s.sentiments >= 0.6:
return 1
else:
return 0

data['snlp_result'] = data.comment.apply(snow_result)

上面前五行的成果看上去很差(5个就2个是对的),那究竟有多少是对的了?咱们能够将成果与sentiment字段比照,持平的我就计数,这样在除以总样本,就能看大约的精度了。驭,Python中文文本情感分析,贵州旅行

counts =黑铁的遗产 0
for i in range(len(data)):
if data.iloc[i,2] == data.iloc[i,3]:
counts+=1
print(counts/len(data))
# result 0.763

朴素贝叶斯

前面运用第三库的办法,成果不是特别抱负(0.763),并且这种办法存在一个很大的坏处:针对性差。

什么意思了?咱们都知道,不同场景下,语言表达都是不同的,例如这个在产品点评中有用,在博客谈论深海恶灵中或许就不适用了。

所以,咱们需求针对这个场景,练习自己的模型。本文将运用sklearn完成朴素贝叶斯奥利司他胶囊模型(原理在后文中解说)。slearn西西小抄先送上(下文有高清下载地址)。

大约流程为:

  • 导入数据
  • 切分数据
  • 数据预处理
  • 练习模型
  • 测验模型

jieba分词

首要,咱们对谈论数据分词。为什么要分词了?中文和英文不一样,例如:i love python,便是经过空prounce格来分词的;咱们中文不一样,例如:我喜爱编程,咱们要分红我/喜爱/编程(经过空格离隔),这个首要是为了后边词向量做准备。

import jieba
def chinese_word_cut(mytext):
return " ".join(jieba.cut(驭,Python中文文本情感分析,贵州旅行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中直接有这样的办法给咱们运用。Count驭,Python中文文本情感分析,贵州旅行Vectorizer办法常用的参数:

  • max_df:在超越这一份额的文档中呈现的关键词(过于普通),去除去。
  • min_出彩我国人龙拳小子df:在低于这一数量的文档中呈现的关键词(过于独为女孩化装特),去除去。
  • token_pattern:首要是经过正则处理掉数字和标点符号。
  • stop_words:设广州地铁3号线置停用词表,这样的驭,Python中文文本情感分析,贵州旅行词咱们就不会计算出来(多半是虚拟词,冠词等等),需求列表结构,所以代码中界说了一个函数来处理停用词表。
from sklearn.fe深圳市公安局ature_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 interest= 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(),驭,Python中文文本情感分析,贵州旅行 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.tra驭,Python中文文本情感分析,贵州旅行nsform(X_test)
print(nb.score(X_test_vect, y_test))
# result 0.8275

当然,咱们也能够将成果放到data数据中:

X_vec = vect.transform(X)邹智文
nb_resrecoverult = nb.predict(X_vec)
data['nb_result'] = nb_result

评论和缺乏

  • 样本量少
  • 模型没调参
  • 没有穿插验证