新冠病毒(COVID-19)是一种由新型冠状病毒引起的传染病。大多数感染者会出现轻微到中度的呼吸道疾病,部分人无需特殊治疗即可康复。老年人和有基础疾病如心血管疾病、糖尿病、慢性呼吸系统疾病和癌症的患者更可能出现严重病情。
在本文中,将使用一个包含关于新冠病毒的推文数据集进行情感分析。数据集可以从kaggle.com获取,其中包含了用户的地理位置、推文日期、原始推文文本以及情感标签。
首先,需要导入处理模型所需的库,例如pandas用于数据处理,re用于正则表达式,nltk用于自然语言处理,特别是其中的stopwords模块。
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import re
import nltk
nltk.download('stopwords')
from nltk.corpus import stopwords
接下来,读取名为“Corona_NLP_train.csv”的文件,并查看数据集的前5条记录。
data = pd.read_csv("Corona_NLP_train.csv",encoding='latin1')
df = pd.DataFrame(data)
df.head()
然后,使用matplotlib和seaborn库进行数据可视化,以了解数据的分布情况。
plt.figure(figsize=(10,5))
sns.countplot(x='Sentiment', data=df, order=['Extremely Negative', 'Negative', 'Neutral', 'Positive', 'Extremely Positive'], )
此外,还可以通过正则表达式函数来清除推文中的符号和特殊字符,以获得更纯净的数据。
reg = re.compile("(@[A-Za-z0-9]+)|(#[A-Za-z0-9]+)|([^0-9A-Za-z t])|(w+://S+)")
tweet = []
for i in df["OriginalTweet"]:
tweet.append(reg.sub(" ", i))
df = pd.concat([df, pd.DataFrame(tweet, columns=["CleanedTweet"])], axis=1, sort=False)
通过上述代码,得到了清洗后的数据。接下来,将文本转换为词项矩阵,并使用TfidfVectorizer进行向量化。
from sklearn.feature_extraction.text import TfidfVectorizer
stop_words = set(stopwords.words('english'))
vectoriser = TfidfVectorizer(stop_words=None)
使用LabelEncoder将分类值转换为数值。
X_train = vectoriser.fit_transform(df["CleanedTweet"])
from sklearn.preprocessing import LabelEncoder
encoder = LabelEncoder()
y_train = encoder.fit_transform(df['Sentiment'])
然后,使用多项式朴素贝叶斯分类器进行模型训练。
from sklearn.naive_bayes import MultinomialNB
classifier = MultinomialNB()
classifier.fit(X_train, y_train)
对于测试数据,同样执行上述操作。
test_data = pd.read_csv("Corona_NLP_test.csv",encoding='latin1')
test_df = pd.DataFrame(test_data)
reg1 = re.compile("(@[A-Za-z0-9]+)|(#[A-Za-z0-9]+)|([^0-9A-Za-z t])|(w+://S+)")
tweet = []
for i in test_df["OriginalTweet"]:
tweet.append(reg1.sub(" ", i))
test_df = pd.concat([test_df, pd.DataFrame(tweet, columns=["CleanedTweet"])], axis=1, sort=False)
X_test = vectoriser.transform(test_df["CleanedTweet"])
y_test = encoder.transform(test_df["Sentiment"])
y_pred = classifier.predict(X_test)
pred_df = pd.DataFrame({'Actual': y_test, 'Predicted': y_pred})
from sklearn import metrics
fpr, tpr, thresholds = metrics.roc_curve(y_test, y_pred, pos_label=1)
plt.plot(fpr, tpr)
plt.xlabel('False positive rate')
plt.ylabel('True positive rate')
plt.title('ROC curve')
plt.show()
print("AUC of the predictions: {0}".format(metrics.auc(fpr, tpr)))