锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

数据挖掘案例实战:利用LDA主题模型提取京东评论数据(二)

时间:2022-11-19 17:30:00 psg3m磁感应传感器

泰迪智能技术(数据挖掘平台:TipDM数据挖掘平台)最新推出的数据挖掘实战专栏

专栏将数据挖掘理论与项目案例实践相结合,可以获得真实的数据挖掘学习和实践环境,更快更好地学习数据挖掘知识,积累专业经验

专栏中的每四篇文章都是一个完整的数据挖掘案例。案例介绍的顺序是:首先通过数据案例背景提出挖掘目标,然后阐述分析方法和过程,最后完成模型构建,同时穿插操作培训,将相关知识点嵌入相应的操作过程中。

为了方便读者轻松获得真实的实验环境,本专栏使用了众所周知的实验环境Python语言处理样本数据进行挖掘和建模。
————————————————
评论分词

1. 分词、词性标注、去除停用词。

(1)对评论数据进行分词

分词是文本信息处理的基础环节,是将一个单词序列切分成一个一个单词的过程。准确的分词可以极大的提高计算机对文本信息的是被和理解能力。相反,不准确的分词将会产生大量的噪声,严重干扰计算机的识别理解能力,并对这些信息的后续处理工作产生较大的影响。

汉语的基本单位是单词,可以由单词组成单词,可以由单词组成句子,然后由一些句子组成段落、部分、章节和部分。可以看出,如果需要处理中文语料,正确识别单词是一项非常基本和重要的工作。

然而,汉语以单词为基本书写单位,单词之间没有明显的区别。中文分词的任务是将中文序列划分为有意义的单词,即添加合适的字符串,使形成的字符串反映句子的初衷。中午分词的例子如表1所示。

表1 中文分词的例子

使用基于词典的中文分词法处理中文信息时,必须考虑未登录词的处理。未登录词是指词典中未登录的人名、地名、组织名、译名和新词。当使用匹配的方法来划分单词时,由于这些单词没有登录词典中,自动划分单词会很困难。常见的未登录词有命名实体,如张三、北京、联想集团、酒井法等;专业术语,如贝叶斯算法、模式、万维网;新词,如卡拉OK美刀啃老族等。

此外,中文分词也存在分歧问题。例如,当组合成分子时这句话可以分为以下方法:当/组合/组合/组合/组合/组合/组合/组合/组合/组合/组合/组合/组合/组合/组合/组合/组合/组合/组合/组合/组合/组合/组合/组合/组合。

可以说,中文分词的关键问题是:消除分歧和识别未登录词。

词典匹配是分词最传统、最常见的方法。匹配方法可以是正(从左到右)或逆(从右到左)。对于匹配中遇到的各种分段可能性(segmentation ambiguity),通常选择分隔出来的词数最少的。

显然,这种方法非常依赖于词表。一旦词表中没有新单词,算法就无法正确划分。然而,词表匹配也有其优点,如易于理解、不依赖训练数据、易于纠正错误等。

另一种方法是通过语料数据中的一些统计特征(如相互信息量)来估计相邻汉字之间的相关性,然后实现单词的划分。这种方法不依赖于表格,特别是在探索原始单词时,但往往存在精度问题。

分词最常用的工作包是jieba分词包,jieba分词是python专门用于中文分词的分词开源库有三个基本原理,即实现所采用的技术。

① 基于trie树结构实现了有效的词图扫描,生成了句子中所有可能成词的汉字(DAG)。jieba分词有一个叫做dict.txt词典里有2万多个词,包括词条出现的次数(这个次数是作者基于人民日报语料等资源训练的)和词性。trie树是著名的前缀树。如果一个词的前几个字是一样的,说明这个词有相同的前缀,可以用trie树来存储,trie树木存储方法具有搜索速度快的优点。后一句生成句中汉字所有可能成词的有向无环图,意思是给定一个待切分的句子,生成如图1所示的有向无环图。

图1 向无环图的有意见分歧

②利用动态规划找到基于词频的最大切分组合的最大概率路径。首先找到分词句子中切割的单词,然后找到单词的频率,然后根据动态规划找到最大概率路径的方法,从右到左计算句子的最大概率(反向是因为中文句子的重心经常落在右边,从右到左,正确率高于从左到右,类似于逆向最大匹配),最终得到最大概率的分割组合。

