基于机器学习的情感分析是啥意思

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于机器学习的情感分析是啥意思相关的知识,希望对你有一定的参考价值。

以下以语义特征为例:


机器学习基于语义特征的情感分析


基于语义特征的情感分析先人已有研究,可以通过情感词典匹配来做,但是应用机器学习在这方面会使精确度更高些。 
以本人参与的一个项目为主,总结下相关技术点。 
背景是:分析用户评论感情色彩是积极还是消极,即是褒还是贬。

具体步骤为: 
1.有监督的人工给文本标注类标签。如有5000条评论数据,我们给其中的1000条标为积极的,再选1000条标为消极的,积极和消极就是所谓的类标签。 
2.选择特征。从积极的评论数据中按词来选择积极的所有特征。同理,从消极的评论数据中按词来选择消极的所有特征。如“这款游戏非常好玩”->”这款”->“游戏”->”非常”->”好玩”,分为四个特征词,也可以采用双词搭配,“这个游戏”和“非常好玩”作为特征。 
3.特征降维,减少特征的数量。如上“这个游戏非常好玩”中的“这个游戏”没有必要作为特征,因为“好玩”或“非常好玩”已经决定了评论是积极的。 
4.将语料文本变成使用特征表示。 
5.统计所有特征出现的次数,并按倒序排序。 
6.从以上结果中选出排序最靠前的一些特征作为最终的评判特征。 
7.使用训练数据根据特征训练分类算法,得到分类器。 
8.用测试数据检测分类器的准确度。 
我们将数据分为两部分:开发集、测试集。用开发集的数据训练分类算法得到分类器;再用分类器对测试集里的数据进行分类,给出分类预测得到的标签;对比分类标签和人工标注得到的标签的差异,计算出准确度。

参考技术A 知识
情感分析两种方法:
基于词典的方法:先对句子进行分词,然后统计个个词汇的个数,最后在情感字典中查找这些单词对应的情感值,然后可以计算出总体的情感。
机器学习的方法:输入大量句子以及这些句子的情感标签,就可以训练一个句子情感分类器,预测新的句子的情感。
机器学习方法的优点:机器学习对情感分析会更为精准,深度神经网络可以很好的分辨出一些反讽语气的句子,这些句子的情感不是通过简单的表面词汇分析可以理解的。
前馈过程接受固定大小的输入,比如二进制数;递归网络可以接受序列数据,比如文本。
使用AWS(亚马逊云服务)让你的代码在云端上更快更方便的运行。
实例
这里的实例用到的库是tflearn,tflearn是一个深度学习库,他基于TensorFlow,并且提供了更高级的API,可以很好的帮助初学者入门深度学习。
from __future__ import division, print_function, absolute_import

import tflearn
from tflearn.data_utils import to_categorical, pad_sequences
from tflearn.datasets import imdb # Internet Movie Database
数据导入
pkl:字节流形式数据,更容易转换为其他python对象
取10000单词,10%的的数据作为验证集
train, test, _ = imdb.load_data(path='imdb.pkl',
n_words=10000,
valid_portion=0.1)
将数据划分为评论集和标签集
trainX, trainY = train
testX, testY = test
数据处理
不能直接将文本数据中的字符串输入神经网络,必须先进行向量化,
神经网络作为一种算法,本质上还是对矩阵进行运算,
因此,将它们转换为数值或向量表示是必要的。
pad_sequences的作用是把输入转换为矩阵的形式,并且对矩阵进行扩充。
矩阵的扩充是为了保持输入维数的一致性。
下面的参数标明了输入的数列会扩充到100的长度,扩充的部分数值为0。
trainX = pad_sequences(trainX, maxlen=100, value=0.)
testX = pad_sequences(testX, maxlen=100, value=0.)
把评论集转位二进制向量(表示评价是积极或消极)
trainY = to_categorical(trainY, nb_classes=2)
testY = to_categorical(testY, nb_classes=2)
构造网络
定义输入层,输入数据长度为100
定义嵌入层,第一个参数是这一层接受的向量,即上一层输出的向量,共导入10000个单词,输出维度定义为128
定义LSTM(Long short term memory)层,使我们的网络能够记住序列一开始的数据,将把dropout设置为0.08,这是一种防止过拟合的技术。
定义全连接网络层,激活函数使用softmax。
对于输入做回归操作,定义优化方法,与学习率,还有损失值计算方法
net = tflearn.input_data([None, 100])
net = tflearn.embedding(net, input_dim=10000, output_dim=128)
net = tflearn.lstm(net, 128, dropout=0.8)
net = tflearn.fully_connected(net, 2, activation='softmax')
net = tflearn.regression(net, optimizer='adam', learning_rate=0.001,
loss='categorical_crossentropy')
训练网络
初始化神经网络
训练神经网络,输入训练集与验证集,show_metric=True可以输出训练日志
model = tflearn.DNN(net, tensorboard_verbose=0)
model.fit(trainX, trainY, validation_set=(testX, testY), show_metric=True,
batch_size=32)
因为注册AWS还要国外的信用卡,没有弄成,在自己笔记本上运行了40分钟,才训练好,迭代了7040次,准确度最后达到0.9475,损失值从一开始的0.5左右到了0.15。以后还是得想办法找一个免费的云服务器,跑一些小程序。
Challenge
The challenge for this video is to train a model on this dataset of video game reviews from IGN.com. Then, given some new video game title it should be able to classify it. You can use pandas to parse this dataset. Right now each review has a label that's either Amazing, Great, Good, Mediocre, painful, or awful. These are the emotions. Using the existing labels is extra credit. The baseline is that you can just convert the labels so that there are only 2 emotions (positive or negative). Ideally you can use an RNN via TFLearn like the one in this example, but I'll accept other types of ML models as well.
You'll learn how to parse data, select appropriate features, and use a neural net on an IRL pr
import tflearn
from tflearn.data_utils import to_categorical, pad_sequences, VocabularyProcessor
import pandas as pd
import numpy as np

