赞
踩
使用的教材:《电商产品评论数据情感分析》
作业&学习笔记:数据挖掘第14周
说明:书本内容详实。此篇用于自己期末回顾知识的重点内容,故做出的学习笔记缺省了书本原本的其他精粹。
随着电子商务的发展,对企业而言,了解消费者的消费需求迫在眉睫。利用数据挖掘中的NLP技术,可以帮助商家分析消费者的评论文本数据,得到改善产品的建议。
1)对京东商城中美的热水器的评论进行情感分析;
2) 从评论文本中挖掘用户的需求、意见、购买原因、产品优缺点;
3) 给出改善产品的建议。
1) 对评论文本数据进行数据清洗、分词、停用词等过滤操作;
2) 对预处理后的数据进行情感分析,将评论文本数据按照情感倾向分为正面评论数据(好评)和负面评论数据(差评)。
3) 分别对正、负面评论数据进行LDA主题分析,从对应的结果分析文本评论数据中有价值的内容。
(1)电商平台中存在系统自动评价的现象,这类属于重复评价,需要去除;
(2)不同购买者之间的有价值的评论很少会出现完全重复,有些顾客可能会复制粘贴别人的评论,属于重复评论。
使用语料库:完全重复的语料库解决评论去重问题。
import pandas as pd
import re
import jieba.posseg as psg
import numpy as np
# 去重,去除完全重复的数据
reviews = pd.read_csv(r"tmp\reviews.csv")
reviews = reviews[['content', 'content_type']].drop_duplicates()
content = reviews['content']
人工观察,评论中掺杂许多数字字母——去除!由于评论文本数据围绕京东商城的美的热水器,“京东”,“京东商城”,“美的”,“热水器”,“电热水器”等词的频数很大——去除!
# 去除去除英文、数字等
# 由于评论主要为京东美的电热水器的评论,因此去除这些词语
strinfo = re.compile('[0-9a-zA-Z]|京东|美的|电热水器|热水器|')
content = content.apply(lambda x: strinfo.sub('', x))
分词:文本信息处理的基本环节,将一个单词序列划分成单个单词的过程。准确地分词可以极大地提高计算机对文本信息的识别和理解能力。不准确的分词会产生大量的噪声,严重干扰计算机的识别理解能力。
汉语中的基本单位是字。中文的逻辑顺序构成是:
字——>词——>句子——>段——>节——>章——>篇
中文分词的任务:把中文的序列切分成有意义的词。
eg:
我帮小明打饭。
分词成:
我 帮 小明 打饭
中文存在的问题有:
(1)未登录词的识别问题(词典中没有登陆的人名、地名、机构名等)、专业术语(贝叶斯、万维网),新词语(不明觉厉、第五层)
(2)切分歧义问题:
eg:
当结合成分子时。
当 结合 成分 子时
当 结合 成 分子 时
当 结 合成 分子 时
词典分配 | 统计特征 |
---|---|
分词中最传统常见的一种。匹配方式有正向、逆向。对于匹配中遇到的多种分段可能性(segmentation ambiguity),通常会选取数目最少的词分割出来。 | 通过语料数据中的一些统计特征,(如互信息量)去估计相邻汉字之间的关联性,实现词的切分。 |
优点:简单易懂、不依赖训练数据、易于纠错; | 优点:不依赖词表,在挖掘生词方面具有较强的灵活性。 |
缺点:一旦词表中出现不存在的新词,算法无法做大正确切分。 | 精度方面可能有时候不够精确 |
jieba分词——分词中最常用的工作包,Python的分词开源库,专门用于中文分词。
停用词(stop words):电脑检索中的虚字、非检索用字。停词分为两类:(1)使用十分广泛的词语,“我”,“就”;(2)文本中出现频率很高的但实际意义不大的词,如语气助词、介词、副词、连词。如:的,在,和,然后等。
# 分词 worker = lambda s: [(x.word, x.flag) for x in psg.cut(s)] # 自定义简单分词函数 seg_word = content.apply(worker) # 将词语转为数据框形式,一列是词,一列是词语所在的句子ID,最后一列是词语在该句子的位置 n_word = seg_word.apply(lambda x: len(x)) # 每一评论中词的个数 n_content = [[x+1]*y for x,y in zip(list(seg_word.index), list(n_word))] index_content = sum(n_content, []) # 将嵌套的列表展开,作为词所在评论的id seg_word = sum(seg_word, []) word = [x[0] for x in seg_word] # 词 nature = [x[1] for x in seg_word] # 词性 content_type = [[x]*y for x,y in zip(list(reviews['content_type']), list(n_word))] content_type = sum(content_type, []) # 评论类型 result = pd.DataFrame({ "index_content":index_content, "word":word, "nature":nature, "content_type":content_type}) # 删除标点符号 result = result[result['nature'] != 'x'] # x表示标点符号 # 删除停用词 stop_path = open("data\stoplist.txt", 'r',encoding='UTF-8') stop = stop_path.readlines() stop = [x.replace('\n', '') for x in stop] word = list(set(word) - set(stop)) result = result[result['word'].isin(word)] # 构造各词在对应评论的位置列 n_word = list(result.groupby(by = ['index_content'])['index_content'].count()) index_word = [list(np.arange(0, y)) for y in n_word] index_word = sum(index_word, []
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。