目录

  • 一、2020数学建模美赛C题简介
    • 需求
    • 评价内容
    • 提供数据
  • 二、解题思路
  • 三、LDA简介
  • 四、代码实现
    • 1. 数据预处理
      • 1.1剔除无用信息
        • 1.1.1 剔除掉不需要的列
        • 1.1.2 找出无效评论并剔除
      • 1.2 抽取评论
      • 1.3 词形还原
      • 1.4 去除停用词
      • 1.5 筛选词性
      • 1.3~1.5代码
    • 2. 使用LDA模型进行主题分析
  • 完整代码
  • 附录

一、2020数学建模美赛C题简介

从提供的亚马逊电商平台的商品评价数据中识别关键模式、关系、度量和参数。

需求

  1. 以此告知阳光公司在线销售策略
  2. 识别潜在的重要设计功能,以增强产品的满意度
  3. 阳光公司对数据基于时间的模式特别感兴趣

评价内容

  1. 个人评级,星级评价,1~5分
  2. 评论,文本信息
  3. 帮助评分, 其他用户对“评论”的作用的评价

提供数据

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, modelsTOPIC_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.compile("(?<=[a-zA-Z])\'ve")  # have的缩写

然后看下最后调用的函数代码,了解一下顺序:

# lda训练,得到主题词
def lda_step1():remove_cols()  # 剔除多余列 file[0]->file[1]get_dup_revs()  # 获取重复评论 file[1]->file[2]def lda_step2():  # 需要查看step1中获取的重复评论的信息invd_list = [1, 2]  # 无效评论的行号remvove_invds(*invd_list)  # 剔除无效评论 file[1]->file[1],使用了file[2]get_pos_neg_revs()  # 获取消极、积极评论 file[1]->file[4,5]def lda_step3():  # lda训练write_selected_words()  # 预处理文本(归一化,筛选词性,去停词表等) file[4]->file[6],file[5]->file[7]get_topic_words()  # file[6]->file[8]->file[10],file[7]->file[9]-file[11]# lda_step1()
# lda_step2()
lda_step3()

1. 数据预处理

1.1剔除无用信息

1.1.1 剔除掉不需要的列
# 剔除冗余的列
def remove_cols():data = pd.read_csv(m_files[0], sep='\t', encoding='utf-8')data = data.drop(['marketplace', 'product_category', 'product_parent', 'product_title'], axis=1)  # 剔除了多列data.to_csv(m_files[1], sep='\t', encoding='utf-8')
1.1.2 找出无效评论并剔除
  1. 首先找到重复的评论
# 获取重复的评论
def get_dup_revs():m_df = pd.read_csv(m_files[1], index_col=0, sep='\t', encoding='utf-8')data_review = m_df['review_body']  # 获取评论这一列# 计算数组有哪些不同的值,并计算每个值有多少个重复值,原值变成了行索引dup_df = pd.DataFrame(data_review.value_counts())m_review = dup_df.index.values.tolist()  # 获取评论值列表m_num = dup_df['review_body'].values.tolist()  # 获取原来评论的重复值#  新建一个dfm_review_num = pd.DataFrame([m_review, m_num])m_review_num = pd.DataFrame(m_review_num.values.T)  # 转置m_review_num.columns = ['review_body', 'num']#  筛选出重复的评论m_review_num = m_review_num[m_review_num['num'] > 1]m_review_num.to_csv(m_files[2], sep='\t', index=False, header=True, encoding='utf-8')# print(m_review_num)

结果:

2. 重复率过高的可能是系统自动评论
第一条可能为恶意评论:

I received a Danby Microwave for Christmas 2011. Less than 4 months later it stop working I called the Danby 800# and was told what to do. I did this and have not heard anything back. I have attempted numerous times with no success on getting my refund. Loss to my family of $85.00

I will never buy another Danby product or recommend one.

第二条为系统标记无效评论
其他评论较为正常
3. 剔除掉被认定为无参考意义的评论

