返回介绍

3.基于LDA模型的主题分析

发布于 2024-01-28 21:41:24 字数 9223 浏览 0 评论 0 收藏 0

基于语义网络的评论分析进行初步数据感知后,从统计学习的角度,对主题的特征词出现频率进行量化表示。本文运用LDA主题模型,用以挖掘3种品牌评论中更多的信息。

主题模型在机器学习和自然语言处理等领域是用来在一系列文档中发现抽象主题的一种统计模型。从直观上来说,传统判断两个文档相似性的方法是通过查看两个文档共同出现的单词的多少,如TF、TF-IDF等,这种方法没有考虑到文字背后的语义关联,可能在两个文档共同出现的单词很少甚至没有,但两个文档是相似的,因此在判断文档相似性时,应进行语义挖掘,而语义挖掘的有效工具即为主题模型。

如果一篇文档有多个主题,则一些特定的可代表不同主题的词语会反复的出现,此时,运用主题模型,能够发现文本中使用词语的规律,并且把规律相似的文本联系到一起,以寻求非结构化的文本集中的有用信息。例如,对于热水器的商品评论,代表热水器特征的词语如“安装”“出水量”“服务”等会频繁地出现在评论中,运用主题模型,将与热水器代表性特征相关的情感描述性词语,同相应的特征词语联系起来,从而深入了解热水器评价的聚焦点及用户对于某一特征的情感倾向。LDA模型作为其中一种主题模型,属于无监督的生成式主题概率模型。

(1)LDA主题模型介绍

潜在狄利克雷分配(Latent Dirichlet Allocation,LDA)是由Blei等人在2003年提出的生成式主题模型[24]。生成模型,即认为每一篇文档的每一个词都是通过“一定的概率选择了某个主题,并从这个主题中以一定的概率选择了某个词语”。LDA模型也被称为3层贝叶斯概率模型,包含文档(d)、主题(z)和词(w)3层结构,能够有效地对文本进行建模,和传统的空间向量模型(VSM)相比,增加了概率的信息。通过LDA主题模型,能够挖掘数据集中的潜在主题,进而分析数据集的集中关注点及其相关特征词。

LDA模型采用词袋模型(Bag Of Words,BOW)将每一篇文档视为一个词频向量,从而将文本信息转化为易于建模的数字信息。

定义词表大小为L,一个L维向量(1,0,0,…,0,0)表示一个词。由N个词构成的评论记为d=(w1,w2,…,wN)。假设某一商品的评论集D由M篇评论构成,记为D=(d1,d2,…,dM)。M篇评论分布着K个主题,记为zi(i=1,2,…,K)。记α和β为狄利克雷函数的先验参数,θ为主题在文档中的多项分布的参数,其服从超参数为的Dirichlet先验分布,φ为词在主题中的多项分布的参数,其服从超参数的Dirichlet先验分布。LDA模型图示如图15-14所示。

图15-14 LDA模型结构示意图

LDA模型假定每篇评论由各个主题按一定比例随机混合而成,混合比例服从多项分布,记为:

而每个主题由词汇表中的各个词语按一定比例混合而成,混合比例也服从多项分布,记为:

在评论dj条件下生成词wi的概率表示为:

其中,P(wi|z=s)表示词wi属于第s个主题的概率,P(z=s|dj)表示第s个主题在评论dj中的概率。

(2)LDA主题模型估计

LDA模型对参数θ、φ的近似估计通常使用马尔科夫链蒙特卡洛(Markov Chain Monte Carlo,MCMC)[25]算法中的一个特例Gibbs抽样。利用Gibbs抽样对LDA模型进行参数估计,依据下式:

其中,zi=s|表示词wi属于第s|个主题的概率,Z-i表示其他所有词的概率,ns,-i表示不包含当前词wi的被分配到当前主题zs下的个数,ns,-j表示不包含当前文档dj的被分配到当前主题zs下的个数。

通过对上式的推导,可以推导得到词wi在主题zs中的分布的参数估计φs,i,主题zs在评论dj中的多项分布的参数估计θj,s,如下:

其中,ns,i表示词wi在主题zs中出现的次数,nj,s表示文档dj中包含主题zs的个数。

LDA主题模型在文本聚类、主题挖掘和相似度计算等方面都有广泛的应用,相对于其他主题模型,其引入了狄利克雷先验知识,因此,模型的泛化能力较强,不易出现过拟合现象。其次,它是一种无监督的模式,只需要提供训练文档,它就可以自动训练出各种概率,无需任何人工标注过程,节省大量人力及时间。再者,LDA主题模型可以解决多种指代问题。例如,在热水器的评论中,根据分词的一般规则,经过分词的语句会将“费用”一词单独分割出来,而“费用”是指安装费用,还是热水器费用等其他情况,如果简单地进行词频统计及情感分析,是无法识别的,从而无法准确了解用户反映的情况。运用LDA主题模型,可以求得词汇在主题中的概率分布,进而判断“费用”一词属于哪个主题,并求得属于这一主题的概率和同一主题下的其他特征词,从而解决多种指代问题。

