首页 > 编程语言 >python机器学习——点评评论分析

python机器学习——点评评论分析

时间:2023-06-05 19:23:36浏览次数:43  
标签:python pred 差评 点评 mt train 评论 print cls

(一)选题背景:

随着广大用户“即需要、即外卖、即使用”的方便快捷的“外卖生活方式”的形成和普及,如今外卖行业不仅可以满足用户餐饮商品的在线即时购物需求,还可以满足饮食、水果、酒水饮料、家居日用、母婴用品、数码家电、服饰鞋包、美妆护肤、医药等各种品类商品。对于服务行业来说,好评、差评有什么作用呢?最直观的影响,就是后续客户的购买意愿或商家的名誉会受到影响。所以预测好差评对人们进行购物有着重要的意义。于是通过机器学习设计了一套程序用于判断好评、差评。

(二)机器学习设计案例:从网站中下载相关的数据集,对数据集进行整理,在python的环境中,给数据集中的文件打上标签,对数据进行预处理,并运用split分割数据,用贝叶斯模型建立训练模型,最后模型评估并验证。

(三)机器学习的实现步骤

  1. 下载数据集

 

 

2.导入所需要的库

 1 import numpy as np
 2 
 3 import pandas as pd
 4 """
 5 文本预测
 6 
 7 得出信息:
 8 
 9 - 行:32483条数据  缺失值:stars 跟cus_comment
10 
11 - 列:14列
12 
13     - 目标:stars 星级评分
14 
15  - 特征:cus_comment:评价内容 ->> 词汇决定好评/差评
16 """
17 dz_data = pd.read_csv("./某点评评论.csv")
18 
19 dz_data.info()
20 
21 dz_data.head()

 

 

 1
"""
1-2:差评 --- >0 2 3 4-5:好评 --- >1 4 5 3:中评 --- >干扰干扰项! ---> np.nan
""" 6 7 rpl_data = {1.0:0, 2.0:0, 3.0:np.nan, 4.0:1, 5.0:1} #对目标值进行替换取代 8 9 dz_data["label"] = dz_data["stars"].map(rpl_data) 10 11 dz_data.info() 12 13 dz_data.head()

 

 

1 # 注意:删除缺失值
2 
3 dz_data_2 = dz_data.dropna()
4 
5 dz_data_2.info()
6 
7 dz_data.head()

 

 


 

3.数据分割

 

 1 from sklearn.model_selection import train_test_split
 2# 特征 目标
 3 
 4 x_train, x_test, y_train, y_test = train_test_split(dz_data_2["cus_comment"], dz_data_2["label"], random_state=3, test_size=0.25)
 5 print(len(y_train))
 6 print(len(y_test))
 7 print(len(x_train))
 8 print(len(x_test))

 1 x_train 

 

1 #去除停用词   把没作用的词去除
2 
3 f = open("stopwords.txt", encoding="utf-8")    #使用停用词表
4 
5 stop_words = f.readlines()
6 
7 stop_words = [word.strip() for word in stop_words]
8 
9 stop_words

 

 

1 #使用 tf-idf 进行文本处理用于信息检索与数据挖掘
2 
3 from sklearn.feature_extraction.text import TfidfVectorizer
4 
5 # ngram_range=(1,2) ->> 表示选取1-2个词作为组合方式
6 
7 tf_idf = TfidfVectorizer(stop_words=stop_words, max_features=4000, ngram_range=(1,2))
8 
9 tf_idf.fit(x_train)

 

 

 

4.建立模型

1  #贝叶斯模型
2 
3 from sklearn.naive_bayes import MultinomialNB      
4 
5 mt_cls = MultinomialNB()    #实义化
6 
7 mt_cls.fit(tf_idf.transform(x_train), y_train)    #训练

 

 

模型评估

 1 pred_proba = mt_cls.predict_proba(tf_idf.transform(x_test))[:,1] 2 3 pred_proba 4 5 mt_cls.score(tf_idf.transform(x_test), y_test) 

 

 

看多次评分结果 ->> 交叉验证

 

 5.测试模型

 1 test1 = "感觉这边环境不是很好,但是,挺好吃的!好评!!!"
 2 
 3 test2 = "这是我在长沙吃的最好的一顿,第一个上来的毛豆,配上灵魂酱汁YYDS。第二个豆花,也太好吃了把!花甲的汤汁也是无敌了"
 4 
 5 test3 = "朋友说很好吃,抱有非常大的期望,但结果很失望!!一点都不好吃"
 6 
 7 test4 = "差评!!。"
 8 
 9 import jieba                          #用jieba进行分词