# 数据导入
# 用pd做数据导入,这里训练集测试集随机的抽取会更好
dataframe = pd.read_csv('ign.csv').iloc[:, 1:3]

train = dataframe.iloc[:int(dataframe.shape[0]*0.9), :]
test = dataframe.iloc[int(dataframe.shape[0]*0.9):dataframe.shape[0], :]

trainX = train.title
trainY = train .score_phrase
testX = test.title
testY = test.score_phrase

# 数据处理
# 和实例不同的是这里的数据是纯文本的,处理前要转换成数据序列,用到了tflearn中的VocabularyProcessor相关方法;样本集分为11类
vocab_proc = VocabularyProcessor(15)
trainX = np.array(list(vocab_proc.fit_transform(trainX)))
testX = np.array(list(vocab_proc.fit_transform(testX)))

vocab_proc2 = VocabularyProcessor(1)
trainY = np.array(list(vocab_proc2.fit_transform(trainY))) - 1
trainY = to_categorical(trainY, nb_classes=11)
vocab_proc3 = VocabularyProcessor(1)
testY = np.array(list(vocab_proc3.fit_transform(testY))) - 1
testY = to_categorical(testY, nb_classes=11)

# 构建网络
# 现在并不清楚要按什么标准构建不同的网络,直接用的实例
net = tflearn.input_data([None, 15])
net = tflearn.embedding(net, input_dim=10000, output_dim=128)
net = tflearn.lstm(net, 128, dropout=0.8)
net = tflearn.fully_connected(net, 2, activation='softmax')
net = tflearn.regression(net, optimizer='adam', learning_rate=0.001,
loss='categorical_crossentropy')

# 训练网络
model = tflearn.DNN(net, tensorboard_verbose=0)
model.fit(trainX, trainY, validation_set=(testX, testY), show_metric=True,
batch_size=32)
Jovian's Winning Code:
Jovian的冠军代码写的很全面了,每一步的解释也很详细。这里同样把这个当做了一个分类问题,比较了三种不同的分类方式的区别,训练完成最后的深度学习网络可以达到0.5左右的正确率,输入一个游戏的名称,可以预测出这个游戏的评价等级。
依赖库
import pandas as pd
import tflearn
from tflearn.data_utils import to_categorical, pad_sequences
from tflearn.datasets import imdb
from sklearn.feature_extraction.text import CountVectorizer
from sklearn import preprocessing
数据导入
导入游戏评价数据库ign.csv
original_ign = pd.read_csv('ign.csv')
查看数据库的形状
print('original_ign.shape:', original_ign.shape)
output:
original_ign.shape: (18625, 11)
共有18625个游戏的数据,每个游戏有11项信息。其中只有游戏的评价信息(score_phrase)是我们需要关注的。下面统计游戏的各种评价。
original_ign.score_phrase.value_counts()
output
Great 4773
Good 4741
Okay 2945
Mediocre 1959
Amazing 1804
Bad 1269
Awful 664
Painful 340
Unbearable 72
Masterpiece 55
Disaster 3
Name: score_phrase, dtype: int64
可以看出评价为Great和Good的最多,而Disaster的评价只有3个。
数据处理
预处理
检查属否有null元素(缺失项)
original_ign.isnull().sum()
output:
Unnamed: 0 0
score_phrase 0
title 0
url 0
platform 0
score 0
genre 36
editors_choice 0
release_year 0
release_month 0
release_day 0
dtype: int64
将缺失值填充为空字符串(这个例子其实无需做这两步,但要养成检查缺失值的好习惯):
original_ign.fillna(value='', inplace=True)
数据划分
划分样本集和标签集:
X = ign.text
y = ign.score_phrase
分类训练集和测试集:
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1, random_state=42)
样本集处理
将样本集的字符串转变为数字序列。创建vocab,把X转化为X_word_ids。
vect = CountVectorizer(ngram_range=(1,1), token_pattern=r'\b\w1,\b')