(3)运用LDA模型进行主题分析的实现过程

本文在商品评论关注点的研究中,即对评论中的潜在主题进行挖掘,评论中的特征词是模型中的可观测变量。一般来说,每则评论中都存在一个中心思想,即主题。如果某个潜在主题同时是多则评论中的主题,则这一潜在主题很可能是整个评论语料集的热门关注点。在这个潜在主题上越高频的特征词越可能成为热门关注点中的评论词。

为提高主题分析在不同情感倾向下热门关注点反映情况的精确度,本文在语义网络的情感分类结果的基础上,对不同情感倾向下的潜在主题分别进行挖掘分析,从而得到不同情感倾向下用户对热水器不同方面的反映情况。例如,选取差评中的一则评论“售后服务差极了,不买他们的材料不给安装,还谎称免费安装,其实要收挺贵的安装费,十分不合理。这也算了,安装费之前说二百,安好之后要四百,更贵了,更加不合理,不管是安装师傅自己还是美的规定,都是很差很差的体验,我看其他人的了,一样的安装,比别人贵的安装费。而且安装师傅做事粗糙,态度粗鲁。”在这则评论中,“安装费”和“安装师傅”在这则评论中出现频率较高,可作为潜在主题。同时,可以得到潜在主题上特征词的概率分布情况,反映潜在主题“安装费”的特征词包括“贵”“不合理”,反映“安装师傅”的特征词包括“粗糙”“粗鲁”。

分别统计整个评论语料库中正负情感倾向的主题分布情况,对两种情感倾向下各个主题出现的次数从高到低进行排序,根据分析需要,选择排在前若干位的主题作为评论集中的热门关注点,然后根据潜在主题上的特征词的概率分布情况,得到所对应的热门关注点的评论词。

本文运用LDA主题模型的算法,并采用Gibbs抽样方法对LDA模型的参数进行近似估计,由上文的模型介绍可知,模型中存在3个可变量需要确定最佳取值,分别是狄利克雷函数的先验参数α、β和主题个数K。本文中将狄利克雷函数的先验参数α和β设置为经验值,分别是=50/K,=0.1。而主题个数K采用统计语言模型中常用的评价标准困惑度[26]来选取,即令K=50。

(4)LDA模型的实现

虽然LDA可以直接对文本做主题分析,但是文本的正面评价和负面评价混淆在一起,并且由于分词粒度的影响(否定词或程度词等),可能在一个主题下生成一些令人迷惑的词语。因此,将文本分为正面评价和负面评价两个文本,再分别进行LDA主题分析是一个比较好的主意。

为将文本一分为二,可以进行手工分类,但是极耗精力和时间。为此,可以进行机器标注。这里采用COSTCM6中的情感分析做机器分类,生成“正面情感结果”“负面情感结果”和“中性情感结果”,这里抛弃“中性情感结果”文本,分别对“正面情感结果”和“负面情感结果”文本进行LDA分析,挖掘出商品的优点与不足。

图15-15是meidi_jd_process_end.txt得到的负面评价文本,由于COSTCM6得到的结果还有评分前缀,还需要对前缀进行评分删除,并且分类文本是unicode编码,则统一另存为UTF-8编码再删除评分。删除前缀评分的代码如代码清单15-3所示。

图15-15 负面评价文本

代码清单15-3 删除前缀评分代码

#-*- coding: utf-8 -*-
import pandas as pd
#参数初始化
inputfile1 = '../data/meidi_jd_process_end_负面情感结果.txt'
inputfile2 = '../data/meidi_jd_process_end_正面情感结果.txt'
outputfile1 = '../data/meidi_jd_neg.txt'
outputfile2 = '../data/meidi_jd_pos.txt'
data1 = pd.read_csv(inputfile1, encoding = 'utf-8', header = None) #读入数据
data2 = pd.read_csv(inputfile2, encoding = 'utf-8', header = None)
data1 = pd.DataFrame(data1[0].str.replace('.*?\d+?\\t ', '')) #用正则表达式修改数据
data2 = pd.DataFrame(data2[0].str.replace('.*?\d+?\\t ', ''))
data1.to_csv(outputfile1, index = False, header = False, encoding = 'utf-8') #保存结果
data2.to_csv(outputfile2, index = False, header = False, encoding = 'utf-8')

代码详见:demo/code/clean_prefix.py

接下来,需要对两文本进行分词,保存成两个文本文档,并和停用词文档一起作为LDA程序的输入。分词代码如代码清单15-4所示。

代码清单15-4 分词代码

#-*- coding: utf-8 -*-
import pandas as pd
import jieba #导入结巴分词,需要自行下载安装
#参数初始化
inputfile1 = '../data/meidi_jd_neg.txt'
inputfile2 = '../data/meidi_jd_pos.txt'
outputfile1 = '../data/meidi_jd_neg_cut.txt'
outputfile2 = '../data/meidi_jd_pos_cut.txt'
data1 = pd.read_csv(inputfile1, encoding = 'utf-8', header = None) #读入数据
data2 = pd.read_csv(inputfile2, encoding = 'utf-8', header = None)
mycut = lambda s: ' '.join(jieba.cut(s)) #自定义简单分词函数
data1 = data1[0].apply(mycut) #通过“广播”形式分词,加快速度。
data2 = data2[0].apply(mycut)
data1.to_csv(outputfile1, index = False, header = False, encoding = 'utf-8') #保存结果
data2.to_csv(outputfile2, index = False, header = False, encoding = 'utf-8')

