使用 Python 构建 Twitter 情绪分析
介绍
对推文文本中表达的观点进行分类的能力(尤其是确定作者的态度是积极、消极还是中立)非常有价值。在本指南中,我们将使用称为情绪分析的过程对 Twitter 上人们对名为 #hashtag 的假设主题的观点进行分类。
有不同的序数尺度用于对推文进行分类。五点序数尺度包括五个类别:非常负面、略微负面、中立、略微正面和非常正面。三点序数尺度包括负面、中立和正面;两点序数尺度包括负面和正面。在本指南中,我们将使用三点序数尺度对带有 #hashtag 的推文进行分类。
入门
情感分析涉及自然语言处理,因为它处理的是人类书写的文本。您必须下载一些 Python 库才能使用代码。使用pip install <library>来安装它们。
设置
要训练机器学习模型,我们需要数据。您可以在此处下载本指南中使用的数据集。
导入所需的库。
import pandas as pd
import numpy as np
import re
import string
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import train_test_split
from nltk.stem import PorterStemmer
from nltk.stem import WordNetLemmatizer
# ML Libraries
from sklearn.metrics import accuracy_score
from sklearn.naive_bayes import MultinomialNB
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
# Global Parameters
stop_words = set(stopwords.words('english'))
加载数据集
下载 CSV 后,您会看到已有 160 万条推文被手动编码为三类。
该数据集以 3 点序数标度对目标变量进行编码:0 = 负面,2 = 中性,4 = 正面。
def load_dataset(filename, cols):
dataset = pd.read_csv(filename, encoding='latin-1')
dataset.columns = cols
return dataset
数据集有六列 ['target', 't_id', 'created_at', 'query', 'user', 'text'],但我们只对 ['text', 'target'] 感兴趣。如果愿意,您还可以包含其他列。为了使其可扩展,您需要一个小脚本。
def remove_unwanted_cols(dataset, cols):
for col in cols:
del dataset[col]
return dataset
预处理推文
这是任何自然语言处理 (NLP) 任务中必不可少的步骤之一。数据科学家永远不会得到经过过滤的、随时可用的数据。为了使其可行,需要进行大量处理。
字母大小写:将所有字母转换为大写或小写。
标记化:将推文转换为标记。标记是文本中用空格分隔的单词。
去噪:消除不需要的字符,例如 HTML 标签、标点符号、特殊字符、空格等。
停用词删除:有些词对机器学习模型贡献不大,所以删除它们是很好的。停用词列表可以由nltk库定义,也可以是业务特定的。
规范化:规范化通常是指一系列相关任务,旨在将所有文本放在同一级别。将文本转换为小写、删除特殊字符和删除停用词将消除基本的不一致之处。规范化可改善文本匹配。
词干提取:从单词中去除词缀(外接词、后缀、前缀、中缀)以获得词干。Porter 词干提取是最广泛使用的技术,因为它非常快。通常,词干提取会切断单词的末尾,而且大多数情况下效果很好。
- 例如:工作 -> 工作
词形还原:目的与词干提取相同,但提取单词的词干有时会丢失单词的实际含义。词形还原通常指使用词汇和词形分析来正确处理问题。它返回单词的基本形式或词典形式,也称为词干。
- 例如:更好 -> 好。
def preprocess_tweet_text(tweet):
tweet.lower()
# Remove urls
tweet = re.sub(r"http\S+|www\S+|https\S+", '', tweet, flags=re.MULTILINE)
# Remove user @ references and '#' from tweet
tweet = re.sub(r'\@\w+|\#','', tweet)
# Remove punctuations
tweet = tweet.translate(str.maketrans('', '', string.punctuation))
# Remove stopwords
tweet_tokens = word_tokenize(tweet)
filtered_words = [w for w in tweet_tokens if not w in stop_words]
#ps = PorterStemmer()
#stemmed_words = [ps.stem(w) for w in filtered_words]
#lemmatizer = WordNetLemmatizer()
#lemma_words = [lemmatizer.lemmatize(w, pos='a') for w in stemmed_words]
return " ".join(filtered_words)
词干提取比词形还原更快。您可以取消注释代码并查看结果如何变化。注意:不要同时应用两者。请记住,词干提取和词形还原都是规范化技术,建议仅使用一种方法进行规范化。让您的项目需求指导您的决定,或者您可以随时进行实验并查看哪种方法能产生更好的结果。在这种情况下,词干提取和词形还原产生的准确率几乎相同。
- 向量化数据:向量化是将标记转换为数字的过程。这是一个重要的步骤,因为机器学习算法处理的是数字而不是文本。
在本指南中,您将使用 tf-idf 实现矢量化。还有其他技术,例如 Bag of Words 和 N-grams。
def get_feature_vector(train_fit):
vector = TfidfVectorizer(sublinear_tf=True)
vector.fit(train_fit)
return vector
重要提示:我使用数据集作为语料库来制作 tf-idf 向量。训练和测试时应使用相同的向量结构。
目标列由整数值 0、2 和 4 组成。但用户通常不希望以这种形式显示结果。为了将整数结果转换为用户容易理解的形式,您可以实现一个小脚本。
def int_to_string(sentiment):
if sentiment == 0:
return "Negative"
elif sentiment == 2:
return "Neutral"
else:
return "Positive"```
整合一切
在本节中,我们将调用您创建的所有函数。您将看到用于预测的朴素贝叶斯和逻辑回归算法。这两种算法在 NLP 中非常流行,尽管您也可以尝试其他选项。
# Load dataset
dataset = load_dataset("data/training.csv", ['target', 't_id', 'created_at', 'query', 'user', 'text'])
# Remove unwanted columns from dataset
n_dataset = remove_unwanted_cols(dataset, ['t_id', 'created_at', 'query', 'user'])
#Preprocess data
dataset.text = dataset['text'].apply(preprocess_tweet_text)
# Split dataset into Train, Test
# Same tf vector will be used for Testing sentiments on unseen trending data
tf_vector = get_feature_vector(np.array(dataset.iloc[:, 1]).ravel())
X = tf_vector.transform(np.array(dataset.iloc[:, 1]).ravel())
y = np.array(dataset.iloc[:, 0]).ravel()
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=30)
# Training Naive Bayes model
NB_model = MultinomialNB()
NB_model.fit(X_train, y_train)
y_predict_nb = NB_model.predict(X_test)
print(accuracy_score(y_test, y_predict_nb))
# Training Logistics Regression model
LR_model = LogisticRegression(solver='lbfgs')
LR_model.fit(X_train, y_train)
y_predict_lr = LR_model.predict(X_test)
print(accuracy_score(y_test, y_predict_lr))
朴素贝叶斯的准确率接近 76%,而逻辑回归的准确率接近 79%。这些准确率数据是在没有实施词干提取或词形还原的情况下记录的。使用更好的技术,您可能会获得更好的准确率。
实时信息测试
test_file_name = "trending_tweets/08-04-2020-1586291553-tweets.csv"
test_ds = load_dataset(test_file_name, ["t_id", "hashtag", "created_at", "user", "text"])
test_ds = remove_unwanted_cols(test_ds, ["t_id", "created_at", "user"])
# Creating text feature
test_ds.text = test_ds["text"].apply(preprocess_tweet_text)
test_feature = tf_vector.transform(np.array(test_ds.iloc[:, 1]).ravel())
# Using Logistic Regression model for prediction
test_prediction_lr = LR_model.predict(test_feature)
# Averaging out the hashtags result
test_result_ds = pd.DataFrame({'hashtag': test_ds.hashtag, 'prediction':test_prediction_lr})
test_result = test_result_ds.groupby(['hashtag']).max().reset_index()
test_result.columns = ['heashtag', 'predictions']
test_result.predictions = test_result['predictions'].apply(int_to_string)
print(test_result)
在test_file_name变量中将文件名替换为您自己的名称。
结论
希望你喜欢阅读本指南。情绪分析是一个热门项目,几乎每个数据科学家都会在某个时候进行。它可以解决很多问题,这取决于你想如何使用它。
我强烈建议使用不同的矢量化技术,并对数据集应用特征提取和特征选择。尝试实现更多的机器学习模型,你可能会获得超过 85% 的准确率。
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~