之前我们已经通过爬虫将京东的商品评论抓取下来,本文进行后续的操作
原文章的地址:
https://blog.csdn.net/qq_42692386/article/details/105120598
首先我们将数据从之前存入的数据库中取出来
#从数据库中取出评论 数据
def gettxt():
conn= sqlite3.connect("comments.db")
sql='select comment from Comments_jd'
cursor=conn.execute(sql)#执行查询语句,返回sqlite3.Cursor object
text=cursor.fetchall()# 获得查询结果集
commentstr=''
for txt in text:
commentstr=commentstr+txt[0]
return commentstr,text
conn.close()
我们可以看到取出来的数据为一个list,同时list里的每个元素为一个元组。所以思路上我们一个返回原始数据供情感分析每个评论使用,另外将所有评论拼接供分词使用
之后是分词和词云部分:
#分词与词云处理
def get_wordcloud(commentstr):
# 文本预处理
pattern = re.compile(u'\t|\n|\.|-|:|;|\)|\(|\?|"') # 定义正则表达式匹配模式,u后面字符串以 Unicode 格式 进行编码,一般用在中文字符串前面,防止因为源码储存格式问题,导致再次使用时出现乱码
string_data = re.sub(pattern, '', commentstr) # 将符合模式的字符去除
# 文本分词
'''
结巴分词模式
# jieba.lcut(s) 精确模式,返回一个列表,不存在冗余单词
# jieba.lcut(s,cut_all=True) 全模式,返回一个列表,存在冗余单词
# jieba.lcut_for_search(s) 搜索引擎模式,将精确模式下返回的长字符再次进行分词
# jieba.add_word(w) 向分词的词典中加入新的词汇
'''
jieba.load_userdict("dict.txt") # 添加用户自定义字典,防止一些词汇的拆分
seg_list_exact = jieba.cut(string_data, cut_all = False) # 精确模式分词
object_list = []
# 自定义停用词,排除没有意义的高频词
remove_words = [u'的', u'和', u'是', u'尺码大小',u'尺码大小',u'舒适度',u'做工细节',u'透气性',u'抓地效果',u',',u'。',u'了',u'也',u'尺码',u':',u'!','42','425',u'穿',u"很"]
for word in seg_list_exact: # 循环读出每个分词
if word not in remove_words: # 如果不在去除词库中
object_list.append(word) # 分词追加到列表
# 词频统计
word_counts = collections.Counter(object_list) # 对分词做词频统计
word_counts_top10 = word_counts.most_common(20) # 获取前20最高频的词
print (word_counts_top10) # 输出检查
# 词频展示
mask = np.array(Image.open('adidas.jpg')) # 选择图片作为词频背景
wc = wordcloud.WordCloud(
font_path='C:/Windows/Fonts/simhei.ttf', # 设置字体格式
mask=mask, # 设置背景图
max_words=50, # 最多显示词数
max_font_size=100 # 字体最大值
)
wc.generate_from_frequencies(word_counts) # 从字典生成词云
image_colors = wordcloud.ImageColorGenerator(mask) # 从背景图建立颜色方案
wc.recolor(color_func=image_colors) # 将词云颜色设置为背景图方案
plt.imshow(wc) # 显示词云
plt.axis('off') # 关闭坐标轴
plt.show() # 显示图deeeeee
在生成词云的时候有些我们需要删除以及错误分词的词汇,因此我们通过输出生成的词云以及词频的统计,并根据结果加入自定义的词典和去除停用词
最终的到的结果图:
之后我们在使用snowNLP包对评论做情感分析,得到每个评论的情感分数与总平均分
#情感分析
def comment_Emotional_analysis(text):
sum = 0
count = 0
for txt in text:
print(txt[0])
s = SnowNLP(txt[0])
#.sentiments用来计算positive的概率,越接近于1表示越正面
print('{}'.format(s.sentiments))
# print(s.sentiments,mylog)
sum += s.sentiments
count += 1
score = sum / count
print('finalscore={}'.format(score))
得到的部分结果:
.........
款式很好,穿起来很舒服,做工也不错,透气性不错,买给朋友的,朋友说很值得,活动期间买的,不贵,而且换货也快,包裹性不错,快递来是个大箱子,包装很好,下次还来买,颜色挺喜欢的,总之非常满意的购物,客服也回的很快
0.9999822132874397
外观颜值:ub4.0这个配色是经典啦。黑白永远都不会过时,平时穿运动穿都合适。
舒适度:boost中底很舒适,这是共识了吧。鞋面编制也很舒服
做工细节:阿迪现在做工比耐克好多了,耐克各种溢胶不对称
尺码大小:42的大小合适
抓地效果:马牌橡胶大底值得信赖
透气性:鞋面透气,想要更透气的可以是cool版的
0.9999999993863875
finalscore=0.9837236562199404
相关源码获取通过公众号Romi杂货铺后台回复京东评论爬虫分析获取