一.案例简介

通过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分词后向量化,加强了对于朴素贝叶斯的学习

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