python实现食品推荐_Python分析亚马逊赞不绝口食物评论
1.背景:
本文是来源于Kaggle平台的亚马逊50多万条食物评论的数据集。此数据集采集时间跨度有十余年,直到2012年十月份共计有56万多条评论信息。 这些信息由食品产品号、用户信息、评分和评价文本组成。当然它也包含了亚马逊里所有其他类别的评论。
数据下载地址⏬https://www.kaggle.com/snap/amazon-fine-food-reviewswww.kaggle.com
细节可见下述:
-1999年10月至2012年十月的评论
-共568454条评论
-共有256059名用户参与评论
-共有74258种产品
-其中有260名用户评论数量超过50条
#导入数据分析包
import pandas as pd
from datetime import datetime
from collections import Counter
#tqdm打印进度条
from tqdm import tqdm
#正则表达式
import re
2.提出问题(Bussiness Understanding)
从评论数据中分析以下业务指标:年评论数
食物好评率
用户觉得评论有用率
预测评论得分是negative还是positive
#读取excel数据
file = '.././data/Reviews.csv'
reviewsDf = pd.read_csv(file, dtype = 'object', index_col = 'Id')
查看数据集的基本信息:
#数据集行列信息
reviewsDf.shape
#查看数据集每一列数据类型
reviewsDf.dtypes
3.数据清洗(Data Preparation)
3.1数据预处理
1)缺失值整理
#查看每一列数据的数据类型和数据总数
reviewsDf.info()
发现:
1. ProfileName有缺失值=568454-568438=16,缺失率=16/568454=0.002%
2. Summary有缺失值=568454-568427=27,缺失率=27/568454=0.005%
2)缺失值处理
#经查看ProfileName的缺失值应填补‘Unknown’代表未知
reviewsDf['ProfileName'] = reviewsDf['ProfileName'].fillna('Unknown')
#经查看Summary的缺失值应填补‘ ’代表空白以免影响后续评论预测
reviewsDf['Summary'] = reviewsDf['Summary'].fillna(' ')
缺失值处理后:
#查看缺失值处理后的每列信息
reviewsDf.info()
3)数据类型转换
评论数、得分转换为整型 时间转换为float型
reviewsDf['HelpfulnessNumerator'] = reviewsDf['HelpfulnessNumerator'].astype('int')
reviewsDf['HelpfulnessDenominator'] = reviewsDf['HelpfulnessDenominator'].astype('int')
reviewsDf['Score'] = reviewsDf['Score'].astype('int')
reviewsDf['Time'] = reviewsDf['Time'].astype('float')
转换后的数据类型:
时间戳转换为日期类型
'''定义时间戳转换函数:先使用datetime转换时间戳为datetime形式 例如”2016-11-30 06:12:49.750000“再使用strftime函数分离出date最后转换为Series类型'''
def changeTimstamp(timeCol):
dateList = []
for time in timeCol:
#例如:datetime.fromtimestamp(1480486369.75) 转换后为2016-11-30 06:12:49.750000格式
dt = datetime.fromtimestamp(time)
#分隔后仅剩2016-11-30
date = dt.strftime("%Y-%m-%d")
dateList.append(date)
#将一维数据再转换回Series类型
dateSer = pd.Series(dateList)
return dateSer
#获取时间戳一列
time = reviewsDf.loc[:, 'Time']
#使用转换函数隔离出date
dateSer = changeTimstamp(time)
#修改这一列值!!!!切记!!
reviewsDf.loc[:, 'Time'] = dateSer
字符串转换为日期类型
reviewsDf.loc[:, 'Time'] = pd.to_datetime(reviewsDf.loc[:, 'Time'],
format = '%Y-%m-%d',
errors= 'coerce')
'''转换日期过程中可能会发生不符合日期格式的数值转换为空值还需删除空值'''
reviewsDf = reviewsDf.dropna(subset = ['Time'])
日期转换后的数据类型:
4)排序
#按日期升序排序
reviewsDf = reviewsDf.sort_values(by = 'Time',
ascending = True,
na_position = 'first')
#排序后重命名行号(index):排序后的列索引值是之前的行号,需要修改成从0到N的升序索引值
reviewsDf = reviewsDf.reset_index(drop = True)
排序后的数据集:
5)异常值处理
#描述指标:
reviewsDf.describe()
对统计结果检查未发现有异常值
6)评论文本处理
#复原评论文本的缩写情况
def decontracted(phrase):
# 特殊情况
phrase = re.sub(r"won't", "will not", phrase)
phrase = re.sub(r"can\'t", "can not", phrase)
# 一般情况
phrase = re.sub(r"n\'t", " not", phrase)
phrase = re.sub(r"\'re", " are", phrase)
phrase = re.sub(r"\'s", " is", phrase)
phrase = re.sub(r"\'d", " would", phrase)
phrase = re.sub(r"\'ll", " will", phrase)
phrase = re.sub(r"\'t", " not", phrase)
phrase = re.sub(r"\'ve", " have", phrase)
phrase = re.sub(r"\'m", " am", phrase)
return phrase
#建立停顿单词列表
#如果评论中含有
tags的话我们首要步骤就是移除
stopwords= set(['br', 'the', 'i', 'me', 'my', 'myself', 'we', 'our', 'ours', 'ourselves', 'you', "you're", "you've",\
"you'll", "you'd", 'your', 'yours', 'yourself', 'yourselves', 'he', 'him', 'his', 'himself', \
'she', "she's", 'her', 'hers', 'herself', 'it', "it's", 'its', 'itself', 'they', 'them', 'their',\
'theirs', 'themselves', 'what', 'which', 'who', 'whom', 'this', 'that', "that'll", 'these', 'those', \
'am', 'is', 'are', 'was', 'were', 'be', 'been', 'being', 'have', 'has', 'had', 'having', 'do', 'does', \
'did', 'doing', 'a', 'an', 'the', 'and', 'but', 'if', 'or', 'because', 'as', 'until', 'while', 'of', \
'at', 'by', 'for', 'with', 'about', 'against', 'between', 'into', 'through', 'during', 'before', 'after',\
'above', 'below', 'to', 'from', 'up', 'down', 'in', 'out', 'on', 'off', 'over', 'under', 'again', 'further',\
'then', 'once', 'here', 'there', 'when', 'where', 'why', 'how', 'all', 'any', 'both', 'each', 'few', 'more',\
'most', 'other', 'some', 'such', 'only', 'own', 'same', 'so', 'than', 'too', 'very', \
's', 't', 'can', 'will', 'just', 'don', "don't", 'should', "should've", 'now', 'd', 'll', 'm', 'o', 're', \
've', 'y', 'ain', 'aren', "aren't", 'couldn', "couldn't", 'didn', "didn't", 'doesn', "doesn't", 'hadn',\
"hadn't", 'hasn', "hasn't", 'haven', "haven't", 'isn', "isn't", 'ma', 'mightn', "mightn't", 'mustn',\
"mustn't", 'needn', "needn't", 'shan', "shan't", 'shouldn', "shouldn't", 'wasn', "wasn't", 'weren', "weren't", \
'won', "won't", 'wouldn', "wouldn't"])
from bs4 import BeautifulSoup
preprocessed_reviews = []
#处理评论中的句子
for sentance in tqdm(reviewsDf['Text'].values):
#去除评论中的urls
sentance = re.sub(r"http\S+", "", sentance)
#去除评论中的tags
sentance = BeautifulSoup(sentance, 'lxml').get_text()
#复原评论中的单词缩写
sentance = decontracted(sentance)
#去除单词中的数字
sentance = re.sub("\S*\d\S*", "", sentance).strip()
#去除评论中的特殊字符
sentance = re.sub('[^A-Za-z0-9]+', ' ', sentance)
#强制评论中单词都转换为小写
sentance = ' '.join(e.lower() for e in sentance.split() if e.lower() not in stopwords)
preprocessed_reviews.append(sentance.strip())
处理后的结果:
7)评论摘要文本处理
#与‘Text’文本处理方式类似
preprocessed_summary = []
#处理评论中的句子
for summary in tqdm(reviewsDf['Summary'].values):
#去除评论中的urls
summary = re.sub(r"http\S+", "", str(summary))
#去除评论中的tags
summary = BeautifulSoup(summary, 'lxml').get_text()
#复原评论中的单词缩写
summary = decontracted(summary)
#去除单词中的数字
summary = re.sub("\S*\d\S*", "", summary).strip()
#去除评论中的特殊字符
summary = re.sub('[^A-Za-z0-9]+', ' ', summary)
#强制评论中单词都转换为小写
summary = ' '.join(e.lower() for e in summary.split() if e.lower() not in stopwords)
preprocessed_summary.append(summary.strip())
3.2特征工程(Feature Engineering)
3.2.1特征选择
预测评论是“positive”还是”negative“,postive用1表示,negative用0表示 Score范围在[1, 5]之间,所以需要去除中性评论score=3 规则:得分为1,2的为negative 得分为3,4的为positive
#特征为“Text”,标签为“Score”
reviewsDf['Score'].value_counts()
3.2.2特征提取
#剔除得分为三分的数据
finalDf = reviewsDf[reviewsDf['Score'] != 3]
#将得分Score进行分类:1和2为negative,即0;4和5为positive,即为1
scoreDict = {
1 : 0,
2 : 0,
4 : 1,
5 : 1
}
finalDf['Sentiment'] = finalDf['Score'].map(scoreDict)
4.构建模型(Modeling)
业务指标1:年评论数
#总评论数为此dateframe的行数
totalReviews = reviewsDf.shape[0]
总评论数为 568454
'''计算年数'''
#第一步:获取时间范围
#最小时间值
startDate = reviewsDf.loc[0, 'Time']
#最大时间值
endDate = reviewsDf.loc[totalReviews - 1, 'Time']
#第二步:计算年数
days = (endDate - startDate).days
#天数整除365为年数
years = days // 365
年数为 13
#业务指标1:年评论数
yearAverageReviews = totalReviews // years
从1999年至2012年平均每年亚马逊评论数有 43727 条
业务指标2: 食物好评率
#共有多少产品
kpi2_Df = reviewsDf.drop_duplicates(subset = ['ProductId'])
totalProduct = kpi2_Df.shape[0]
共有 74258 种食物
#平均得分的频率分布
averageScore = reviewsDf.groupby(reviewsDf['ProductId'])['Score'].mean()
ff = averageScore.value_counts()
#获得5分平均分的食物频率
score5 = ff.iloc[0]
共有 29904 种食物获得平均分为5分
#食物好评率
favorRate = score5 / totalProduct * 100
食物好评率为:40.27%
该数据集的平均得分为4.183198640523243
scoreSer = reviewsDf['Score']
z_ci = 1.96 #置信水平对应的z值(z_ci) 查z表格可以得到,95%的置信水平对应的z值
#样本平均值
samp_mean = scoreSer.mean()
#样本标准差
samp_std = scoreSer.std()
#样本大小
n = reviewsDf.shape[0]
#标准误差
se = samp_std / (np.sqrt(n))
#置信区间a
a = samp_mean - z_ci * se
#置信区间b
b = samp_mean + z_ci * se
95%置信水平的置信区间 CI = (4.179792, 4.186605)
业务指标3:用户觉得评论有用率
#HelpfulnessNumerator, HelpfulnessDenominator这两列相除得到每条评论的有用率
helpfulnessRate = reviewsDf['HelpfulnessNumerator'] / reviewsDf['HelpfulnessDenominator'] * 100
#评论有用率频率分布
hf = helpfulnessRate.value_counts()
#评论有用率为100的频数
helpfulness = hf.iloc[0]
共有 183309 个评论有用率为100的
#用户觉得评论有用率
hRate = helpfulness / totalReviews * 100
用户觉得评论有用率为:32.25%
业务指标4:预测评论得分是negative还是positive
建立训练数据集和测试数据集
建立词频向量化模型: stop_words是停用词,当设置为‘None’时表示不去掉停用词,当设置为'english’时则去掉停用词 在英文中单个长度的词往往属于停用词范围,比如u, r, x, o等等之类的
另外,特征不可能以字符串形式出现,所以需要将‘Text’使用fit_transform转换成各个词汇出现的频率矩阵
#导入词频向量化包
from sklearn.feature_extraction.text import CountVectorizer
c = CountVectorizer(stop_words = 'english')
#设立特征
X = finalDf['Text']
#转换text为各个单词出现的次数
textX = c.fit_transform(X)
#设立标签
y = finalDf['Sentiment']
#建立训练数据集和测试数据集
from sklearn.model_selection import train_test_split
train_X, test_X, train_y, test_y = train_test_split(textX,
y,
test_size = .8)
原始数据集特征: 114969 训练数据集特征: 105162 测试数据集特征: 420652
原始数据集标签: 525814 训练数据集标签: 105162 测试数据集标签: 420652
选择机器学习算法
#第一步:导入算法
from sklearn.linear_model import LogisticRegression
#第二步:创建模型-逻辑回归(Logistic Regression)
model = LogisticRegression()
训练模型
#训练模型
model.fit(train_X, train_y)
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
intercept_scaling=1, max_iter=100, multi_class='warn',
n_jobs=None, penalty='l2', random_state=None, solver='warn',
tol=0.0001, verbose=0, warm_start=False)
5.模型评估(Evaluation)
#查看模型的正确率
model.score(test_X, test_y)
正确率将近92.97%。
这已表示我们建立的这个模型吻合度已经很高了
6.报告撰写(Deployment)
学习随笔请往下看:老佛爷:Python & Machine Learning那几点zhuanlan.zhihu.com
python实现食品推荐_Python分析亚马逊赞不绝口食物评论相关推荐
- 亚马逊推荐python_Python之亚马逊智能产品评论分析
在万物互联时代,智能产品正在推动着智能生活迅速普及.聚焦广阔的智能产品市场,亚马逊一直致力于扩大智能产品阵容,作为典型的跨境电商B2C平台,与消费者互动的最直接.高效的方法是分析消费者评论. 一.明确 ...
- Python实现通过ASIN爬取亚马逊产品评论
Python实现通过ASIN爬取亚马逊产品评论 一.最近一直在研究爬取亚马逊评论相关的信息,亚马逊的反爬机制还是比较严格的,时不时就封cookie啊封ip啊啥的.而且他们的网页排版相对没有那么规则,所 ...
- Python实现 关联规则的Apriori 算法-亚马逊购物零售数据挖掘
关联规则 关联规则(AssociationRules),无监督学习方法,用于知识发现. 其可以用于给数据进行标注,但缺点是其结果难以进行评估. 关联规则的最经典的案例就是购物篮分析.同样也可用于电影推 ...
- Python基于BeautifulSoup4库爬取亚马逊网页
引言 我写的这个爬虫非常的简单,没有什么难的逻辑思维,只是简单运用BeautifulSoup进行爬取,相信初学者都可以看懂,就是代码写的比较乱,因为我也是初学者....可能你没有耐心看完,我会尽量一部 ...
- 亚马逊产品情感评论分析
爬取亚马逊网站评论信息并存入excel表 import requests from lxml import etree import re import xlwtfrom openpyxl impor ...
- 分析亚马逊竞争对手Listing的技巧与操作步骤
对于亚马逊卖家来说,特别好用的一个运营策略就是"研究竞争对手,优化自己的运营方向",如果你想要打造出一个优质的Listing 那么你就可以去研究你的竞争对手.进行取长补短,竞争对 ...
- 推荐一本书《亚马逊网络书店传奇》
亚马逊网上书店(www.amazon.com)无疑是时下IT界最耀目的明星,其创业方式完全改写了传统营销模式,并演绎电子商务的真义.亚马逊网上书店是其创始人兼首席执行官杰夫·贝佐斯1995年7月在自家 ...
- 亚马逊鲲鹏系统评论批量点赞或举报的一款神器
亚马逊评论多账号批量点赞好评可以把好评置顶,把差评移在后面去,而举报差评也可以把差评移在后面去或者被平台删除掉,这样可以做到首页无差评! 亚马逊鲲鹏系统对于批量点赞或者举报有两种操作方法,一种是先搜索 ...
- 亚马逊测评的评论为什么老被删?
1.留评率过高 在亚马逊listing的访问量.产品的订单数量.产品的交易量和留下的评论数量都有一个平均值.现在很多亚马逊卖家刚开店,产品一上架,就通过亚马逊测评积累好评,结果产品留评率过高,被亚马逊 ...
最新文章
- 使用Pycharm创建一个Django项目
- if(x1-x20) c语言,如何用if语句实现求方程a*x*x+b*x+c=0的根。
- Spark不是唯一,三种新兴的开源数据分析工具
- spring boot 使用外部配置文件
- php 机数,PHP实现自动刷数和“灌水”机
- 为何gpio_to_irq不能静态使用?【转】
- 编写有效用例电子版_软件测试人员必须编写代码吗?
- 梁鑫:重构 - 在美股行情系统的实践
- 如何使用mock应对测试所需随机数据
- python如何调用阿里云接口_python 调用阿里云云解析api添加记录
- R语言页游渠道分析(转)
- Host-Only(仅主机模式)
- 市场监管总局通报部分转供电主体不执行国家电价政策案例
- CorelDraw x6【Cdr x6】官方简体中文破解版(64位)安装图文教程、破解注册方法...
- OpenDDS项目练习指南
- 数独解题程序的python实现_使用Python编写程序求解数独游戏答案
- 补全缺失的64位dll,0xc000007b
- 网站服务器ip解析,服务器 域名 解析ip
- 幼儿园趣味舞蹈课教案
- 加拿大留学计算机专业好移民吗,加拿大留学有哪些专业比较容易移民和就业
热门文章
- Shell 的基础知识
- 美股数据获取 python_python3+tesseract获取美股PEG图像上的数据
- 女程序员在GitHub提交PR更易被拒?开源世界“她”力量
- MySQL 中的共享表空间与独立表空间,用哪个好呢?
- 软件工程师安德烈·梅萨加冕 2021 世界小姐冠军
- 华为一则面试题登上热搜;大众点评会员因点赞过多被处罚;Linux Kernel 5.12 发布|极客头条...
- ​BAT 等 34 家企业签署合规经营承诺书;美团被判赔偿饿了么 35.2 万元;FreeBSD 13.0 发布|极客头条...
- 重量级!Maven史上最全教程,看了必懂
- 永久居家办公,你愿意吗?
- 苹果回应:iPhone 11用北斗导航作为位置数据系统一部分;马云回应年轻人去做快递小哥;Linux Lab发布v0.5 rc3| 极客头条