#  去除无效评论
def remvove_invds(*invd_list):  # 参数为无效评论在“重复评论”中的行号#print("remvove_invds", invd_list)m_df = pd.read_csv(m_files[1], sep='\t', encoding='utf-8')m_invds = pd.read_csv(m_files[2], sep='\t', encoding='utf-8')#print("m_invds",m_invds)m_invds = m_invds[m_invds.index.isin(invd_list)]m_invd_revs = m_invds['review_body'].values.tolist()# print("m_invd_revs:" + m_invd_revs)#  筛选出不在无效评论中的m_df = m_df[~m_df.review_body.isin(m_invd_revs)]m_df.to_csv(m_files[3], sep='\t', index=False, header=True, encoding='utf-8')

1.2 抽取评论

抽取1,2星和4,5星的评论分别作为消极评论、积极评论的语料

#  抽取1、2,4、5星的评论
def get_pos_neg_revs():m_df = pd.read_csv(m_files[3], sep='\t', encoding='utf-8')m_neg_df = m_df[m_df.star_rating.isin([1, 2])]m_pos_df = m_df[m_df.star_rating.isin([4, 5])]m_neg_revs = m_neg_df['review_body']m_pos_revs = m_pos_df['review_body']m_neg_revs.to_csv(m_files[5], sep='\t', index=False, header=True, encoding='utf-8')m_pos_revs.to_csv(m_files[4], sep='\t', index=False, header=True, encoding='utf-8')

1.3 词形还原

英语中同一个动词有多种形态,奖其还原成原形

1.4 去除停用词

去除无参考意义的词,如:

{'to', 'there', 'nor', 'wouldn', 'shouldn', 'i', 'then', 'you', 'ain', "hasn't", 'she', 'not', 'such', 'those', 'so', 'over', 'the', 'y', 'd', 'most', 'm', 'should', 'both', 'weren', 'from', 'until', 'an', 'my', 'yours', 'in', 'here', 'them', 'have', 'didn', 'against', 'myself', 'of', 'her', 'had', "couldn't", "didn't", 'when', "should've", 'is', 'very', "don't", 'has', 'these', 'will', 're', 'now', "hadn't", 'were', 'again', 'same', 'itself', 'his', 'what', 'him', 'don', "you'll", 'how', 'couldn', 'other', 'doesn', 'out', 'no', 'while', 'your', 'do', 'this', 'if', "shouldn't", 'just', 'aren', 'shan', 'himself', 'on', 'further', 'themselves', 've', 'hers', 't', 'me', 's', 'that', 'and', 'which', 'or', 'our', "won't", 'above', 'off', 'we', "wasn't", "needn't", 'ours', 'who', 'all', 'wasn', 'through', 'be', 'ourselves', 'by', 'during', 'about', "mightn't", 'was', 'yourselves', 'before', 'because', 'ma', 'being', 'more', 'it', 'any', 'll', "weren't", 'between', 'why', 'he', 'herself', 'whom', "wouldn't", 'o', "that'll", "you'd", 'few', 'won', 'once', 'some', 'doing', "aren't", "you've", 'with', 'under', "mustn't", 'too', 'needn', 'isn', 'yourself', "haven't", 'up', 'below', 'am', 'after', "it's", 'as', 'hadn', 'into', 'own', "you're", 'its', 'theirs', 'their', "isn't", "shan't", 'only', 'mightn', 'hasn', 'mustn', 'does', 'a', 'each', 'having', 'haven', 'they', "she's", 'at', 'can', 'but', 'been', 'did', "doesn't", 'down', 'than', 'are', 'for', 'where'}

1.5 筛选词性

去除掉情感分析中无参考意义的词性, 保留有参考意义的词性。
有参考意义的词性:

m_tags = ['MD', 'UH', 'VB', 'VBD', 'VBG', 'VBN', 'VBP', 'VBZ', 'RP', 'RB', 'RBR', 'RBS', 'JJ', 'JJR', 'JJS']

1.3~1.5代码

