• 朴素贝叶斯----评论情感分析系统



    2022/12/17更新, 由于很多小伙伴需要数据集与代码,我已上传至github,请 点击此处获得。

    前言

    近期学校实验室有一个任务,要求爬取大量评论数据,自己构建机器学习模型并训练数据集,对评论进行情感的分析,即好评或差评。

    刚好前天学到了朴素贝叶斯定理, 便根据该定理构建模型,训练数据集,评估模型,并完成了评论情感的分析。

    以下是具体实现步骤

    Step1: 爬取京东评论,作为模型数据集

    爬取10个京东商品的评论信息,每个商品爬取1000条,其中好评信息爬取6000条,差评信息爬取4000条。

    作为本次评论情感分析数据集

    测试爬虫

    首先测试下爬虫效果,可以爬取评论信息

    import requests
    import json
    
    
    #获取评论请求地址
    url = 'https://club.jd.com/comment/productPageComments.action'
    
    #请求参数
    params = {
        'callback': 'fetchJSON_comment98',
        'productId': '100021771660',
        'score': '1',            #类型代表差评
        'sortType': '5',         #默认排序
        'page': '99',            #第99页数据
        'pageSize': '10',
        'isShadowSku': '0',
        'fold': '1',
    }
    
    #请求头参数,反反爬策略 UA 伪装
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36'
    }
    
    #获取响应,并分析响应内容
    response = requests.get(url=url, params=params, headers=headers)
    
    #拆分京东返回的响应数据,得到json类型数据
    data_json = response.text.replace('fetchJSON_comment98(', '')[:-2]
    
    #将json字符串加载为 python的对象中
    data = json.loads(data_json)
    
    bad_comments = []
    
    for comment in data['comments']:
        
        #生成每条评论以及它的标签, 0代表好评, 1代表差评
        comments = [comment['content'].replace('\n', ''), '0']
        
        bad_comments.append(comments)
    
    print(bad_comments)
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    运行结果

       [['1.买完没多久就降价600,很无语2.电脑开机经常出现wifi连不上的问题', '0'], 
       ['刚买的,第二次使用就开不了机了,怀疑买的是假货,要求京东给出说法', '0'], 
       ['一分都不想给啊 买来就做个账 转转账 卡的要死', '0'],
       ['用了2个星期了,第1个星期还没事,第2个星期动不动就开不了机。', '0'],
       ['非常垃圾的电脑,这个价位配置这么低,新机子就卡的要死,强烈要求退货', '0'],
       ['买了不到2个月就开不开机了 找客服 没有搭理 真是失望至极!', '0'], 
       ['差评 垃圾机 老是卡顿', '0'], ['重装系统office2021会直接消失 需要重新购买 体验非常差', '0'],
       ['刚买的居然发现硬盘被使用了九天,插口也有拔插的痕迹,漆都掉了。严重怀疑是上一个买家用了七天退货产品。', '0'], 
       ['京东物流太差了,包装箱破损严重,明显是重摔造成的,幸亏里面的货没有损伤。', '0']]
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    爬取6000条好评信息作为数据集,并存储为CSV文件

    商品链接分别为:(每个商品爬取1000条评论)

    Apple MacBook Pro 13.3 八核M1芯片 8G 256G SSD 深空灰 笔记本电脑 轻薄本 MYD82CH/A

    联想笔记本电脑小新Pro14 英特尔Evo平台 14英寸游戏轻薄本(标压i5 16G 512G 2.8K 90Hz护眼屏)全面屏办公本

    华为笔记本电脑MateBook D 14 2022款 14英寸 11代酷睿 i5 16G+512G 锐炬显卡 轻薄本/护眼全面屏 银

    联想ThinkBook 14+ 英特尔酷睿i5 笔记本电脑全新2022款 14英寸标压轻薄本i5-12500H 16G 512G 2.8K 90Hz

    荣耀MagicBook 16 16.1英寸高性能标压轻薄笔记本电脑(R7-5800H 16+512G 144Hz高刷)冰河银

    惠普(HP) 笔记本电脑 星14进阶版高端pro轻薄本超薄商用办公游戏手提学生女超极本旗舰店官网 初恋粉:【背光键盘版-新11代进阶丨2022款】 新i5-1155G7/16G/512G/高72%

    由于水平原因,总是被反爬虫,所以本段代码需要执行6次(差评需要执行4次),来爬取6000条信息,每次执行需要更换以下ids中的商品id

    import requests
    import json
    import time
    import csv
    
    
    #获取评论请求地址
    url = 'https://club.jd.com/comment/productPageComments.action'
    
    
    #请求头参数,反反爬策略 UA 伪装
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36'
    }
    
    #存放每个商品的id,理论上行得通,实际上行不通,因为反爬策略所以需要多次执行
    ids = ['100009464821','100014546493','100016960357','100020078921', '100014373845','32421759213']
    
    #用于存放所有好评信息的数据
    good_comments = []
    
    for i in range(100):
        #请求参数
        params = {
            'callback': 'fetchJSON_comment98',
            'productId': '32421759213',          #代表产品的 id 
            'score': '3',                         #score = 3 代表均为好评信息
            'sortType': '5',                      #排序方式,采用默认排序
            'page': str(i),                       #循环爬取每一页的评论信息
            'pageSize': '10',
            'isShadowSku': '0',
            'fold': '1',
        }
        
        #获取响应,并分析响应内容
        response = requests.get(url = url, params=params, headers=headers)
    
        #拆分京东返回的响应数据,得到json类型数据
        data_json = response.text.replace('fetchJSON_comment98(', '')[:-2]
    
        #将json字符串加载为 python的对象中
        data = json.loads(data_json)
        
        #设置标签为 0, 代表好评
        target = '0'
        
        for comment in data['comments']:
            
            #对评论数据稍作处理。 去除一些制表符、回车符、包括csv文件分组的','逗号
            comment_data = comment['content'].replace('\n', ',').replace(',', ',').replace('…','').replace(' ','')
            
            #生成每条评论以及它的标签, 0代表好评, 1代表差评
            comments = [comment_data, target]
    
            good_comments.append(comments)
    
        print(i+1)
        #延迟爬虫,避免反爬
        time.sleep(2)
    
    
    #以 写 的方式打开csv文件,并写入好评信息
    with open('./datasets/comments.csv', 'a+', encoding='UTF-8', newline='') as fp:
        writer = csv.writer(fp)
        writer.writerows(good_comments)
        
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66

    爬取4000条差评信息作为数据集,并存储为CSV文件

    商品链接分别为:(每个商品爬取1000条评论)

    联想笔记本电脑小新Pro14 英特尔Evo平台 14英寸游戏轻薄本(标压i5 16G 512G 2.8K 90Hz护眼屏)全面屏办公本

    华为笔记本电脑MateBook D 14 2022款 14英寸 11代酷睿 i5 16G+512G 锐炬显卡 轻薄本/护眼全面屏 银

    联想笔记本电脑 小新Air14 英特尔酷睿i5 14英寸轻薄本(i5 16G 512G 高色域 大电池)银 全面屏商务办公本

    联想笔记本电脑小新Pro16 16英寸游戏轻薄本(8核标压R7-5800H 16G 512G RTX3050 2.5K 120Hz)高性能商务办公

    #用于存放所有差评信息的数据
    bad_comments = []
    
    for i in range(3):
        
        #请求参数
        params = {
            'callback': 'fetchJSON_comment98',
            'productId': '100021771660',
            'score': '1',                         #score = 1 代表均为差评信息
            'sortType': '5',
            'page': str(i),                       #循环爬取每一页的评论信息
            'pageSize': '10',
            'isShadowSku': '0',
            'fold': '1',
        }
        
        #获取响应,并分析响应内容
        response = requests.get(url = url, params=params, headers=headers)
    
        #拆分京东返回的响应数据,得到json类型数据
        data_json = response.text.replace('fetchJSON_comment98(', '')[:-2]
    
        #将json字符串加载为 python的对象中
        data = json.loads(data_json)
        
        #设置标签为 1, 代表差评
        target = '1'
        
        for comment in data['comments']:
            
            #对评论数据稍作处理, 去除'\n'换行符和 csv文件分隔符 ',' 逗号
            comment_data = comment['content'].replace('\n', ',').replace(',', ',').replace('…','').replace(' ','')
            
            #生成每条评论以及它的标签, 0代表好评, 1代表差评
            comments = [comment_data, target]
    
            bad_comments.append(comments)
    
        
        print(i+1)
        #延迟爬虫,避免反爬
        time.sleep(5)
    
    
    #以 追加 的方式打开csv文件,并写入好评信息
    with open('./datasets/comments.csv', 'a+', encoding='UTF-8', newline='') as fp:
        writer = csv.writer(fp)
        writer.writerows(bad_comments)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    Step2: 读取数据集

    import numpy as np
    
    #用来存放评论的数据集
    dataset = None
    
    #打开文件,并将所有评论信息读取至数据集
    with open('./datasets/comments.csv', 'r', encoding='UTF-8') as fp:
        reader = csv.reader(fp)
        
        dataset = np.array([comment for comment in reader])
    
    #输出数据集的形状
    print(dataset.shape)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    (10000, 2)
    
    • 1

    可见,该数据集一共包含10000条数据,包含评论信息、评论类别信息。

    Step3: 数据预处理(分词、去除停用词、建立词典)

    import jieba
    
    dictionary = []            #定义词典
    stop_words = []            #定义停用词表
    clear_dataset = []         #定义清洗后的数据集
    
    #读取停用词表,并以列表的方式存入stop_words中
    with open('./file/cn-stopwords.txt', 'r', encoding='UTF-8') as fp:
        stop_words = fp.read().split('\n')
    
    for comment in dataset:
        words = []      #存放切词后、去除停用词后的句子词组
        
        #使用jieba对评论进行分词
        for word in jieba.lcut(comment[0]):
            
            #若切出来的词语 不属于停用词表, 加入词组中
            if word not in stop_words:
                words.append(word)
    
            #向词典中加入所有未加入的词语
            if word not in dictionary:
                dictionary.append(word)
            
        #追加句子词组和对应的标志
        clear_dataset.append([words,comment[1]])
    
    
    #输出词典的长度
    print(len(dictionary))
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    12747
    
    • 1

    Step4: 评论语句 转化为 向量

    from sklearn.model_selection import train_test_split
    
    
    X = []                                     #存放word2vec后的评论向量
    y = [y[1] for y in clear_dataset]         #存放每条评论的结果
    
    #遍历所有清洗后的评论数据,并将所有评论文本信息转化为向量信息
    for clear_data in clear_dataset:
        
        #评论信息列表赋值为sentence
        sentence = clear_data[0]
        
        #首先将每个评论分词列表设置为 (1,5023)的向量,每个向量值为1
        #一个句子转化为一个向量
        word_2_vec = np.zeros(len(dictionary))
        
        
        #遍历字典,将所有评论分词列表 转化为 向量列表 (超重要!!!)
        for word in sentence:
            
            #如果word存在于字典中
            if word in dictionary:
                
                #找到该词在字典中的位置
                loc = dictionary.index(word)
                
                #此句子对照向量的该位置加1
                word_2_vec[loc] += 1 
    
        #X,即输入句子的特征向量列表,追加新句子向量
        X.append(word_2_vec)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    Step5: 拆分数据集----训练集、测试集

    训练集用来训练构建的模型,测试集用来测试模型的性能

    X = np.array(X)               #转化为numpy数组,X作为输入项,即评论生成的向量
    y = np.array(y)               #转化为numpy数组,X作为输出项,即评论的类别
    
    #X_train,y_train为训练集数据
    #X_test,y_test为测试集数据
    X_train, X_test, y_train, y_test = train_test_split(X, y)            #使用sklearn库的随即切分函数,将X、y划分为训练集与测试集
    
    
    #分别输出训练集的 X, y形状, 测试集的X, y的形状
    print(X_train.shape)
    print(y_train.shape)
    print(X_test.shape)
    print(y_test.shape)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    (7500, 12747)
    (7500,)
    (2500, 12747)
    (2500,)
    
    • 1
    • 2
    • 3
    • 4

    Step6: 以朴素贝叶斯算法构建模型、训练模型

    这一段代码可能是最难理解的一段代码,因为此处涉及到朴素贝叶斯模型算法。

    注意观察朴素贝叶斯算法:

    P ( A ∣ B ) = P ( B ∣ A ) P ( A ) P ( B ) P(A|B) = \frac{P(B|A)P(A)}{P(B)} P(AB)=P(B)P(BA)P(A)

    即为:

    P ( 类别 ∣ 特征 ) = P ( 特征 ∣ 类别 ) P ( 类别 ) P ( 特征 ) P(类别|特征) = \frac{P(特征|类别)P(类别)}{P(特征)} P(类别特征)=P(特征)P(特征类别)P(类别)

    此时问题转化为了求解:

    • P ( 特征 ∣ 类别 ) P(特征|类别) P(特征类别)
    • P ( 类别 ) P(类别) P(类别)
    • P ( 特征 ) P(特征) P(特征)

    由于朴素贝叶斯的设定每个特征之间都是独立的,可以推出:

    P ( 特征 ∣ 类别 ) = P ( 特征 1 ∣ 类别 ) ∗ P ( 特征 2 ∣ 类别 ) ∗ P ( 特征 3 ∣ 类别 ) ∗ . . . ∗ P ( 特征 n ∣ 类别 ) P(特征|类别) = P(特征1|类别) * P(特征2|类别) * P(特征3|类别) * ... * P(特征n|类别) P(特征类别)=P(特征1∣类别)P(特征2∣类别)P(特征3∣类别)...P(特征n类别)

    那么, 我们可以依次求出 P(特征1|类别)、P(特征2|类别)、P(特征3|类别)…P(特征n|类别),即

    P ( 特征 i ∣ 类别 ) = 此类别发生时特征 i 出现次数 类别次数 ( 好评 / 差评次数 ) P(特征i|类别) = \frac{此类别发生时特征i出现次数}{类别次数(好评/差评次数)} P(特征i类别)=类别次数(好评/差评次数)此类别发生时特征i出现次数

    也可得出:

    P ( 类别 ) = 某类别次数 好评、差评之和 P(类别) = \frac{某类别次数}{好评、差评之和} P(类别)=好评、差评之和某类别次数

    如, P ( 好评 ) = 好评次数 好评、差评之和 P(好评) = \frac{好评次数}{好评、差评之和} P(好评)=好评、差评之和好评次数

    通过全概率公式,可知(本情景下仅两种类别)

    P ( 特征 ) = P ( 类别 1 ) ∗ P ( 特征 ∣ 类别 1 ) + P ( 类别 2 ) ∗ P ( 特征 ∣ 类别 2 ) P(特征) = P(类别1)*P(特征|类别1) + P(类别2)*P(特征|类别2) P(特征)=P(类别1)P(特征类别1)+P(类别2)P(特征类别2)

    我们可以想象下,无论求好评概率或者差评概率,最终都要 除以 P(特征), P(特征)对于此两种概率是无变化的,所以我们可以将其忽略,都不除,直接比较。

    此时,我们只需要求出所有 P(特征i|类别),到时候便可方便使用贝叶斯公式计算, 代入到代码,可得

    good_pro, 即P(好评), 代表好评的概率

    good_num, 即好评次数

    bad_num,即差评次数

    good_vec, 作为一个好评向量,记录每次好评时,每个词语出现的次数

    bad_vec, 作为一个差评向量,记录每次差评时, 每个词语出现的次数

    good_vec_trained = good_vec / good_num,即用于存放所有的 P(特征i|好评)向量,每个值代表一个概率

    bad_vec_trained = bad_vec / bad_num, 即用于存放所有的 P(特征i|差评)向量,每个值代表一个概率

    最后套用朴素贝叶斯公式,即可得出每条评论的情感,好评或差评。

    len_dic = len(dictionary)               #词典的长度,即所有词的长度
    
    good_pro = np.sum(y_train == '0')/len(X_train)     #好评率
    
    good_num = 0                    #好评的次数
    bad_num = 0                     #差评的次数
    
    
    #初始化之所以为 1,是防止P(特征i|类别)中某个为0,导致连乘积为0
    good_vec = np.ones(len_dic)             #向量组,每个值(词语)代表好评的次数,初始化全为1
    bad_vec = np.ones(len_dic)              #向量组,每个值(词语)代表差评的次数,初始化全为1
    
    
    for i in range(len(X_train)):
    
        #代表的是好评
        if y_train[i] == '0':
            good_vec += X_train[i]                #把该评论词语代表的向量,累加到good_vec
            good_num += 1                   #好评次数增加
        
        #否则是差评
        else:
            bad_vec += X_train[i]                #把该评论词语代表的向量,累加到bad_vec
            bad_num += 1                    #差评次数增加
    
    
    #取log的原因有二:1、拉普拉斯平滑,防止太小的结果乘积造成下溢。2、log(连乘积)可以转化为 log累加
    good_vec_trained = np.log(good_vec/good_num)          #用于存放所有的 P(特征i|好评)向量,每个值代表一个概率
    bad_vec_trained = np.log(bad_vec/bad_num)             #用于存放所有的 P(特征i|差评)向量,每个值代表一个概率
    
    print('good_pro is: {}'.format(good_pro))
    print('good_vec_trained is: {}'.format(good_vec_trained))
    print('bad_vec_trained is: {}'.format(bad_vec_trained))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    good_pro is: 0.5993333333333334
    good_vec_trained is: [-4.19121324 -8.41072095 -5.9258143  ... -8.41072095 -8.41072095
     -8.41072095]
    bad_vec_trained is: [-3.78852514 -8.00803285 -7.31488567 ... -7.31488567 -7.31488567
     -7.31488567]
    
    • 1
    • 2
    • 3
    • 4
    • 5

    理论上讲此处 good_pro 应为 0.6,指的是好评概率,但可能获取的数据有些纰漏,导致good_pro为 0.599333,对于模型并无大碍。

    Step7: 评估模型

    训练完模型,得到good_vec_trained、bad_vec_trained、good_pro后,就可以直接根据贝叶斯公式计算好评或者差评的概率

    因为使用了拉普拉斯平滑,所以贝叶斯公式的分子项:

    L o g ( P ( 特征 ∣ 类别 ) P ( 类别 ) ) = L o g ( P ( 特征 1 ∣ 类别 ) ∗ P ( 特征 2 ∣ 类别 ) ∗ P ( 特征 3 ∣ 类别 ) ∗ . . . ∗ P ( 特征 n ∣ 类别 ) ) + L o g ( P ( 类别 ) ) Log(P(特征|类别)P(类别)) = Log(P(特征1|类别) * P(特征2|类别) * P(特征3|类别) * ... * P(特征n|类别)) + Log(P(类别)) Log(P(特征类别)P(类别))=Log(P(特征1∣类别)P(特征2∣类别)P(特征3∣类别)...P(特征n类别))+Log(P(类别))

    可转化为:

    L o g ( P ( 特征 ∣ 类别 ) P ( 类别 ) ) ) = L o g ( P ( 特征 1 ∣ 类别 ) ) + L o g ( P ( 特征 2 ∣ 类别 ) ) + . . . + L o g ( P ( 特征 n ∣ 类别 ) ) + L o g ( P ( 类别 ) ) Log(P(特征|类别)P(类别))) = Log(P(特征1|类别)) + Log(P(特征2|类别)) + ... + Log(P(特征n|类别)) + Log(P(类别)) Log(P(特征类别)P(类别)))=Log(P(特征1∣类别))+Log(P(特征2∣类别))+...+Log(P(特征n类别))+Log(P(类别))

    其中,X_test[i] 表示一个评论语句转化成的向量。

    例如,

    P(特征|好评) = X_test[i] * good_vec_trained,两个向量数组相乘,列表内的值,两两相乘,最后得到结果

    以下是对测试集,未训练的数据进行测试,评估模型的性能

    success_count = 0
    
    for i in range(2500):
        
        #代入朴素贝叶斯公式
        
        #评论好评的概率
        good_pro_pre = np.sum(X_test[i] * good_vec_trained) + np.log(good_pro)
        
        #评论差评的概率
        bad_pro_pre = np.sum(X_test[i] * bad_vec_trained) + np.log(1-good_pro)
    
        #若好评概率大于差评概率
        if good_pro_pre > bad_pro_pre:
            result = '0'                     #输出好评
    
        else:
            result = '1'                     #否则输出差评
    
        if(y_test[i] == result):            #若预测答案与真实答案相等,预测正确数量增加
            success_count +=1
    
            
    print('朴素贝叶斯模型(bayes)预测的准确度: {}'.format(success_count/2500))
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    朴素贝叶斯模型(bayes)预测的准确度: 0.9392
    
    • 1

    经过对 2500 条测试数据逐一预测,得到该模型的准确度为 93.92%,效果不算太差,模型构建成功,后续可作适当优化。

    Step8: 测试评论,输出情绪分类

    输入 50 条评论信息,测试模型预测效果

    import random
    
    dic_len = len(dictionary)
    
    start = random.randint(50, 2450)
    
    #从测试集中随机抽取50条数据,准备测试
    X_data = X_test[start:start+50]
    y_data = y_test[start:start+50]
    
    success_test = 0
    
    #对 50条评论信息进行预测
    for sequence_index in range(len(X_data)):
        
        #找到该 评论语句 切分后的词组对应的位置,返回一个数组
        locs = np.where(X_data[sequence_index] == 1)
        
        #输出切分、分词后的评论内容
        for loc in locs[0]:
            print(dictionary[loc] ,end='/')
        
        print('\n')
        
        #代入朴素贝叶斯公式
        good_pro_pre = np.sum(X_data[sequence_index] * good_vec_trained) + np.log(good_pro)         #评论好评的概率
        bad_pro_pre = np.sum(X_data[sequence_index] * bad_vec_trained) + np.log(1-good_pro)         #评论差评的概率
    
        #0 代表好评, 1代表差评
        #若好评概率大于差评概率
        if good_pro_pre > bad_pro_pre:
            result = '0'                     #输出好评
            print('Predict result : 好评', end='\t')
        else:
            result = '1'                     #否则输出差评
            print('Predict result : 差评', end='\t')
        
        #实际该评论的结果
        if y_data[sequence_index] == '0':
            print('Actual results: 好评', end='\t')
        else:   
            print('Actual results: 差评', end='\t')
            
        #判断是否预测正确
        if result == y_data[sequence_index]:
            print('Predict success!', end='\t')
            success_test += 1
        else:
            print('Predict fail!', end='\t')
    
    
        print('\n\n')
    
    print('本次测试预测准确度为: {}'.format(success_test/50))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    运行结果

        购买//笔记本电脑//视频/设计/没想到/听说/超乎/奇葩/根本无法/网络/底部/会议/想着/双下巴/照出来/脖子/基本功能/非正常/人形/前有/常人/思维/
        
        Predict result : 差评	Actual results: 差评	Predict success!	
        
        
        打开/电脑/软件/客服/微软//激活/退/摄像头/有时候/模糊/不回/打不开/敷衍了事/游览器/爱回/
        
        Predict result : 差评	Actual results: 差评	Predict success!	
        
        
        外观/好看/屏幕/运行/速度/效果/外形/程度//质感/挺快/便携/能力//高分辨率/刷新/
        
        Predict result : 好评	Actual results: 好评	Predict success!	
        
        
        好看/京东/物流/很快/喜欢/还行/总体/评价//老公/店里/支持/十年/戴尔/华为/不太会/
        
        Predict result : 好评	Actual results: 好评	Predict success!	
        
        
        不到/电脑/刚买/开机//卡顿/半天/一个月/垃圾/
        
        Predict result : 差评	Actual results: 差评	Predict success!	
        
        
        性能/屏幕/运行/速度/显示/很快/很棒/清晰/特色/出色/协同/多屏/
        
        Predict result : 好评	Actual results: 好评	Predict success!	
        
        
        外观/好看/运行/速度/效果/外形/高级/程度/很快/特别/电脑/清晰/漂亮/开机/软件///壁纸/设置/粉红色/机器人/
        
        Predict result : 好评	Actual results: 好评	Predict success!	
        
        
        流畅/不错/效果/电脑/满意/购物/收到/屏幕显示/
        
        Predict result : 好评	Actual results: 好评	Predict success!	
        
        
        外观/散热/运行/速度/外形/银色/声音//电脑/喜欢/挺快/暂时/发现/挺重/
        
        Predict result : 好评	Actual results: 好评	Predict success!	
        
        
        指纹/解锁/客服/垃圾/解决问题/不灵敏/
        
        Predict result : 差评	Actual results: 差评	Predict success!	
        
        
        屏幕/键盘/特别/打开/收到/指纹/划痕/态度/客户/回答//下方/退回/只会/踢皮球/脏兮兮///避重就轻/
        
        Predict result : 差评	Actual results: 差评	Predict success!	
        
        
        外观/屏幕/不错/散热/分辨率/键盘/办公/运行/速度/效果/细腻/外形/很快//mac/很漂亮/稳定/触摸板/win11/90Hz/
        
        Predict result : 好评	Actual results: 好评	Predict success!	
        
        
        买//建议/不好/
        
        Predict result : 差评	Actual results: 差评	Predict success!	
        
        
        外观/速度/外形/很漂亮/清晰/快递/看着/很炫酷/
        
        Predict result : 好评	Actual results: 好评	Predict success!	
        
        
        外观/入手/键盘/物流/速度/外形/轻薄/程度/很快//包装/漂亮/开机/颜值//严实/强烈推荐/少女/粉色/发光/
        
        Predict result : 好评	Actual results: 好评	Predict success!	
        
        
        办公/舒服/特别/很大/画质/不卡/轻松//推荐/平时/追剧/轻巧/打字/背着/上班族/上下班/
        
        Predict result : 好评	Actual results: 好评	Predict success!	
        
        
        强大/外观/运行/速度/很快/电脑/购买//很漂亮/处理器/硬盘/内存/惊喜/轻松/希望/失望/固态/过程/带来/应对/大学/生活/认准/
        
        Predict result : 好评	Actual results: 好评	Predict success!	
        
        
        性能/外观/好看/电脑/满意//喜欢/笔记本电脑/感受/刚刚/重量/大型/游戏/尺寸/平时/太多/学生/太重/电视剧/惠普/粉红色/
        
        Predict result : 好评	Actual results: 好评	Predict success!	
        
        
        外观/屏幕/不错/效果/外形/轻薄/程度/合适/体验/清晰/喜欢/适合//轻便/学习/耐心/比较满意/女生/追剧/客服/小游戏/
        
        Predict result : 好评	Actual results: 好评	Predict success!	
        
        
        颜色/京东/物流/轻薄/特别/电脑/系统/笔记本电脑//服务态度/一如既往/手感/开机/高大/机身/没得说/耐心/自带/客服/联想/windows11/激活/产品包装/步骤/即可/
        
        Predict result : 好评	Actual results: 好评	Predict success!	
        
        
        性能/外观/视网膜/散热/苹果/运行/速度/效果/外形/程度/很快/发热/满意/特色/以旧换新/arm/架构/16G//内存/英特尔/m1//便宜/飞起/比官//750/补贴/碾压/
        
        Predict result : 好评	Actual results: 好评	Predict success!	
        
        
        耐用/京东/物流/好评/细腻/很快/包装/体验/配置/第二天/总体/购物/一如既往/开机/屏幕显示/几次/希望/方便快捷/硬件/到手/启动/地快/迟钝/符合要求/
        
        Predict result : 好评	Actual results: 好评	Predict success!	
        
        
        外观/不错/外形/轻薄/程度////性价比/适合/整体/开机/软件/金属/顺滑/拿到/简洁/顺畅/昨天//正版/挺轻/office//包里/通勤/
        
        Predict result : 好评	Actual results: 好评	Predict success!	
        
        
        强大/流畅/感觉/系统/变化/软件/越来越/期待/实在/普及/
        
        Predict result : 好评	Actual results: 好评	Predict success!	
        
        
        运行/速度//很快//M1/真香/续航/能力/屏幕显示/一会/呼呼/
        
        Predict result : 好评	Actual results: 好评	Predict success!	
        
        
        屏幕/完美//开机/配送/希望/影响/好大/设置/大暴雨/
        
        Predict result : 好评	Actual results: 好评	Predict success!	
        
        
        京东/质量/速度//电脑/发货/没什么/到货/
        
        Predict result : 好评	Actual results: 好评	Predict success!	
        
        
        外观/好看/屏幕/散热/不算/真的/声音/很大//超级//性价比///看着/上网/网课/课才/运存/
        
        Predict result : 好评	Actual results: 好评	Predict success!	
        
        
        电脑/刚买/商家/客服/电话/有个/解决问题//人工/就让/屁用/
        
        Predict result : 差评	Actual results: 差评	Predict success!	
        
        
        外观/颜色/不错/键盘/效果/做工/比上/清晰//14/手感/拆开/屏幕显示/检查/触摸板/到手/锐利/工整/小钢炮/
        
        Predict result : 好评	Actual results: 好评	Predict success!	
        
        
        性能/外观/好看/屏幕/散热/入手/运行/速度/效果/外形/轻薄/程度/挺快/简约/学习/ok/自带/学生//office/不厚/
        
        Predict result : 好评	Actual results: 好评	Predict success!	
        
        
        触摸板/不行/一个月/
        
        Predict result : 差评	Actual results: 差评	Predict success!	
        
        
        轻薄//体验//系统/喜欢/新款/美观//Win11/新版/
        
        Predict result : 好评	Actual results: 好评	Predict success!	
        
        
        晚上/一周/百分之/买不到/睡眠/
        
        Predict result : 差评	Actual results: 差评	Predict success!	
        
        
        颜色/屏幕/不错/感觉/键盘/银色/真的//几天/清晰//喜欢/重量/评价/性价比/不卡/颜值////女生/ps/大学/人脸识别/背光//cad/
        
        Predict result : 好评	Actual results: 好评	Predict success!	
        
        
        性能/外观/屏幕/散热/运行/速度/效果/外形/轻薄/程度/合适/完美/时尚/特色/超好/尽在不言中/极速/
        
        Predict result : 好评	Actual results: 好评	Predict success!	
        
        
        视频/拆开/磕碰/开关/处有/作证/
        
        Predict result : 差评	Actual results: 差评	Predict success!	
        
        
        流畅/音质/办公/质量/运行/细腻/轻薄/视频/不卡顿/开机/杠杠/屏幕显示/能用/卸载/装个/版本//可靠/office/改天/三五年/反复/
        
        Predict result : 好评	Actual results: 好评	Predict success!	
        
        
        好看/颜色/效果/外形/轻薄/程度//舒服/清晰/大气//轻便/简单/大方/大爱/看着/几次/顺畅/上档次/超赞/心情///随便/外带/舒畅/
        
        Predict result : 好评	Actual results: 好评	Predict success!	
        
        
        真的/声音/怀疑/手机/很差/黑屏/打不开/
        
        Predict result : 差评	Actual results: 差评	Predict success!	
        
        
        性能/屏幕//清晰/快递/双十/一买/本来/周日/周五/感谢/小哥//bookpro//这款/想象/略沉/接受/目前为止/地表/最强//一段时间/评价/
        
        Predict result : 好评	Actual results: 好评	Predict success!	
        
        
        买/12//保价/一侧/500/十二//控盘/偏低/
        
        Predict result : 差评	Actual results: 差评	Predict success!	
        
        
        流畅/音质/运行/几天/一流/好用/体验//接受/评价/习惯/设计/生产力/软件/外型/最新款/理想/
        
        Predict result : 好评	Actual results: 好评	Predict success!	
        
        
        苹果/好评/真的/Mac/耳机/太好/手机/平板/换成/全家//壮大/巨好/
        
        Predict result : 好评	Actual results: 好评	Predict success!	
        
        
        掉/无语/
        
        Predict result : 差评	Actual results: 差评	Predict success!	
        
        
        买//全新/原因/多久/
        
        Predict result : 差评	Actual results: 差评	Predict success!	
        
        
        配送/送货上门/
        
        Predict result : 好评	Actual results: 差评	Predict fail!	
        
        
        办公/保障/做工/质感/满意/这款/玩游戏/轻便/游戏/需求/品牌//老公//点个/网课/显卡/很久选/一家/凑合/三口/
        
        Predict result : 好评	Actual results: 好评	Predict success!	
        
        
        外观/好看/不错/京东/运行/速度/很快/电脑//机器/适合/孩子/选择/收到/美观//上网//疫情/大小/激动/正好/暗处/摄像头/体积/轻盈/隐藏/时期/
        
        Predict result : 好评	Actual results: 好评	Predict success!	
        
        
        降价/一个月/500/
        
        Predict result : 差评	Actual results: 差评	Predict success!	
        
        
        本次测试预测准确度为: 0.98
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225
    • 226
    • 227
    • 228
    • 229
    • 230
    • 231
    • 232
    • 233
    • 234
    • 235
    • 236
    • 237
    • 238
    • 239
    • 240
    • 241
    • 242
    • 243
    • 244
    • 245
    • 246
    • 247
    • 248
    • 249
    • 250
    • 251

    由上可见,本次准确度为 98%,说明50次预测中,49次成功,1次失败。

    失败的案例是因为切词过于严重,仅剩两个有效词向量,出现了异常的情况,可适当对其进行调整,增加准确度。

    小结

    由于本人技术有限,并不清楚词嵌入部分内容,也只是采用了笨拙的统计词频词典方法,期间耗费的内存空间略大,所以并不是特别完美,希望能够帮到需要的小伙伴吧,如有疑问可在下方留言或私信。

  • 相关阅读:
    第十一章 JavaScript操作DOM对象
    Ubuntu系统的k8s常见的错误和解决的问题
    【漏洞复现】大华智慧园区综合管理平台信息泄露漏洞
    新一代 Kaldi 中的 LSTM GradientFilter
    Go语言基础笔记(二)数组、切片、映射与结构体
    分组查询&子查询
    Meta Q2财报:营收首次下滑,Metaverse将与苹果竞争
    Educational Codeforces Round 138 (Rated for Div. 2) D
    抓包神器之Charles(绕过代理屏蔽)以及证书校验绕过
    count(1)、count(*)、count(字段)、count(主键)的区别
  • 原文地址:https://blog.csdn.net/weixin_43479947/article/details/126730761