10 
11 def pred(model, test_s):
12 
13     s_fenci = " ".join(list(jieba.cut(test_s)))
14 
15     s_fenci = pd.Series(s_fenci)
16 
17 #     print(s_fenci)
18 
19     proba = model.predict_proba(tf_idf.transform(s_fenci))[:,1][0]
20 
21 #     print(proba)
22 
23 return proba
24 
25 print(f"test1预测为好评的概率是:{pred(mt_cls, test1)}")
26 
27 print(f"           差评的概率是:{1-pred(mt_cls, test1)}")
28 
29 print(f"test2预测为好评的概率是:{pred(mt_cls, test2)}")
30 
31 print(f"           差评的概率是:{1-pred(mt_cls, test2)}")
32 
33 print(f"test3预测为好评的概率是:{pred(mt_cls, test3)}")
34 
35 print(f"           差评的概率是:{1-pred(mt_cls, test3)}")
36 
37 print(f"test4预测为好评的概率是:{pred(mt_cls, test4)}")
38 
39 print(f"           差评的概率是:{1-pred(mt_cls, test4)}")

 

 

 

 

差评测试中由于数据样本少,导致预测不准确

 1 test5 = "感觉很一般吧,东西没听说的那么好吃,有点些东西是冷的,不太新鲜"
 2 
 3 test6 = "一直网上看人说不错,但是我吃了没说的那么好吃,可能有点虚化了"
 4 
 5 test7 = "垃圾垃圾垃圾别去"
 6 
 7 test8 = "东西不新鲜是冷的"
 8 
 9 print(f"test5预测为好评的概率是:{pred(mt_cls, test5)}")     #结果极其不准确
10 
11 print(f"           差评的概率是:{1-pred(mt_cls, test5)}")
12 
13 print(f"test6预测为好评的概率是:{pred(mt_cls, test6)}")
14 
15 print(f"           差评的概率是:{1-pred(mt_cls, test6)}")
16 
17 print(f"test7预测为好评的概率是:{pred(mt_cls, test7)}")
18 
19 print(f"           差评的概率是:{1-pred(mt_cls, test7)}")
20 
21 print(f"test8预测为好评的概率是:{pred(mt_cls, test8)}")
22 
23 print(f"           差评的概率是:{1-pred(mt_cls, test8)}")

 

 

 

 

解决办法:添加差评样本的数据,复制差评信息使得与好评信息量基本一致

 1 dz_data_2["label"].value_counts()
 2 
 3 # 获取目标为0的目标数据
 4 
 5 y_lower = y_train[y_train==0]
 6 
 7 # 获取目标为0的特征数据
 8 
 9 x_lower = x_train[y_train==0]
10 
11 x_lower
12 
13 y_lower

 

 

 1 y_train_2 = y_train
 2 
 3 x_train_2 = x_train
 4 
 5 #追加十次
 6 
 7 for count in range(10):
 8 
 9     y_train_2 = y_train_2.append(y_lower)
10 
11 x_train_2 = x_train_2.append(x_lower)
12 
13 y_train_2.value_counts()    #好评与差评数量一致

 

 

 

采用重构训练集训练

 1 mt_cls_2 = MultinomialNB()   2 mt_cls_2.fit(tf_idf.transform(x_train_2), y_train_2)  

 

 

#模型预测

 1 pred_proba_2 = mt_cls_2.predict_proba(tf_idf.transform(x_test))[:,1] 2 pred_proba_2 

 

 

#模型评分

 1 mt_cls_2.score(tf_idf.transform(x_test), y_test) 

 

 

多次验证

 1 print(f"test5预测为好评的概率是:{pred(mt_cls_2, test1)}")     
 2 
 3 print(f"           差评的概率是:{1-pred(mt_cls_2, test1)}")
 4 
 5 print(f"test6预测为好评的概率是:{pred(mt_cls_2, test2)}")
 6 
 7 print(f"           差评的概率是:{1-pred(mt_cls_2, test2)}")
 8 
 9 print(f"test7预测为好评的概率是:{pred(mt_cls_2, test3)}")
10 
11 print(f"           差评的概率是:{1-pred(mt_cls_2, test3)}")
12 
13 print(f"test8预测为好评的概率是:{pred(mt_cls_2, test4)}")
14 
15 print(f"           差评的概率是:{1-pred(mt_cls_2, test4)}")

 

  #结果准确

 