# 从文本抽取单词
def extract_words(text, debug=False):text = replace_abbreviations(text)if debug:print('去除非字母符号:', text)m_words = nltk.word_tokenize(text)  # 分词if debug:print('分词:', m_words)m_word_tags = nltk.pos_tag(m_words)  # 获取单词词性if debug:print('获取词性:', m_word_tags)m_words = [word for word, tag in m_word_tags if tag in m_tags]  # 过滤词性if debug:print('过滤词性后:', m_words)m_words = words_normalize(m_words)  # 归一化if debug:print('归一化后:', m_words)m_words = [word for word in m_words if word not in stop_words]  # 过滤停词表m_words = [word for word in m_words if word not in m_stop_words]  # 过滤自定义停词表if debug:print('过滤停词表后:', m_words)return m_words

2. 使用LDA模型进行主题分析

抽取1,2星和4,5星的评论分别作为消极评论、积极评论的语料
分别对两份语料进行LDA训练得到主题词。

get_topics.py:

# 获取文章主题, 使用预处理后的评论文本(已经进行了归一化,筛选词性,去停词表等操作)
def get_topics2(input_file):fr = open(input_file, 'r', encoding='utf-8')words_list = []  # 二维单词列表for line in fr.readlines():m_words = nltk.word_tokenize(line)# m_words = [word for word in m_words if word not in m_stop_words]words_list.append(m_words)# """构建词频矩阵,训练LDA模型"""dictionary = corpora.Dictionary(words_list)# corpus[0]: [(0, 1), (1, 1), (2, 1), (3, 1), (4, 1),...]# corpus是把每条新闻ID化后的结果,每个元素是新闻中的每个词语,在字典中的ID和频率corpus = [dictionary.doc2bow(words) for words in words_list]  # text单篇文章lda = models.LdaModel(corpus=corpus, id2word=dictionary, num_topics=TOPIC_NUM)  # lda训练topic_list = lda.print_topics(TOPIC_NUM)print(len(topic_list), "个主题的单词分布为:\n")for topic in topic_list:print(topic)return topic_list

分析结果:

1 个主题的单词分布为:(积极)
(0, '0.022*"great" + 0.019*"well" + 0.015*"small" + 0.014*"good" + 0.013*"easy" + 0.011*"fit" + 0.010*"love" + 0.010*"need" + 0.009*"little" + 0.008*"much"')1 个主题的单词分布为:(消极)
(0, '0.014*"replace" + 0.009*"last" + 0.008*"stop" + 0.008*"start" + 0.008*"back" + 0.008*"well" + 0.007*"never" + 0.007*"call" + 0.007*"turn" + 0.007*"open"')['well', 'small', 'fit', 'good', 'great', 'easy', 'need', 'much', 'little', 'love']['replace', 'well', 'turn', 'last', 'never', 'call', 'back', 'stop', 'open', 'start']

完整代码

gitee项目地址:https://gitee.com/Meloor/LDATest
文件目录:LDA/get_topics.py

附录

参考博客:https://www.jianshu.com/p/4a0bd8498561

