机器学习实践——基于朴素贝叶斯的商品评论情感分析案例
·
一.案例简介
通过jieba对序列输入进行分割处理,将每句话分割成一个一个词语,然后用停用词表筛出所有数据中的“特征”词语,并将个数据向量化,标记每个样本的“特征”,最后使用朴素贝叶斯模型进行训练预测。
二.代码详解
1.数据读取
#1.读取评论
df = pd.read_csv('./data/书籍评价.csv', encoding='gbk')
df.info()
#2.数据预处理
#2.1添加labels列,充当:标签列,好评为1,差评为0
df['labels'] = np.where(df['评价']=='好评', 1, 0)
#print(df)
#2.2抽取labels列作为标签
y = df['labels']
2.jieba分词
#2.3演示jieba分词
print(jieba.lcut('小明骑车,一把把把把住了'))
#2.4 对用户评论信息,做切词
#数据格式:[[第一条数据切词1,切词2,切词3],[第2条数据切词1,切词2,切词3],......]
comment_list = [','.join(jieba.lcut(line)) for line in df['内容']]
#数据格式:['第一条数据切词1,切词2,切词3','第2条数据切词1,切词2,切词3',......]
print(comment_list)
3.加载停用词表,去除样本里含表中的词语
#2.5加载 停用词列表, 即:里面记录的词,不需要参与模型训练, 预测, 要被删除的词, 例如:的, 啊, 哈, 从, 都
with open('./data/stopwords.txt', 'r', encoding='utf-8') as src_f:
#2.5.1 一次读取所有的行
stopwords_list = src_f.readlines()
#2.5.2 删除最后的'\n'
stopwords_list = [line.strip() for line in stopwords_list]
#2.5.3 对停用词列表去重
stopwords_list = list(set(stopwords_list))
print(stopwords_list)
4.样本向量化
#2.6 创建向量化对象, 从, 评论切词列表(comment_list) 中, 删除 停用词, 并且统计词频(单词矩阵)
transfer = CountVectorizer(stop_words=stopwords_list) #参数:停用词列表
#2.7 统计词频矩阵, 先训练, 后转换, 再转数组
transfer.fit(comment_list)
x = transfer.transform(comment_list).toarray()
# x的格式:[[第一条评论的切词分布,有就是1,没有就是0],[第二条评论的切词分布,有就是1,没有就是0],...]
print(x)
#2.8 看一下 我们13条评论, 切词, 且删除 停用词后, 一共剩下多少词了
print(transfer.get_feature_names_out())
print(len(transfer.get_feature_names_out()))
5.模型训练、预测
#2.9切分训练集和测试集
x_train = x[:10]
y_train = y[:10]
x_test = x[10:]
y_test = y[10:]
#3.特征工程
#4.模型训练
estimator = MultinomialNB() #创建朴素贝叶斯模型对象
estimator.fit(x_train, y_train)
#5.模型预测
y_pred = estimator.predict(x_test)
print(f'模型预测结果{y_pred}')
#6.模型评估
print(f'准确率:{accuracy_score(y_test, y_pred)}')
6.完整代码
"""
案例:
朴素贝叶斯:
贝叶斯:仅仅依赖概率分类的一种机器学习算法
朴素:不考虑特征之间的关联性, 即:特征间都是相互独立的
"""
import numpy as np #数学计算
import pandas as pd #数据处理包
import matplotlib.pyplot as plt #画图包
import jieba #分词包
from sklearn.feature_extraction.text import CountVectorizer #词频统计包, 把评论内容转变成为词频矩阵
from sklearn.metrics import accuracy_score
from sklearn.naive_bayes import MultinomialNB # 多项分布朴素贝叶斯
#1.读取评论
df = pd.read_csv('./data/书籍评价.csv', encoding='gbk')
df.info()
#2.数据预处理
#2.1添加labels列,充当:标签列,好评为1,差评为0
df['labels'] = np.where(df['评价']=='好评', 1, 0)
#print(df)
#2.2抽取labels列作为标签
y = df['labels']
#2.3演示jieba分词
print(jieba.lcut('小明骑车,一把把把把住了'))
#2.4 对用户评论信息,做切词
#数据格式:[[第一条数据切词1,切词2,切词3],[第2条数据切词1,切词2,切词3],......]
comment_list = [','.join(jieba.lcut(line)) for line in df['内容']]
#数据格式:['第一条数据切词1,切词2,切词3','第2条数据切词1,切词2,切词3',......]
print(comment_list)
#演示join函数的用法
# my_list = ['aa', 'bb', 'cc']
# print(','.join(my_list))
#2.5加载 停用词列表, 即:里面记录的词,不需要参与模型训练, 预测, 要被删除的词, 例如:的, 啊, 哈, 从, 都
with open('./data/stopwords.txt', 'r', encoding='utf-8') as src_f:
#2.5.1 一次读取所有的行
stopwords_list = src_f.readlines()
#2.5.2 删除最后的'\n'
stopwords_list = [line.strip() for line in stopwords_list]
#2.5.3 对停用词列表去重
stopwords_list = list(set(stopwords_list))
print(stopwords_list)
#2.6 创建向量化对象, 从, 评论切词列表(comment_list) 中, 删除 停用词, 并且统计词频(单词矩阵)
transfer = CountVectorizer(stop_words=stopwords_list) #参数:停用词列表
#2.7 统计词频矩阵, 先训练, 后转换, 再转数组
transfer.fit(comment_list)
x = transfer.transform(comment_list).toarray()
# x的格式:[[第一条评论的切词分布,有就是1,没有就是0],[第二条评论的切词分布,有就是1,没有就是0],...]
print(x)
#2.8 看一下 我们13条评论, 切词, 且删除 停用词后, 一共剩下多少词了
print(transfer.get_feature_names_out())
print(len(transfer.get_feature_names_out()))
#2.9切分训练集和测试集
x_train = x[:10]
y_train = y[:10]
x_test = x[10:]
y_test = y[10:]
#3.特征工程
#4.模型训练
estimator = MultinomialNB() #创建朴素贝叶斯模型对象
estimator.fit(x_train, y_train)
#5.模型预测
y_pred = estimator.predict(x_test)
print(f'模型预测结果{y_pred}')
#6.模型评估
print(f'准确率:{accuracy_score(y_test, y_pred)}')

三.总结
通过本案例,主要学习了对于本文序列问题的处理方法之一 —— jieba分词后向量化,加强了对于朴素贝叶斯的学习
更多推荐




所有评论(0)