1 test5 = "感觉很一般吧,东西没听说的那么好吃,有点些东西是冷的,不太新鲜"
2 
3 test6 = "一直网上看人说不错,但是我吃了没说的那么好吃,可能有点虚化了"
4 
5 test7 = "垃圾垃圾垃圾别去"
6 
7 test8 = "东西不新鲜是冷的"

 

 

(四)总结

收获:机器学习就是从数据中挖掘出有价值的信息数据本身是无意识的,它不能自动呈现出有用的信息。要给数据一个抽象的表示接着基于表示进行建模然后估计模型的参数,也就是计算;了应对大规模的数据所带来的问题,我们还需要设计一些高效的实现手段,包括硬件层面和算法层面。

改进建议:可以进行多次训练和添加更多的数据集来提高机器的判断正确率

全代码:

  1 import numpy as np
  2 
  3 import pandas as pd
  4 
  5 dz_data = pd.read_csv("./某点评评论.csv")
  6 
  7 dz_data.info()
  8 
  9 dz_data.head()
 10 
 11 rpl_data = {1.0:0, 2.0:0, 3.0:np.nan, 4.0:1, 5.0:1}    #对目标值进行替换取代
 12 
 13 dz_data["label"] = dz_data["stars"].map(rpl_data)
 14 
 15 dz_data.info()
 16 
 17 dz_data.head()
 18 
 19 # 注意:删除缺失值
 20 
 21 dz_data_2 = dz_data.dropna()
 22 
 23 dz_data_2.info()
 24 
 25 dz_data.head()
 26 
 27 from sklearn.model_selection import train_test_split
 28 
 29 # 特征 目标
 30 
 31 x_train, x_test, y_train, y_test = train_test_split(dz_data_2["cus_comment"], dz_data_2["label"], random_state=3, test_size=0.25)
 32 
 33 print(len(y_train))
 34 
 35 print(len(y_test))
 36 
 37 print(len(x_train))
 38 
 39 print(len(x_test))
 40 
 41 f = open("stopwords.txt", encoding="utf-8")    #使用停用词表
 42 
 43 stop_words = f.readlines()
 44 
 45 stop_words = [word.strip() for word in stop_words]
 46 
 47 stop_words
 48 
 49 print(len(stop_words))
 50 
 51 使用 tf-idf 进行文本处理
 52 
 53 from sklearn.feature_extraction.text import TfidfVectorizer
 54 
 55 # ngram_range=(1,2) ->> 表示选取1-2个词作为组合方式
 56 
 57 tf_idf = TfidfVectorizer(stop_words=stop_words, max_features=4000, ngram_range=(1,2))
 58 
 59 # fit ->> 训练
 60 
 61 # transform ->> 转换数据
 62 
 63 # fit_transform ->> 训练&转换数据
 64 
 65 tf_idf.fit(x_train)
 66 
 67 from sklearn.naive_bayes import MultinomialNB      #采用贝叶斯模型
 68 
 69 mt_cls = MultinomialNB()    #实例化
 70 
 71 mt_cls.fit(tf_idf.transform(x_train), y_train)    #训练
 72 
 73 # 好评差评的概率
 74 
 75 pred_proba = mt_cls.predict_proba(tf_idf.transform(x_test))[:,1]
 76 
 77 pred_proba
 78 
 79 #模型评分
 80 
 81 mt_cls.score(tf_idf.transform(x_test), y_test)
 82 
 83 from sklearn.model_selection import cross_val_score
 84 
 85 scores = cross_val_score(mt_cls, tf_idf.transform(x_test), y_test, cv=10)
 86 
 87 np.mean(scores)    #多测预测取平均值
 88 
 89 test1 = "感觉这边环境不是很好,但是,挺好吃的!好评!!!"
 90 
 91 test2 = "这是我在长沙吃的最好的一顿,第一个上来的毛豆,配上灵魂酱汁YYDS。第二个豆花,也太好吃了把!花甲的汤汁也是无敌了"
 92 
 93 test3 = "朋友说很好吃,抱有非常大的期望,但结果很失望!!一点都不好吃"
 94 
 95 test4 = "差评!!。"
 96 
 97 import jieba
 98 
 99 # 注意1:test系列没有做分词处理 ->> 以空格连接词语为一整个字符串
