目录
一、2020数学建模美赛C题简介
从提供的亚马逊电商平台的商品评价数据中识别关键模式、关系、度量和参数。
需求
- 以此告知阳光公司在线销售策略
- 识别潜在的重要设计功能,以增强产品的满意度
- 阳光公司对数据基于时间的模式特别感兴趣
评价内容
- 个人评级,星级评价,1~5分
- 评论,文本信息
- 帮助评分, 其他用户对“评论”的作用的评价
提供数据
tsv格式的数据, 如下图
二、解题思路
使用LDA模型量化评论,再结合其他数据进行下一步数据挖掘。这里主要讨论LDA。
三、LDA简介
LDA(Latent Dirichlet Allocation)是一种文档主题生成模型,也称为一个三层贝叶斯概率模型,包含词、主题和文档三层结构。所谓生成模型,就是说,我们认为:
- 一篇文章以一定概率选择了某个主题
- 这个主题以一定概率选择了某个词语得到。
- 文档到主题服从多项式分布,主题到词服从多项式分布。
- 每一篇文档代表了一些主题所构成的一个概率分布,而每一个主题又代表了很多单词所构成的一个概率分布。
应用
- LDA是一种非监督机器学习技术,可以用来识别大规模文档集(document collection)或语料库(corpus)中潜藏的主题信息。
使用了词袋(bag of words)方法
- 将每一篇文档视为一个词频向量,从而将文本信息转化为了易于建模的数字信息。
- 但是词袋方法没有考虑词与词之间的顺序,这简化了问题的复杂性,同时也为模型的改进提供了契机。
四、代码实现
代码头部全局变量,方便理解后续的代码:
import re
import nltk
import pandas as pd
from nltk.corpus import stopwords
from nltk.stem.wordnet import WordNetLemmatizer
from gensim import corpora, models
TOPIC_NUM = 1 # 主题数
lmtzr = WordNetLemmatizer()
m_files = [r"..\data\microwave.tsv",
r"..\data\microwave_lda_1rmv_cols.tsv",
r"..\data\microwave_lda_2dup_revs.tsv",
r"..\data\microwave_lda_3rmv_invds.tsv",
r"..\data\microwave_lda_4pos_revs.txt",
r"..\data\microwave_lda_5neg_revs.txt",
r"..\data\microwave_lda_6pos_rev_words.txt", # 文本进行了处理
r"..\data\microwave_lda_7neg_rev_words.txt",
r"..\data\microwave_lda_8pos_topic.tsv",
r"..\data\microwave_lda_9neg_topic.tsv",
r"..\data\microwave_lda_10pos_topic_words.txt",
r"..\data\microwave_lda_11neg_topic_words.txt",
r"..\data\microwave_lda_12rev_words.tsv",
r"..\data\microwave_lda_13rev_score.tsv"]
# 停用词集合
stop_words = set(stopwords.words('english'))
stop_words = [word for word in stop_words if word not in ['not']]
# print(stop_words)
# 自定义停用词
m_stop_words = ['would', 'br', 'microwave', 'use', 'get', 'old', 'new', 'look', 'work', 'could', 'oven',
'purchase', 'take', 'make', 'buy', 'go', 'come', 'say', 'not', 'bought', 'even', 'ge',
'also', 'ca', 'dry']
# 情感分析中重要的词性
m_tags = ['MD', 'UH', 'VB', 'VBD', 'VBG', 'VBN', 'VBP', 'VBZ', 'RP', 'RB', 'RBR', 'RBS', 'JJ', 'JJR', 'JJS']
# 正则表达式过滤特殊符号用空格符占位,双引号、单引号、句点、逗号
pat_letter = re.compile(r'[^a-zA-Z \']+')
# 还原常见缩写单词
pat_is = re.compile("(it|he|she|that|this|there|here)(\'s)", re.I)
pat_s = re.compile("(?<=[a-zA-Z])\'s") # 找出字母后面的字母
pat_s2 = re.compile("(?<=s)\'s?")
pat_not = re.compile("(?<=[a-zA-Z])n\'t") # not的缩写
pat_would = re.compile("(?<=[a-zA-Z])\'d") # would的缩写
pat_will = re.compile("(?<=[a-zA-Z])\'ll") # will的缩写
pat_am = re.compile("(?<=[I|i])\'m") # am的缩写
pat_are = re.compile("(?<=[a-zA-Z])\'re") # are的缩写
pat_ve = re.<