情感分析插图

示例代码(大佬写的)

更加详细的解释

数据集

导入所需的库

首先,我们导入了几个关键的Python库,它们各自有不同的作用:

  • jieba:这是一个中文分词库,用于将中文句子分割成一个个的词语。因为中文文本不是通过空格来分隔词语的,所以我们需要一个专门的工具来完成这个任务。
  • sklearn.feature_extraction.text.TfidfVectorizer:这是scikit-learn库中的一个工具,用于将文本数据转换成特征矩阵。TF-IDF(Term Frequency-Inverse Document Frequency)是一种统计方法,用以评估一个词语对于一个文件集或一个语料库中的其中一份文件的重要程度。
  • sklearn.naive_bayes.MultinomialNB:同样是scikit-learn库中的一个分类器,属于朴素贝叶斯分类器的一种,特别适用于特征为离散多值(如词频)的情况。
  • sklearn.model_selection.train_test_split:用于将数据集分割为训练集和测试集,以便我们能够训练模型并评估其性能。
  • sklearn.metrics.accuracy_score, classification_report:这两个函数用于评估模型的性能。accuracy_score计算模型的准确率,即正确预测的比例;classification_report则提供更详细的性能指标,如精确率、召回率和F1分数。
  • pandas:一个强大的数据处理库,用于读取、处理和分析数据,如CSV文件。

加载数据集

data = pd.read_csv(r"......\all.csv", encoding='gbk')

这行代码使用pandasread_csv函数读取了一个存储在指定路径的CSV文件,并将其内容加载到data变量中。encoding='gbk'参数指定了文件的编码格式,因为CSV文件可能包含中文字符,所以需要使用正确的编码格式来读取。

准备数据集

documents = data['evaluation'].tolist()
labels = data['label'].tolist()

这两行代码从data数据框中提取了两列:evaluationlabelevaluation列包含了我们要分析的文本内容,而label列则包含了对应的情感标签(如积极或消极)。tolist()方法将这两列转换成Python列表,方便后续处理。

使用jieba进行分词

new = [' '.join(jieba.cut(doc)) for doc in documents]

这行代码使用列表推导式和jieba.cut函数对documents列表中的每个文本进行分词。jieba.cut函数将文本分割成词语,并返回一个生成器。' '.join(...)将生成器中的词语用空格连接起来,形成一个新的字符串。这样,我们就得到了一个包含分词后文本的列表new

使用TfidfVectorizer将文本转换为特征矩阵

vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(new)

首先,我们创建了一个TfidfVectorizer对象vectorizer。然后,使用fit_transform方法将分词后的文本列表new转换成TF-IDF特征矩阵X。这个特征矩阵是一个稀疏矩阵,其中每一行代表一个文本,每一列代表一个特征(即词语),而矩阵中的值则代表了该词语在文本中的重要程度(TF-IDF值)。

划分训练集和测试集

x_train, x_test, y_train, y_test = train_test_split(X, labels, test_size=0.2, random_state=42)

使用train_test_split函数将特征矩阵X和标签列表labels划分为训练集和测试集。test_size=0.2表示测试集占总数据的20%,random_state=42是一个随机数种子,用于确保每次划分的结果都是相同的。

训练模型

l = MultinomialNB()
l.fit(x_train, y_train)

首先,我们创建了一个多项式朴素贝叶斯分类器对象l。然后,使用fit方法将训练集数据(x_trainy_train)输入到分类器中,对分类器进行训练。训练完成后,分类器就可以用来预测新文本的情感了。

进行预测

y_pred = l.predict(x_test)

使用训练好的分类器l对测试集x_test进行预测,得到预测结果y_predy_pred是一个列表,包含了测试集中每个文本的预测情感标签。

计算准确率和评估模型

accuracy = accuracy_score(y_test, y_pred)
print(f"模型的准确率: {accuracy * 100:.2f}%")

使用accuracy_score函数计算模型预测的准确率,即正确预测的比例。然后,将准确率乘以100并保留两位小数,打印出来。

print("\n分类报告:")
print(classification_report(y_test, y_pred, target_names=['消极', '积极']))

使用classification_report函数生成详细的分类报告,包括精确率、召回率、F1分数等指标。target_names=['消极', '积极']参数用于指定标签的名称,以便在报告中显示更友好的标签名。

定义一个函数,用于对新的文本进行情感预测

def predict_sentiment(text, l, vectorizer):    
    token_text = ' '.join(jieba.cut(text))    
    vectorizer_text = vectorizer.transform([token_text])    
    m = l.predict(vectorizer_text)    
    return m[0]

这个函数接受一个新的文本text、训练好的分类器lTfidfVectorizer对象vectorizer作为输入。首先,使用jieba.cut对文本进行分词,并用空格连接成字符串token_text。然后,使用vectorizer.transform将分词后的文本转换成特征矩阵vectorizer_text。最后,使用分类器l对特征矩阵进行预测,得到预测结果m。因为predict方法返回的是一个数组,所以我们取第一个元素m[0]作为最终预测结果,并返回它。

对三个新的文本进行情感预测,并打印预测结果

text1 = '...'
print(f'文本:{text1}  预测结果:{predict_sentiment(text1, l, vectorizer)}') 
text2 = '...'
print(f'文本:{text2}  预测结果:{predict_sentiment(text2, l, vectorizer)}') 
text3 = '...'
print(f'文本:{text3}  预测结果:{predict_sentiment(text3, l, vectorizer)}')

最后,代码对三个新的文本进行了情感预测,并打印出了预测结果。这样,我们就可以用这个训练好的模型来对任意新的文本进行情感分析了。

输出结果

C:\Users\qing'meng.conda\envs\myenv\Lib\site-packages\sklearn\base.py:14: UserWarning: The NumPy module was reloaded (imported a second time). This can in some cases result in small but subtle issues and is discouraged.
import numpy as np
Building prefix dict from the default dictionary …
Loading model from cache C:\Users\QING'M~1\AppData\Local\Temp\jieba.cache
Loading model cost 0.356 seconds.
Prefix dict has been built successfully.
模型的准确率: 80.30%

分类报告:
           precision   recall   f1-score   support

消极           0.81      0.79      0.80     11913
积极           0.80      0.82      0.81     12087

accuracy                           0.80     24000
macro avg      0.80     0.80       0.80     24000
weighted avg   0.80     0.80       0.80     24000

文本:视频里花花的演唱会现场灯光舞美效果真的超级炫酷,现场观众气氛也超级好!… 预测结果:积极
文本:现在人都咋了,啥都黑。好吃与不好吃,与你有啥关系[允悲]人家是演员不是厨师。… 预测结果:积极
文本:无论什么职业,都应该互相尊重。这是每个人都该有的素质 预测结果:消极