100 
101 # 注意2:处理完后,进行tf-idf处理
102 
103 # 注意3:预测得到概率
104 
105 def pred(model, test_s):
106 
107     s_fenci = " ".join(list(jieba.cut(test_s)))
108 
109     s_fenci = pd.Series(s_fenci)
110 
111 #     print(s_fenci)
112 
113     proba = model.predict_proba(tf_idf.transform(s_fenci))[:,1][0]
114 
115 #     print(proba)
116 
117     return proba
118 
119 print(f"test1预测为好评的概率是:{pred(mt_cls, test1)}")
120 
121 print(f"           差评的概率是:{1-pred(mt_cls, test1)}")
122 
123 print(f"test2预测为好评的概率是:{pred(mt_cls, test2)}")
124 
125 print(f"           差评的概率是:{1-pred(mt_cls, test2)}")
126 
127 print(f"test3预测为好评的概率是:{pred(mt_cls, test3)}")
128 
129 print(f"           差评的概率是:{1-pred(mt_cls, test3)}")
130 
131 print(f"test4预测为好评的概率是:{pred(mt_cls, test4)}")
132 
133 print(f"           差评的概率是:{1-pred(mt_cls, test4)}")
134 
135 #差评测试
136 
137 test5 = "感觉很一般吧,东西没听说的那么好吃,有点些东西是冷的,不太新鲜"
138 
139 test6 = "一直网上看人说不错,但是我吃了没说的那么好吃,可能有点虚化了"
140 
141 test7 = "垃圾垃圾垃圾别去"
142 
143 test8 = "东西不新鲜是冷的"
144 
145 dz_data_2["label"].value_counts()
146 
147 # 获取目标为0的目标数据
148 
149 y_lower = y_train[y_train==0]
150 
151 # 获取目标为0的特征数据
152 
153 x_lower = x_train[y_train==0]
154 
155 x_lower
156 
157 y_lower
158 
159 y_train_2 = y_train
160 
161 x_train_2 = x_train
162 
163 #追加十次
164 
165 for count in range(10):
166 
167     y_train_2 = y_train_2.append(y_lower)
168 
169     x_train_2 = x_train_2.append(x_lower)
170 
171     y_train_2.value_counts()    #好评与差评数量一致
172 
173     mt_cls_2 = MultinomialNB()     #采用重构训练集训练
174 
175 mt_cls_2.fit(tf_idf.transform(x_train_2), y_train_2)
176 
177 #模型预测
178 
179 pred_proba_2 = mt_cls_2.predict_proba(tf_idf.transform(x_test))[:,1]
180 
181 pred_proba_2
182 
183 #模型评分
184 
185 mt_cls_2.score(tf_idf.transform(x_test), y_test)
186 
187 from sklearn.model_selection import cross_val_score
188 
189 scores = cross_val_score(mt_cls_2, tf_idf.transform(x_test), y_test, cv=10)
190 
191 np.mean(scores)    #多测预测取平均值
192 
193 print(f"test5预测为好评的概率是:{pred(mt_cls_2, test1)}")     #结果准确
194 
195 print(f"           差评的概率是:{1-pred(mt_cls_2, test1)}")
196 
197 print(f"test6预测为好评的概率是:{pred(mt_cls_2, test2)}")
198 
199 print(f"           差评的概率是:{1-pred(mt_cls_2, test2)}")
200 
201 print(f"test7预测为好评的概率是:{pred(mt_cls_2, test3)}")
202 
203 print(f"           差评的概率是:{1-pred(mt_cls_2, test3)}")
204 
205 print(f"test8预测为好评的概率是:{pred(mt_cls_2, test4)}")
206 
207 print(f"           差评的概率是:{1-pred(mt_cls_2, test4)}")
208 
209 test5 = "感觉很一般吧,东西没听说的那么好吃,有点些东西是冷的,不太新鲜"
210 
211 test6 = "一直网上看人说不错,但是我吃了没说的那么好吃,可能有点虚化了"
212 
213 test7 = "垃圾垃圾垃圾别去"
214 
215 test8 = "东西不新鲜是冷的"
216 
217 print(f"test5预测为好评的概率是:{pred(mt_cls_2, test5)}")     #结果准确
218 
219 print(f"           差评的概率是:{1-pred(mt_cls_2, test5)}")
220 
221 print(f"test6预测为好评的概率是:{pred(mt_cls_2, test6)}")
222 
223 print(f"           差评的概率是:{1-pred(mt_cls_2, test6)}")
224 
225 print(f"test7预测为好评的概率是:{pred(mt_cls_2, test7)}")
226 
227 print(f"           差评的概率是:{1-pred(mt_cls_2, test7)}")
228 
229 print(f"test8预测为好评的概率是:{pred(mt_cls_2, test8)}")
230 
231 print(f"           差评的概率是:{1-pred(mt_cls_2, test8)}")

 

