(一)选题背景:
随着广大用户“即需要、即外卖、即使用”的方便快捷的“外卖生活方式”的形成和普及,如今外卖行业不仅可以满足用户餐饮商品的在线即时购物需求,还可以满足饮食、水果、酒水饮料、家居日用、母婴用品、数码家电、服饰鞋包、美妆护肤、医药等各种品类商品。对于服务行业来说,好评、差评有什么作用呢?最直观的影响,就是后续客户的购买意愿或商家的名誉会受到影响。所以预测好差评对人们进行购物有着重要的意义。于是通过机器学习设计了一套程序用于判断好评、差评。
(二)机器学习设计案例:从网站中下载相关的数据集,对数据集进行整理,在python的环境中,给数据集中的文件打上标签,对数据进行预处理,并运用split分割数据,用贝叶斯模型建立训练模型,最后模型评估并验证。
(三)机器学习的实现步骤
- 下载数据集
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