python挖掘实战第12章,python挖掘数据教程

  

  大家好。   

  

  我们现在做数据分析的时候,不可避免的会和文本数据打交道。今天我们就和大家分享一下在数据分析中如何挖掘相似文本。   

  

  本文从提出问题,解决问题,然后是算法原理三个方面来介绍问题。   

  

  1.问个问题。假设在某电商APP中,我们想找出某商品评价中关于“发货不畅”的评论。我们做什么呢   

  

  如果只使用字符串匹配,可以遍历所有评论,确定每个评论是否包含“快递差”字符串。   

  

  但是,这种做法对下面的评论无效。   

  

  快递太可怕了。快递一点都不好。物流太可怕了。所以简单的字符串匹配会漏掉很多注释。   

  

  2.为了解决上述问题,我们需要使用潜在语义索引(LSI)算法。   

  

  LSI算法可以挖掘相似文本,所以可以通过LSI算法找到类似“快递不畅”的评论。   

  

  我们以之前的文章《挖掘张同学视频评论主题》为例练习LSI算法。   

  

  2.1建立LSI模型   

  

     

  

  张的视频评论   

  

  上一篇文章抓取了张抖音视频的1.2w评论,对应上面的文字栏目。   

  

  先分评论,去掉停用词。   

  

  origin_docs=df'text '。valuesdocuments=texts=用于文档中的文档   

  

  文本变量   

  

  然后用gensim建立一个复习词典,统计每个单词在每个复习中出现的次数(词频)。   

  

  来自Gensim导入Corporate,Models,Similarities #建立字典并对每个单词进行编号dictionary=Corporate . dictionary(texts)#每个单词在每个评论语料库中的出现频率=。   

  

  语料库变量   

  

  Dictionary将texts变量中的文本转换成数字。比如热食编号为0,米饭编号为1。   

  

  doc2Bow()中的bow是Bag-of-Words的缩写,代表词袋模型.这个模型用于统计评论中的词频。   

  

  语料库变量对应于文本变量。corpus0中的第一个元组(0,1)表示单词“Hot Good”在第一条评论中的出现次数为1,第二个元组(1,1)表示大米的出现次数为1。   

  

  然后,建立LSI模型。   

  

  Lsi=models.lsimodel (corpus,id2word=dictionary,power _ iterators=100,num _ topics=10) Num _ topics是评论的主题数。上一篇文章我们挖出了8个题目,比较好。这里,我们设置的题目数量是10个。不如以后再去挖掘类似的文字。   

  

  最后,构建每个评论向量的索引,方便以后的查询。   

  

  # lsi是向量索引=相似度。矩阵相似度(LSI) 2.2对应所有评论查询相似文本。   

  

  在张的视频评论中,很多人对“喂狗”的镜头印象深刻。   

  

  我们来查一下类似“我以为我是给自己吃的,结果却喂了我的狗”的评论。   

  

  Query='我以为自己吃了,却喂狗了' #词袋模型,统计词频vec _ bow=dictionary . doc 2 bow(jieba . lcut(Query))#计算向量vec_lsi=lsi#计算每条评论与query sims=index之间的相似度经过lsi处理后,每条评论都可以用向量.类似地表示,query也可以用向量.表示   

  

  因此,index实际上是计算向量,和余弦相似度.之间的相似性,这里使用的方法是结果越接近1,查询就越类似于此评论。   

  

  按照下面的相似度倒排,输出类似查询的评论。   

  

  # Output(原始文档,相似度)binary result=《origin_docs,i1》 for I in Enumeration(SIMS)#按相似度逆序排序(result,key=lambda x 3360-x1)。   

  

  相似文本   

  

  可以看到,效果不错,可以挖掘出很多类似的文字。   

  

  3.LSI算法的原理LSI类似于我们之前讲的LDA,可以用来计算每篇文章的主题。   

  

  LSI是基于奇异值分解(SVD)方法得到文本的主题。奇异值分解的近似公式为:   

  

  其中M代表所有评论的字数,N代表评论数,K代表分解后的话题数。   

  

  矩阵对应N条评论,每条评论下有M个字。   

  

  矩阵对应k个话题,每个话题下m个词的概率分布。   

  

  转置矩阵是一个n*k的矩阵,对应n个文档,每个文档下k个主题的概率分布。   

  

  所以,in中的每一行其实都是每条评论的向量,这个矩阵对应的就是上面的代码,就是lsi。   

  

  我们上面提到过,余弦相似度用于计算向量相似性。高中数学中,两个向量的余弦相似度,其实就是两个向量之间的夹角。   

  

  当角度为0时,两个向量重合(相等),当相似度为1,角度为90时,两个向量垂直(不相关),当相似度为0,角度为180时,两个向量相反,相似度为-1。这里介绍基于潜在语义的相似文本挖掘。研究完这篇文章,你可以发现LSI不仅可以挖掘相似文本,还可以做文本推荐、搜索引擎之类的事情。   

  

  当然,它也有不足之处,有兴趣的朋友可以继续深入研究。   

相关文章