上一篇文章,我们爬取了苏宁易购平台某产品的优质评价和差评,今天我们对优质评价与差评进行分析
selenium爬取苏宁易购平台某产品的评论-CSDN博客
目录
1. 数据加载
2. 中文分词
3. 停用词处理
4. 数据标注与合并
5. 数据集划分
6. 文本特征提取
7. 模型训练与评估
MultinomialNB(多项式朴素贝叶斯)
ComplementNB(补充朴素贝叶斯)
BernoulliNB(伯努利朴素贝叶斯)
完整代码
运行结果
结果如何解读:
1. 数据加载
c_content = pd.read_table(r'.\差评(1).txt', encoding='gbk')
h_content = pd.read_table(r'.\优质评价.txt', encoding='gbk')
-
功能:从本地读取两个文本文件,分别是差评数据 (
差评(1).txt
) 和优质评价数据 (优质评价.txt
),并使用gbk
编码加载为 Pandas DataFrame。 -
说明:
pd.read_table
用于读取以制表符分隔的文本文件。
2. 中文分词
import jieba
c_segments = []
contents = c_content.content.values.tolist()
for content in contents:results = jieba.lcut(content)if len(results) > 1:c_segments.append(results)
-
功能:对差评数据进行中文分词,使用
jieba.lcut
将每一条评论分割成词语列表。 -
说明:
-
jieba.lcut
是结巴分词库的函数,用于将中文句子切分为词语列表。 -
if len(results) > 1
过滤掉分词结果中长度小于等于 1 的无效数据。
-
c_f_results = pd.DataFrame({'content': c_segments})
c_f_results.to_excel('c_f_results.xlsx', index=False)
-
功能:将分词后的差评数据保存到 Excel 文件 (
c_f_results.xlsx
) 中。 -
说明:
pd.DataFrame
将分词结果转换为 DataFrame,to_excel
用于保存为 Excel 文件。
h_segments = []
contents = h_content.content.values.tolist()
for content in contents:results = jieba.lcut(content)if len(results) > 1:h_segments.append(results)
h_f_results = pd.DataFrame({'content': h_segments})
h_f_results.to_excel('h_f_results.xlsx', index=False)
-
功能:对优质评价数据进行中文分词,并保存到 Excel 文件 (
h_f_results.xlsx
) 中。 -
说明:与差评数据处理流程相同。
3. 停用词处理
stopwords = pd.read_csv(r'..\TF_IDF\StopwordsCN.txt', encoding='utf8', engine='python', index_col=False)
-
功能:加载中文停用词表 (
StopwordsCN.txt
),用于过滤分词结果中的无意义词语。 -
说明:停用词表是一个包含常见无意义词语(如“的”、“是”等)的文件。
def drop_stopwords(contents, stopwords):segments_clean = []for content in contents:line_clean = []for word in content:if word in stopwords:continueline_clean.append(word)segments_clean.append(line_clean)return segments_clean
-
功能:定义一个函数
drop_stopwords
,用于从分词结果中移除停用词。 -
说明:
-
遍历每条分词结果,过滤掉停用词表中的词语。
-
返回清理后的分词结果。
-
contents = c_f_results.content.values.tolist()
stopwords = stopwords.stopword.values.tolist()
c_f_contents_clean_s = drop_stopwords(contents, stopwords)
-
功能:对差评分词结果进行停用词过滤。
-
说明:调用
drop_stopwords
函数,清理差评数据中的停用词。
contents = h_f_results.content.values.tolist()
h_f_contents_clean_s = drop_stopwords(contents, stopwords)
-
功能:对优质评价分词结果进行停用词过滤。
-
说明:与差评数据处理流程相同。
4. 数据标注与合并
c_train = pd.DataFrame({'segments_clean': c_f_contents_clean_s, 'label': 1})
h_train = pd.DataFrame({'segments_clean': h_f_contents_clean_s, 'label': 0})
pj_train = pd.concat([c_train, h_train])
pj_train.to_excel('pj_train.xlsx', index=False)
-
功能:将差评和优质评价数据合并,并为每条数据打上标签(差评为
1
,优质评价为0
)。 -
说明:
label: 1
表示差评,label: 0
表示优质评价。
5. 数据集划分
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(pj_train['segments_clean'].values,pj_train['label'].values, test_size=0.2, random_state=48)
-
功能:将数据集划分为训练集和测试集,测试集占 20%,训练集占 80%。
-
说明:
-
x_train
和x_test
是分词后的文本数据。 -
y_train
和y_test
是对应的标签数据。 -
random_state=48
确保每次划分的结果一致。
-
words = []
for line_index in range(len(x_train)):words.append(' '.join(x_train[line_index]))
-
功能:将训练集的文本数据转换为以空格分隔的字符串列表。
-
说明:
' '.join(x_train[line_index])
将分词列表拼接为一个字符串。
words2 = []
for line_index in range(len(x_test)):words2.append(' '.join(x_test[line_index]))
-
功能:将测试集的文本数据转换为以空格分隔的字符串列表。
-
说明:与训练集处理方式相同。
6. 文本特征提取
from sklearn.feature_extraction.text import CountVectorizer
vec = CountVectorizer(max_features=4000, lowercase=False, ngram_range=(1, 3))
vec.fit(words)
vec.fit(words2)
-
功能:使用
CountVectorizer
将文本数据转换为特征向量。 -
说明:
-
max_features=4000
限制特征向量的最大维度为 4000。 -
lowercase=False
不将文本转换为小写(适用于中文)。 -
ngram_range=(1, 3)
提取 1 元、2 元和 3 元语法特征。
-
7. 模型训练与评估
这里提供了三种贝叶斯模型供大家参考,在下面完整的代码中我将选择多项式朴素贝叶斯模型训练
MultinomialNB(多项式朴素贝叶斯)
from sklearn.naive_bayes import MultinomialNB
classifier = MultinomialNB(alpha=0.1)
classifier.fit(vec.transform(words), y_train)
train_pr = classifier.predict(vec.transform(words))
test_pr = classifier.predict(vec.transform(words2))
from sklearn import metrics
print(metrics.classification_report(y_train, train_pr))
print(metrics.classification_report(y_test, test_pr))
-
功能:使用多项式朴素贝叶斯模型进行训练和预测,并输出分类报告。
-
说明:
-
alpha=0.1
是平滑参数,用于防止概率为零的情况。 -
metrics.classification_report
输出模型的精确率、召回率和 F1 分数。
-
ComplementNB(补充朴素贝叶斯)
from sklearn.naive_bayes import ComplementNB
classifier = ComplementNB(alpha=0.1)
classifier.fit(vec.transform(words), y_train)
train_pr = classifier.predict(vec.transform(words))
test_pr = classifier.predict(vec.transform(words2))
from sklearn import metrics
print(metrics.classification_report(y_train, train_pr))
print(metrics.classification_report(y_test, test_pr))
-
功能:使用补充朴素贝叶斯模型进行训练和预测,并输出分类报告。
-
说明:补充朴素贝叶斯适用于不平衡数据集。
BernoulliNB(伯努利朴素贝叶斯)
from sklearn.naive_bayes import BernoulliNB
classifier = BernoulliNB(alpha=0.1)
classifier.fit(vec.transform(words), y_train)
train_pr = classifier.predict(vec.transform(words))
test_pr = classifier.predict(vec.transform(words2))
from sklearn import metrics
print(metrics.classification_report(y_train, train_pr))
print(metrics.classification_report(y_test, test_pr))
-
功能:使用伯努利朴素贝叶斯模型进行训练和预测,并输出分类报告。
-
说明:伯努利朴素贝叶斯适用于二值特征数据。
完整代码
import pandas as pd
c_content=pd.read_table(r'.\差评(1).txt',encoding='gbk')
h_content=pd.read_table(r'.\优质评价.txt',encoding='gbk')
import jieba
c_segments=[]
contents=c_content.content.values.tolist()
for content in contents:results=jieba.lcut(content)if len(results)>1:c_segments.append(results)
c_f_results=pd.DataFrame({'content':c_segments})
c_f_results.to_excel('c_f_results.xlsx',index=False)
h_segments=[]
contents=h_content.content.values.tolist()
for content in contents:results=jieba.lcut(content)if len(results)>1:h_segments.append(results)
h_f_results=pd.DataFrame({'content':h_segments})
h_f_results.to_excel('h_f_results.xlsx',index=False)
stopwords=pd.read_csv(r'..\TF_IDF\StopwordsCN.txt',encoding='utf8',engine='python',index_col=False)
def drop_stopwords(contents,stopwords):segments_clean=[]for content in contents:line_clean=[]for word in content:if word in stopwords:continueline_clean.append(word)segments_clean.append(line_clean)return segments_clean
contents=c_f_results.content.values.tolist()
stopwords=stopwords.stopword.values.tolist()
c_f_contents_clean_s=drop_stopwords(contents,stopwords)
contents=h_f_results.content.values.tolist()
# stopwords=stopwords.stopword.values.tolist()
h_f_contents_clean_s=drop_stopwords(contents,stopwords)
c_train=pd.DataFrame({'segments_clean':c_f_contents_clean_s,'label':1})
h_train=pd.DataFrame({'segments_clean':h_f_contents_clean_s,'label':0})
pj_train=pd.concat([c_train,h_train])
pj_train.to_excel('pj_train.xlsx',index=False)
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test=train_test_split(pj_train['segments_clean'].values,pj_train['label'].values,test_size=0.2,random_state=48)
words=[]
for line_index in range(len(x_train)):words.append(' '.join(x_train[line_index]))
# print(words)
words2=[]
for line_index in range(len(x_test)):words2.append(' '.join(x_test[line_index]))
from sklearn.feature_extraction.text import CountVectorizer
vec=CountVectorizer(max_features=4000,lowercase=False,ngram_range=(1,3))
vec.fit(words)
vec.fit(words2)
print('MultinomialNB')
from sklearn.naive_bayes import MultinomialNB
classifier=MultinomialNB(alpha=0.1)
classifier.fit(vec.transform(words),y_train)
train_pr=classifier.predict(vec.transform(words))
test_pr=classifier.predict(vec.transform(words2))
from sklearn import metrics
print(metrics.classification_report(y_train,train_pr))
print(metrics.classification_report(y_test,test_pr))
运行结果
结果如何解读:
在代码中,每个模型训练后都会输出一个分类报告,使用 metrics.classification_report
生成。分类报告包括以下指标:
-
精确率 (Precision):预测为正类的样本中,实际为正类的比例。
-
召回率 (Recall):实际为正类的样本中,预测为正类的比例。
-
F1 分数 (F1-Score):精确率和召回率的加权平均值,综合衡量模型的性能。
-
支持数 (Support):每个类别的样本数量。
在我们的运行结果中
-
类别 0:表示好评的指标。
-
类别 1:表示差评的指标。
-
accuracy:模型整体的准确率。
-
macro avg:各类别指标的平均值。
-
weighted avg:按样本数量加权的各类别指标平均值。