自然语言处理(NLP)——LDA模型:对电商购物评论进行情感分析相关推荐

  1. 【项目实战】Python实现基于LDA主题模型进行电商产品评论数据情感分析

    说明:这是一个机器学习.数据挖掘实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取. 视频: Python实现基于LDA模型进行电商产品评论数据情感分析 ...

  2. 数据挖掘作业学习学习笔记-电商产品评论数据情感分析

    使用的教材:<电商产品评论数据情感分析> 作业&学习笔记:数据挖掘第14周 说明:书本内容详实.此篇用于自己期末回顾知识的重点内容,故做出的学习笔记缺省了书本原本的其他精粹. 随着 ...

  3. 数据挖掘实战—电商产品评论数据情感分析

    文章目录 引言 一.评论预处理 1.评论去重 2.数据清洗 二.评论分词 1.分词.词性标注.去除停用词 2.提取含名词的评论 3.绘制词云查看分词效果 三.构建模型 1.评论数据情感倾向分析 1.1 ...

  4. 基于电商产品评论数据情感分析

    #!/usr/bin/env python # coding: utf-8# # -- 基于电商产品评论数据情感分析 --# ### 1.案例简介 # # 1.利用文本挖掘技术,对碎片化.非结构化的电 ...

  5. 数据分析与挖掘实战-电商产品评论数据情感分析

    电商产品评论数据情感分析 背景 随着网上购物越来越流行,人们对于网上购物的需求越来越高,这让京东.淘宝等电商平台得到了很大的发展机遇.但是,这种需求也推动了更多的电商平台的崛起,引发了激烈的竞争.在这 ...

  6. 毕业设计之 - 大数据分析:电商产品评论数据情感分析

    文章目录 1 简介 数据分析目的 数据预处理 评论去重 数据清洗 分词.词性标注.去除停用词 提取含名词的评论 绘制词云¶ 词典匹配 评论数据情感倾向分析 修正情感倾向 LinearSVC模型预测情感 ...

  7. 《Python数据分析与挖掘实战》第15章 ——电商产品评论数据情感分析(LED)

    文章目录 1.挖掘背景与目标 2.2 数据探索与预处理 2.1 数据筛选 2.2 数据去重 2.3 删除前缀评分 2.4 jieba分词 3 基于LDA 模型的主题分析 4.权重 5.如何在主题空间比 ...

  8. 数据分析与挖掘:电商产品评论数据情感分析

    电商产品评论数据情感分析 1. 背景与挖掘目标 2. 分析方法与过程 2.1 数据抽取 2.2 评论预处理 2.3 LDA 主题分析 1. 背景与挖掘目标 项目为<Python 数据分析与挖掘实 ...

  9. Python文本挖掘练习(五)// 电商产品评论数据情感分析

    第一部分 案例简介 本案例首先利用Python文本挖掘技术,对碎片化.非结构化的电商网站评论数据进行清洗与处理,转化为结构化数据.然后对文本数据进一步挖掘与分析,采用决策树算法构建情感分类模型,探索用 ...

最新文章

  1. 'utf-8' codec can't decode byte 0xd5 in position 0: invalid continuation byte
  2. 《JavaScript设计模式与开发实践》读书笔记之观察者模式
  3. Notice of the completion of the blog migration
  4. 博人眼球的 电子苍蝇
  5. vue设置html自动跳转路由器,vue2.0项目实现路由跳转的方法详解
  6. 王栋: 要做好推荐,只有技术是不够的
  7. C#一个完整的电子邮件操作类
  8. java我行我素购物系统_用java怎么编写 我行我素shopping购物管理体统
  9. 直播app系统源码,自定义弹框的简单写法Demo
  10. 哪个邮箱好用又安全?群发邮件哪个邮箱好用?
  11. Tilera 服务器上hadoop单机版测试
  12. 计算机科学与技术学科带头人,计算机专业学科带头人—陆玉昌教授
  13. JAMA Psychiatry:大脑发育过程中与注意和情绪变化相关的内在结构性的改变
  14. python为什么运行不了_python为什么安装了运行不了?
  15. 普及计算机知识的意义,计算机在当今社会的重要性
  16. C语言入门——自我介绍
  17. 周师计算机专业学校分数线,周口师范学院是几本?录取分数线是多少
  18. 2022版本微信开发者工具引入less插件
  19. 电脑文件管理,教你批量给全部文件夹名称随机命名
  20. POI生成word文档,再通过spire.doc.free 实现word转pdf

热门文章

  1. 【7月cocos学习笔记】
  2. 经济型EtherCAT运动控制器(六):数据储存
  3. jcharArray转化为char [ ]
  4. java 163邮箱发邮件_Java实现163邮箱发送邮件到QQ邮箱
  5. matalb读取txt文件以及将数据写入txt文件
  6. 苹果手机的高德地图的位置服务器,苹果手机高德地图家人地图在哪
  7. 计算机课程教学调查问卷,《初中生信息技术课程学习现状调查问卷》分析报告...
  8. 生日快乐网页模板(HTML5+CSS3+JS)
  9. 发送消息(SendMessage)常识普及
  10. 《浮生六记》年表整理