使用 Python 构建 Twitter 情绪分析

发布日期:2026-07-19 08:51:06  来源 : 杭州电子商务研究院    浏览量 :0
杭州电子商务研究院 发布日期:2026-07-19 08:51:06  
0

介绍

对推文文本中表达的观点进行分类的能力(尤其是确定作者的态度是积极、消极还是中立)非常有价值。在本指南中,我们将使用称为情绪分析的过程对 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% 的准确率。

如果您有任何疑问,请随时通过CodeAlphabet与我联系

以上内容来自杭州电子商务研究院推送
分享到:

长按或扫码识别 分享给好友

长按或扫码识别 分享给好友
关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
Copyright © 2025-2027 ToB产业网址导航 公安备案 浙公网安备33010602013138号 浙ICP备16025413号-9
支持 反馈 关注 数据