③使用未登录词HMM使用模型Viterbi算法,按照中文词汇BEMS标记四种状态。其中B是begin,表示开始位置;E是end,表示结束位置;M是middle,表示中间位置;S是singgle,表示单独成词的位置。HMM模型采用(B,E,M,S)这四种状态可以标记中文单词。例如,北京可以标记为BE,即北/B京/E,北是开始,北京是结束,中华民族可以标记为BMME,是开始、中间、中间和结束。

(2)去除停用词

停用词(Stop Words),词典被翻译成计算机检索中的虚词和非检索词。SEO在搜索引擎中,为了节省存储空间,提高搜索效率,搜索引擎在索引页面或处理搜索请求时会自动忽略某些单词或单词,称为停用词。

在某种程度上,停用词相当于过滤词(Filter Words),不同之处在于,过滤词的范围更大,包括情感、政治和其他敏感信息的关键词将被视为过滤词,而停止词本身没有这种限制。一般来说,停止词大致可以分为以下两类。

一种是使用广泛甚至过于频繁的单词。例如,英语i”“is”“what,中文我、只是等,出现在每个文档中。查询此类单词不能保证搜索引擎能够给出真正相关的搜索结果,因此不能缩小搜索范围,提高搜索结果的准确性,降低搜索效率。因此,在搜索时,Google百度等搜索引擎会忽略特定的常用词。如果使用过多的停用词,可能得不到准确的结果,甚至可能得到大量无关的搜索结果。

另一种是文本中经常出现但实际意义不大的词。这类词主要包括语气助词、副词、介词、连词等,通常意义不明确。只有把它们放在一个完整的句子里,它们才能起到一定的作用。常见的有是、在、和、然后等。例如,泰迪教育研究所是最好的大数据知识传播机构之一这句话中的是和是是两个停用词。

分词后,评论从一个字符串的形式改为多个由单词或单词组成的字符串的形式,可以判断评论中的单词是否为停止单词。根据上述停止单词的定义,根据停止单词库删除评论中的停止单词,如代码列表1所示。

代码清单1 分词、词性标记、删除停用词代码

# 分词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, [])  # 改变评论的位置表示单词 # 合并评论id,评论中词的id,词性、词性、评论类型result['index_word'] = index_word

2.&nsp;提取含名词的评论

由于本案例的目标是对产品特征的优缺点进行分析,类似“不错,很好的产品”,“很不错,继续支持”等评论虽然表达了对产品的情感倾向,但是实际上无法根据这些评论提取出哪些产品特征是用户满意的。评论中只有出现明确的名词,如机构团体及其它专有名词时,评论才有意义,因此需要对分词后的词语进行词性标注。之后再根据词性将含有名词类的评论提取出来。

jieba关于词典词性标记,采用ICTCLAS的标记方法。ICTCLAS汉语词性标注集如表2所示。

表2  ICTCLAS 汉语词性标注集

根据得出的词性,提取评论中词性含有“n”的评论,如代码清单2所示。

代码清单2  提取含有名词的评论

# 提取含有名词类的评论ind = result[['n' in x for x in result['nature']]]['index_content'].unique()result = result[[x in ind for x in result['index_content']]]3. 绘制词云查看分词效果

进行数据预处理后,可绘制词云查看分词效果,词云会将文本中出现频率较高的“关键词”予以视觉上的突出。首先需要对词语进行词频统计,将词频按照降序排序,选择前100个词,使用wordcloud模块中的WordCloud绘制词云,查看分词效果,如代码清单3所示。

代码清单3  绘制词云

import matplotlib.pyplot as pltfrom wordcloud import WordCloud
frequencies = result.groupby(by = ['word'])['word'].count()frequencies = frequencies.sort_values(ascending = False)backgroud_Image=plt.imread('../data/pl.jpg')wordcloud = WordCloud(font_path="STZHONGS.ttf",                      max_words=100,                      background_color='white',                      mask=backgroud_Image)my_wordcloud = wordcloud.fit_words(frequencies)plt.imshow(my_wordcloud)plt.axis('off') plt.show()
# 将结果写出result.to_csv("../tmp/word.csv", index = False, encoding = 'utf-8')

*代码请联系客服领取,联系方式见文末

运行代码清单3可得到分词后的词云图,如图2所示。

图2  分词后的词云图

根据图2可以看出,对评论数据进行预处理后,分词效果较为符合预期。其中“安装”“师傅”“售后”“物流”,“服务”等词出现频率较高,因此可以初步判断用户对产品这几个方面比较重视。

下一篇将推送:利用LDA主题模型提取京东评论数据(三)

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章