示例代码(大佬写的)
import jieba # jieba是一个中文分词库,用于将中文文本分割成单个的词语。
from sklearn.feature_extraction.text import TfidfVectorizer # TfidfVectorizer用于将文本数据转换为TF-IDF特征矩阵。
# TF-IDF(Term Frequency-Inverse Document Frequency)是一种统计方法,用于评估一个词语对于一个文件集或一个语料库中的其中一份文件的重要程度。
from sklearn.naive_bayes import MultinomialNB # MultinomialNB是多项式朴素贝叶斯分类器,适用于特征表示为发生次数的离散数据,如文本分类。
from sklearn.model_selection import train_test_split # train_test_split用于将数据集分割为训练集和测试集。
from sklearn.metrics import accuracy_score, classification_report # accuracy_score计算分类准确率,classification_report生成主要分类指标的文本报告。
import pandas as pd # pandas是一个强大的Python数据分析工具库。
data = pd.read_csv(r"......\all.csv", encoding='gbk')
# 这行代码读取了一个CSV文件,该文件包含了用于情感分析的中文文本数据和对应的情感标签。
# encoding='gbk'指定了文件的编码格式,GBK是一种用于简体中文的编码标准。
documents = data['evaluation'].tolist() # 从data中提取'evaluation'列,该列包含文本数据,将其转换为列表形式。
labels = data['label'].tolist() # 从data中提取'label'列,该列包含对应的情感标签(如积极、消极等),也转换为列表形式。
new = [' '.join(jieba.cut(doc)) for doc in documents]
# jieba.cut(doc)将每个文本(doc)分割成词语列表。
# ' '.join(...)将这些词语列表转换为一个由空格分隔的字符串,因为TF-IDF向量化器期望这种格式。
# new列表中的每个元素都是一个分词后的文本字符串。
vectorizer = TfidfVectorizer() # 创建一个TfidfVectorizer对象。
X = vectorizer.fit_transform(new) # 使用fit_transform方法将文本数据转换为TF-IDF特征矩阵。
# fit_transform方法首先学习词汇表(即所有文本中的唯一词语),然后将文本转换为词语的频率表示,并根据逆文档频率进行缩放。
x_train, x_test, y_train, y_test = train_test_split(X, labels, test_size=0.2, random_state=42)
# train_test_split函数将数据集分割为训练集和测试集。
# test_size=0.2表示测试集占总数据的20%。
# random_state=42是一个随机种子,用于确保每次分割的结果相同,便于复现结果。
l = MultinomialNB() # 创建一个多项式朴素贝叶斯分类器对象。
l.fit(x_train, y_train) # 使用训练集数据对分类器进行训练。
# fit方法学习训练数据中的特征和目标标签之间的关系。
y_pred = l.predict(x_test) # 使用训练好的模型对测试集进行预测。
# predict方法返回每个测试样本的预测标签。
accuracy = accuracy_score(y_test, y_pred) # 计算模型预测的准确率。
# accuracy_score函数比较预测标签和真实标签,并计算准确率。
print(f"模型的准确率: {accuracy * 100:.2f}%") # 打印准确率。
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]) # 使用之前训练好的TfidfVectorizer对象将分词后的文本转换为特征矩阵。
m = l.predict(vectorizer_text) # 使用训练好的模型对特征矩阵进行预测,得到预测结果。
return m[0] # 返回预测结果。predict方法返回的是一个数组,所以取第一个元素作为最终预测结果。
text1 = '视频里花花的演唱会现场灯光舞美效果真的超级炫酷,现场观众气氛也超级好!...'
text2 = '现在人都咋了,啥都黑。好吃与不好吃,与你有啥关系[允悲]人家是演员不是厨师。...'
text3 = '无论什么职业,都应该互相尊重。这是每个人都该有的素质'
# 对每个文本调用predict_sentiment函数进行情感预测,并打印预测结果。
print(f'文本:{text1} 预测结果:{predict_sentiment(text1, l, vectorizer)}')
print(f'文本:{text2} 预测结果:{predict_sentiment(text2, l, vectorizer)}')
print(f'文本:{text3} 预测结果:{predict_sentiment(text3, l, vectorizer)}')
更加详细的解释
数据集
导入所需的库
首先,我们导入了几个关键的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')
这行代码使用pandas
的read_csv
函数读取了一个存储在指定路径的CSV文件,并将其内容加载到data
变量中。encoding='gbk'
参数指定了文件的编码格式,因为CSV文件可能包含中文字符,所以需要使用正确的编码格式来读取。
准备数据集
documents = data['evaluation'].tolist()
labels = data['label'].tolist()
这两行代码从data
数据框中提取了两列:evaluation
和label
。evaluation
列包含了我们要分析的文本内容,而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_train
和y_train
)输入到分类器中,对分类器进行训练。训练完成后,分类器就可以用来预测新文本的情感了。
进行预测
y_pred = l.predict(x_test)
使用训练好的分类器l
对测试集x_test
进行预测,得到预测结果y_pred
。y_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
、训练好的分类器l
和TfidfVectorizer
对象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
文本:视频里花花的演唱会现场灯光舞美效果真的超级炫酷,现场观众气氛也超级好!… 预测结果:积极
文本:现在人都咋了,啥都黑。好吃与不好吃,与你有啥关系[允悲]人家是演员不是厨师。… 预测结果:积极
文本:无论什么职业,都应该互相尊重。这是每个人都该有的素质 预测结果:消极
Comments NOTHING