代码详见:demo/code/cut.py

在分好词的正面评价、负面评价文件以及过滤用的停用词表的基础上,使用Python的Gensim库完成LDA分析的代码如代码清单15-5所示。

代码清单15-5 LDA代码

#-*- coding: utf-8 -*-
import pandas as pd
#参数初始化
negfile = '../data/meidi_jd_neg_cut.txt'
posfile = '../data/meidi_jd_pos_cut.txt'
stoplist = '../data/stoplist.txt'
neg = pd.read_csv(negfile, encoding = 'utf-8', header = None) #读入数据
pos = pd.read_csv(posfile, encoding = 'utf-8', header = None)
stop = pd.read_csv(stoplist, encoding = 'utf-8', header = None, sep = 'tipdm')
#sep设置分割词,由于csv默认以半角逗号为分割词,而该词恰好在停用词表中,因此会导致读取出错
#所以解决办法是手动设置一个不存在的分割词,如tipdm。
stop = [' ', ''] + list(stop[0]) #Pandas自动过滤了空格符,这里手动添加
neg[1] = neg[0].apply(lambda s: s.split(' ')) #定义一个分割函数,然后用apply广播
neg[2] = neg[1].apply(lambda x: [i for i in x if i not in stop]) #逐词判断是否停用词,思路同上
pos[1] = pos[0].apply(lambda s: s.split(' '))
pos[2] = pos[1].apply(lambda x: [i for i in x if i not in stop])
from gensim import corpora, models
#负面主题分析
neg_dict = corpora.Dictionary(neg[2]) #建立词典
neg_corpus = [neg_dict.doc2bow(i) for i in neg[2]] #建立语料库
neg_lda = models.LdaModel(neg_corpus, num_topics = 3, id2word = neg_dict) #LDA模型训练
for i in range(3):
  neg_lda.print_topic(i) #输出每个主题
#正面主题分析
pos_dict = corpora.Dictionary(pos[2])
pos_corpus = [pos_dict.doc2bow(i) for i in pos[2]]
pos_lda = models.LdaModel(pos_corpus, num_topics = 3, id2word = pos_dict)
for i in range(3):
  neg_lda.print_topic(i) #输出每个主题

代码详见:demo/code/LDA.py

经过LDA主题分析后,评论文本被聚成3个主题,每个主题下生成10个最有可能出现的词语以及相应的概率,表15-2显示了美的正面评价文本中的潜在主题,表15-3展示了美的负面评价文本中的潜在主题。

表15-2 美的正面评价潜在主题

表15-3 美的负面评价潜在主题

根据对美的热水器好评的3个潜在主题的特征词提取,主题1中的高频特征词,即很好、送货快、加热、速度、很快、服务和非常等,主要反映京东送货快、服务非常好;美的热水器加热速度快;主题2中的高频特征词,即热门关注点主要是价格、东西和值得等,主要反映美的热水器不错,价格合适值得购买等;主题3中的高频特征词,即热门关注点主要是售后、师傅、上门和安装等,主要反映京东的售后服务以及师傅上门安装等。

从美的热水器差评的3个潜在主题中,我们可以看出,主题1中的高频特征词主要是安装、服务、元等,即主题1主要反映的是美的热水器安装收费高、热水器售后服务不好等;主题2中的高频特征词主要是不过、有点、还可以等情感词汇;主题3主要反映的是美的热水器可能不满足其需求等;主题3中的高频特征词主要是没有、但是、自己等,主题3可能主要反映美的热水器自己安装等。

综合以上对主题及其中的高频特征词可以看出,美的热水器的优势有以下几个方面:价格实惠、性价比高、外观好看、热水器实用、使用起来方便、加热速度快、服务好。

相对而言,用户对美的热水器的抱怨点主要体现以下几个方面:美的热水器安装的费用贵及售后服务等。

因此,用户的购买原因可以总结为以下几个方面:美的大品牌值得信赖,美的热水器价格实惠,性价比高。

根据对京东平台上美的热水器的用户评价情况进行LDA主题模型分析,我们对美的品牌提出以下建议。

1)在保持热水器使用方便、价格实惠等优点的基础上,对热水器进行改进,从整体上提升热水器的质量。

2)提升安装人员及客服人员的整体素质,提高服务质量。安装费用收取明文细则,并进行公开透明,减少安装过程的乱收费问题。适度降低安装费用和材料费用,以此在大品牌的竞争中凸显优势。

[1] 周涛,吴家舜,邵悦涵.基于情感分析、语义网络和主题模型的评论文本分析.第三届泰迪杯全国大学生数据挖掘竞赛(http://www.tipdm.org)优秀作品。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文