标签:python,pred,差评,点评,mt,train,评论,print,cls
From: https://www.cnblogs.com/lswkaka/p/17458451.html

相关文章

  • python时间和日期处理
    1.时间处理time相关操作:获取当前时间时间转字符串字符串转时间计算时间差importtimenow=time.time()#时间戳从1970年1月1日0点0分0秒到此刻的秒数print(f"{now=}")now_st=time.localtime(now)#标准时间年月日,时分秒print(f"{now_st}")now_str=time.strftim......
  • Python实验课5
    实验任务六实验源码:1withopen('data6.csv','r',encoding='gbk')asf:2data=f.readlines()3data1=[str(eval(data[i]))foriinrange(1,len(data))]4data2=[str(int(eval(data[i])+0.5))foriinrange(1,len(data))]5info=......
  • Python网络爬虫-东方财经
    (一)、选题的背景为什么要选择此选题?要达到的数据分析目标是什么?从社会、经济、技术、数据来源等方面进行描述(200字以内)(10分) 经济蓬勃发展的世纪,财经新闻报道了国内外的经济数据、政策、企业动态等信息,这些信息对我们了解宏观经济的形势非常重要。通过财经新闻,我们可以了解到......
  • python文件路径和内容处理以及异常处理
    1.文件路径绝对路径和相对路径绝对路径:绝对路径,从盘符开始的路径(d:\data\file\abc.txt)frompathlibimportPathpath=Path('test.txt')print(path.absolute())相对路径:相对于当前的路径,当前是一个变量,在执行python时,所处的目录(./abc/a.txt ../ab/c.txttest.txt)没有......
  • python作用域
    1变量作用域变量(所有在内存中的数据)作用域:LEGBL:Local本地作用域(局部作用域),函数内部E:Enclosed闭包作用于,两个函数之间的,G:Gobal全局作用域(这个文件)B:Builtln内置作用域(全局通用)(pprint(builtins))内置:在任何地方,都可以直接使用全局:在本文件的任何地方,可以直接使用访问顺序:当我......
  • # yyds干货盘点 # Python中encoding='utf-8-sig'是什么意思
    大家好,我是皮皮。一、前言前几天在Python白银群【凡人不烦人】问了一个Python编码的问题,这里拿出来给大家分享下。二、实现过程这里大家一起来学习下。在Python中,encoding='utf-8-sig' 是一种编码格式,用于指定字符串的编码方式。具体来说,utf-8-sig 编码格式是 utf-8 编码的一种......
  • python解析
    关于beautifulsoupBeautifulSoup用来从HTML或XML文件中提取数据现在最新的版本是beautifulsoup3已经停止开发,现在最新推荐使用的是beautifulsoup4安装pipinstallbeautifulsoup4beautifulsoup要用起来还需要一个解析器的东西,官网列出了主要的一些解析器除了第一个标......
  • Python 基础(一):入门必备知识
    入门必备知识 1标识符 标识符是编程时使用的名字,用于给变量、函数、语句块等命名,Python中标识符由字母、数字、下划线组成,不能以数字开头,区分大小写。以下划线开头的标识符有特殊含义,单下划线开头的标识符,如:_xxx,表示不能直接访问的类属性,需通过类提供的接口进行访问,......
  • 使用 python-fire 快速构建 CLI
    命令行应用程序是开发人员最好的朋友。想快速完成某事?只需敲击几下键盘,您就已经拥有了想要的东西。Python是许多开发人员在需要快速组合某些东西时选择的第一语言。但是我们拼凑起来的东西在大多数时候并不是一个完整的CLI,您需要管理标志、解析参数、链接子命令等等,这很麻烦,因此......
  • python+uiautomator2+atx,未开启底部导航栏会存在元素不一致
    如果在同一个安卓手机上,一个应用程序开启了底部导航栏而另一个未开启,在UI自动化测试中,这可能会导致元素在两个应用程序之间的定位方式有所不同。因为不同的应用程序可能会使用不同的布局和元素渲染方式。如果在未开启导航栏的应用程序中无法找到元素,则需要确保您的locator与该应......