vect.fit(X_train)
vocab = vect.vocabulary_

def convert_X_to_X_word_ids(X):
return X.apply( lambda x: [vocab[w] for w in [w.lower().strip() for w in x.split()] if w in vocab] )

X_train_word_ids = convert_X_to_X_word_ids(X_train)
X_test_word_ids = convert_X_to_X_word_ids(X_test)
序列扩充

X_test_padded_seqs = pad_sequences(X_test_word_ids , maxlen=20, value=0)
标签集处理
unique_y_labels = list(y_train.value_counts().index)
le = preprocessing.LabelEncoder()
le.fit(unique_y_labels)

y_train = to_categorical(y_train.map(lambda x: le.transform([x])[0]), nb_classes=len(unique_y_labels))
y_test = to_categorical(y_test.map(lambda x: le.transform([x])[0]), nb_classes=len(unique_y_labels))
构造网络
构造网络和实例一样
n_epoch = 100
size_of_each_vector = X_train_padded_seqs.shape[1]
vocab_size = len(vocab)
no_of_unique_y_labels = len(unique_y_labels)
net = tflearn.input_data([None, size_of_each_vector]) # The first element is the "batch size" which we set to "None"
net = tflearn.embedding(net, input_dim=vocab_size, output_dim=128) # input_dim: vocabulary size
net = tflearn.lstm(net, 128, dropout=0.6) # Set the dropout to 0.6
net = tflearn.fully_connected(net, no_of_unique_y_labels, activation='softmax') # relu or softmax
net = tflearn.regression(net,
optimizer='adam', # adam or ada or adagrad # sgd
learning_rate=1e-4,
loss='categorical_crossentropy')
训练网络
初始化
model = tflearn.DNN(net, tensorboard_verbose=0)
训练
model.fit(X_train_padded_seqs, y_train,
validation_set=(X_test_padded_seqs, y_test),
n_epoch=n_epoch,
show_metric=True,
batch_size=100)
原文:https://blog.csdn.net/qq_31707969/article/details/79361606
版权声明:本文为博主原创文章,转载请附上博文链接!

Python 基于机器学习的微博情感分析与研究

源码下载地址

中文微博情感分类语料库

  • "情感分析"是我本科的毕业设计, 也是我入门并爱上NLP的项目hhh, 当时网上相关语料库的质量都太低了, 索性就自己写了个爬虫, 一边标注一边爬, 现在就把它发出来供大家交流。因为是自己的项目,所以标注是相当认真的,还请了朋友帮忙校验,过滤掉了广告/太短/太长/表意不明等语料,语料质量是绝对可以保证的
  • 带情感标注的微博语料数量: 10000(train.txt)+500(test.txt)
  • 另一个项目对这个语料库进行了预处理, 用SVM/XGBoost/LSTM/Attention等各种机器学习和深度学习的方法训练了模型
    地址

数据格式

  • 文档的每一行代表一条语料
  • 每条语料的第一个数据为微博对应的mid,是每条微博的唯一标签,可以通过"https://m.weibo.cn/status/" + mid 访问到该条微博的网页(部分微博可能已被博主删除)
  • 第二个数据为情感标签, 0表示负面, 1表示正面
  • 其余后面部分都是微博文本
  • 微博表情都被转义成[xx]的格式, 如:
  • 微博话题/地理定位/视频、文本超链接等都转义成了%xxxx%的格式,使用正则可以很方便地将其清洗

文件说明

train.txt:

  • 10000条语料, 根据情感倾向二分类标注, 作为训练集
  • 对负面语料轻微过采样, 正: 负 = 5497:4503

test.txt:

  • 500条语料, 依据情感倾向二分类标注
  • 随机采样, 正: 负 = 7:3
  • 作为测试集

topics/XXX.txt:

  • 100条不同主题的语料, 未进行情感分类标注(文件里全部标注为1), 可用于舆情分析测试
  • 当时还不会分布式爬虫, 所以爬的比较少, 不要嫌弃QAQ

数据分析

训练集属性平均数0.95分位数
语料长度(含符号)80.9091161
语料有效词数(含停用词)38.7487
语料句数4.165311
PS: 语料长度的0.95分位数为161, 表示95%的语料长度都小于161

训练集/测试集词频统计, 已去停用词, 不同的分词方法得到的结果会略有差异

  • 训练SVM后查看支持向量, 得到了正面/负面情感最强烈的一些词汇


源码下载地址

源码下载地址

以上是关于基于机器学习的情感分析是啥意思的主要内容,如果未能解决你的问题,请参考以下文章

机器学习:基于神经网络对用户评论情感分析预测

基于机器学习和TFIDF的情感分类算法,详解自然语言处理

自然语言处理 | 基于情感词典的文本情感极性分析

[Python人工智能] 三十五.基于Transformer的商品评论情感分析 机器学习和深度学习的Baseline模型实现

Python做文本挖掘的情感极性分析

应用Python做文本挖掘的情感极性分析