tweet情感分析流程

时间:2022-05-07
本文章向大家介绍tweet情感分析流程,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

关键字全网搜索最新排名

【机器学习算法】:排名第一

【机器学习】:排名第二

【Python】:排名第三

【算法】:排名第四

前言

自然语言处理(NLP)中一个很重要的研究方向就是语义的情感分析(Sentiment Analysis)。例如IMDB上有很多关于电影的评论,那么我们就可以通过Sentiment Analysis来评估某部电影的口碑,甚至还可以据此预测它是否能够卖座。同样,豆瓣上也有很多对影视作品或者书籍的评论内容亦可以作为情感分析的语料库。对于那些电子商务网站而言,针对某一件商品,我们也可以看到留言区里为数众多的评价内容,那么同类商品中,哪个产品最受消费者喜爱呢?或许对商品评论的情感分析可以告诉我们答案。

本文尝试将机器学习和自然语言处理结合起来,以Tweet为例,演示进行Sentiment Analysis的基本方法。主要目的在于熟悉Sentiment Analysis的基本过程,深化Scikit-Learn函数库的使用,而且我们所分析的数据来自于实际数据集,而非模拟数据集,所以最终的分析结果并不保证得到非常高的准确率。要得到更高的准确率,需要在模型构建和特征选择上做更深层次的思考,而这些“思考”已经超出本文所讨论的范围。

1. 了解数据

原始数据通常包含多种其他的信息,如图片,链接等,我们仅将文字内容进行保存用于后续的情感分析。例如,

Top 5 most searched for Back-to-School topics -- the list may surprise you http://t.co/Xj21uMVo0p @bing @MSFTnews #backtoschool

@Microsoft @taehongmin1 We have an IOT workshop by @Microsoft at 11PM on the Friday - definitely worth going for inspiration! #HackThePlanet

同时,对于训练集而言,我们同时还需要拥有一个 label,其中:+1表示positive, -1表示negative,0表示neutral。

2. 数据预处理

主要进行如下的预处理

1. 剔除了@***这样的内容;

2. 对于#引导的Topic,将其视为一个独立的句子进行处理;

3. 删除了由http引导的网络地址;

4. 统一了大小写。

我们得到上述两个Tweet处理之后的结果,并将结果保存在list列表中,展现在下面。

[['top', '5', 'most', 'searched', 'for', 'back', '-', 'to', '-', 'school', 'topics', '--', 'the', 'list', 'may', 'surprise', 'you', '.'], ['back', 'to', 'school', '.']]

[['we', 'have', 'an', 'iot', 'workshop', 'by', 'at', '11pm', 'on', 'the', 'friday', '-', 'definitely', 'worth', 'going', 'for', 'inspiration', '!'], ['.'], ['hack', 'the', 'planet', '.']]

3. 构建词带

然后,根据训练数据集创建一个词袋(BOW,bag-of-word),其中存储着所有训练数据集中出现过的词汇以及它们在全文中出现的频数。目的在于剔除那些在全部训练数据集中极少出现的词汇(生僻词)以及频繁出现但毫无意义的词汇(通常称之为停词 stop words)。

在BOW基础之上,接下来就可以为每条Tweet创建创建 feature dictionaries。特征字典是指每条Tweet中出现在BOW中的词(即剔除了罕见的生僻词和停词)以及它们在该条Tweet中出现的频数构成的字典。

{'-': 2, '--': 1, '.': 2, '5': 1, 'back': 2, 'list': 1, 'may': 1, 'school': 2, 'searched': 1, 'surprise': 1, 'top': 1, 'topics': 1}

{'!': 1, '-': 1, '.': 2, '11pm': 1, 'definitely': 1, 'friday': 1, 'going': 1, 'hack': 1, 'inspiration': 1, 'iot': 1, 'planet': 1, 'workshop': 1, 'worth': 1}

到此为止,所有的预处理工作都已经完成了。训练集合测试集已经准备完成。但是上述这种形式的数据很那使用,因此,借助于Scikit-Learn中提供的特征提取(Feature Extraction)模块。

首先,我们给出它的定义原型:

class sklearn.feature_extraction.DictVectorizer(dtype=, separator='=', sparse=True,sort=True)

其中sparse是一个布尔类型的参数,用于指示是否将结果转换成scipy.sparse matrices,即稀疏矩阵,缺省情况下其赋值为True。

举个例子,

from sklearn.feature_extraction import DictVectorizer  
        measurements = [  
         {'city': 'Dubai', 'temperature': 33.},  
         {'city': 'London', 'temperature': 12.},  
         {'city': 'San Fransisco', 'temperature': 18.},  
         ]  
        vec = DictVectorizer()  
        vec.fit_transform(measurements).toarray()  
        vec.get_feature_names()  

建立稀疏矩阵的代码如下

sparse_matrix_tra = vec.fit_transform(feature_dicts_tra)  
sparse_matrix_dev = vec.transform(feature_dicts_dev)  

然后利用Logistic Regression来建立分类模型

from sklearn import linear_model  
logreg = linear_model.LogisticRegression(C = 1)  
logreg.fit(sparse_matrix_tra, labels_t)  
prediction = logreg.predict(sparse_matrix_dev)  
print(logreg)  
print("accuracy score: ")  
print(accuracy_score(labels_d, prediction))  
print(classification_report(labels_d, prediction))  

该模型对测试集的预测结果

LogisticRegression(C=1, class_weight=None, dual=False, fit_intercept=True,            intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,  
        penalty='l2', random_state=None, solver='liblinear', tol=0.0001,  
        verbose=0, warm_start=False)  
accuracy score:   
0.512848551121  
             precision    recall  f1-score   support  
         -1       0.41      0.28      0.33       360  
          0       0.46      0.69      0.55       700  
          1       0.68      0.46      0.55       769  
avg / total       0.54      0.51      0.51      1829  

该Sentiment分类模型的准确率为51.28%。当然,正如我们前面所说,这个模型显然还有很大的改进空间。