百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

数据分析中,用Python轻松挖掘相似评论(文本)

bigegpt 2024-09-10 11:17 11 浏览

大家好。

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

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

1. 提出问题

假设在一个电商APP里,我们想要找出某款商品评价里,关于“ 快递很差 ” 的评论,该怎么做?

如果只用字符串匹配的方式,你可能会遍历所有的评论,判断每条评论里是否包含“ 快递很差 ”字符串。

但这种做法对下面几条评论就失效了

  • 快递真差劲
  • 快递一点不好
  • 物流真差

所以,单纯的字符串匹配会漏掉很多评论。

2. 解决问题

要解决上面的问题,需要借助 潜在语义索引(Latent Semantic Indexing, 以下简称LSI) 算法。

LSI 算法可以挖掘相似文本,因此,通过 LSI 算法可以找到与“ 快递很差 ”相似的评论。

下面我们以之前一篇文章《 挖掘张同学视频评论主题 》为例,实践 LSI 算法。

2.1 构建 LSI 模型

张同学视频评论

上篇文章抓取了张同学抖音视频 1.2w 条评论,对应上图 text 列。

首先,对评论分词,并去掉停用词。

origin_docs = df['text'].values
documents = [jieba.lcut(doc) for doc in origin_docs]
texts = [[word for word in doc if word not in filter_wrods] for doc in documents]

texts变量

然后,用 gensim 构建评论词典,并统计每条评论中每个词出现的次数( 词频 )。

from gensim import corpora, models, similarities

# 构建词典,给每个词编号
dictionary = corpora.Dictionary(texts)
# 每条评论里每个词的出现频次
corpus = [dictionary.doc2bow(text) for text in texts]

corpus变量

dictionarytexts 变量中的文本变成了数字编号。如: 热好 的编号为 0, 的编号为 1。

doc2bow() 中的 bow 是 Bag-of-Words 的缩写,代表 词袋模型 ,该模型用来统计评论中的词频。

corpus 变量与 texts 变量相对应。 corpus[0] 中的第一个元组 (0, 1) 代表第一条评论中 热好 一词的出现的次数是1,第二个元组 (1, 1) 代表 出现的次数是1。

接着,构建 LSI 模型

lsi = models.LsiModel(
         corpus, 
         id2word=dictionary,
         power_iters=100,
         num_topics=10
)

num_topics 是评论的主题数,上篇文章我们挖掘出来8个主题比较好, 这里我们设置的主题数是10个,稍微大一些对后面挖掘相似文本更好。

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

# lsi[corpus] 是所有评论对应的向量
index = similarities.MatrixSimilarity(lsi[corpus])  

2.2 查询相似文本

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

下面我们来查询与“ 以为自己吃,结果喂狗 ”相似的评论。

query = '以为自己吃,结果喂狗'
# 词袋模型,统计词频
vec_bow = dictionary.doc2bow(jieba.lcut(query))
# 计算 query 对应的向量
vec_lsi = lsi[vec_bow]

# 计算每条评论与query的相似度
sims = index[vec_lsi] 

经过 LSI 处理后,每条评论都可以用 向量 表示,同样的, query 也可以用 向量 表示。

所以, index[vec_lsi] 其实是计算 向量 之间的相似度,这里用的方法是 余弦相似度 。结果越靠近1说明 query 与该评论越相似。

下面按照相似度倒排,输出与 query 相似的评论。

# 输出(原始文档,相似度)二元组
result = [(origin_docs[i[0]],i[1]) for i in enumerate(sims)]

# 按照相似度逆序排序
sorted(result ,key=lambda x: -x[1])

相似文本

可以看到,效果还是不错的,能够挖掘出很多相似的文本。

3. LSI 算法原理

LSI 与我们之前讲的 LDA 类似,都能用来计算每篇文本的主题。

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

其中,m代表所有评论中词的数量,n代表评论的条数,k代表分解后得到的主题数。

矩阵对应n篇评论,每篇评论下有m个词。

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

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

因此,中每行其实就是每条评论的 向量 ,该矩阵对应到上述代码中,是 lsi[corpus]

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

  • 夹角0度时,两向量重合(相等),相似度为1
  • 夹角90度时,两向量垂直(不相关),相似度为0
  • 夹角180度时,两向量反向,相似度为-1

到这里,基于 LSI 的相似文本挖掘就介绍完了。经过本篇的学习,你可以发现 LSI 不仅可以挖掘相似文本,甚至还可以做文本推荐、搜索引擎之类的事。

当然它也有缺点,有兴趣的朋友可以继续深入研究。

相关推荐

Go语言泛型-泛型约束与实践(go1.7泛型)

来源:械说在Go语言中,Go泛型-泛型约束与实践部分主要探讨如何定义和使用泛型约束(Constraints),以及如何在实际开发中利用泛型进行更灵活的编程。以下是详细内容:一、什么是泛型约束?**泛型...

golang总结(golang实战教程)

基础部分Go语言有哪些优势?1简单易学:语法简洁,减少了代码的冗余。高效并发:内置强大的goroutine和channel,使并发编程更加高效且易于管理。内存管理:拥有自动垃圾回收机制,减少内...

Go 官宣:新版 Protobuf API(go pro版本)

原文作者:JoeTsai,DamienNeil和HerbieOng原文链接:https://blog.golang.org/a-new-go-api-for-protocol-buffer...

Golang开发的一些注意事项(一)(golang入门项目)

1.channel关闭后读的问题当channel关闭之后再去读取它,虽然不会引发panic,但会直接得到零值,而且ok的值为false。packagemainimport"...

golang 托盘菜单应用及打开系统默认浏览器

之前看到一个应用,用go语言编写,说是某某程序的windows图形化客户端,体验一下发现只是一个托盘,然后托盘菜单的控制面板功能直接打开本地浏览器访问程序启动的webserver网页完成gui相关功...

golang标准库每日一库之 io/ioutil

一、核心函数概览函数作用描述替代方案(Go1.16+)ioutil.ReadFile(filename)一次性读取整个文件内容(返回[]byte)os.ReadFileioutil.WriteFi...

文件类型更改器——GoLang 中的 CLI 工具

我是如何为一项琐碎的工作任务创建一个简单的工具的,你也可以上周我开始玩GoLang,它是一种由Google制作的类C编译语言,非常轻量和快速,事实上它经常在Techempower的基准测...

Go (Golang) 中的 Channels 简介(golang channel长度和容量)

这篇文章重点介绍Channels(通道)在Go中的工作方式,以及如何在代码中使用它们。在Go中,Channels是一种编程结构,它允许我们在代码的不同部分之间移动数据,通常来自不同的goro...

Golang引入泛型:Go将Interface「」替换为“Any”

现在Go将拥有泛型:Go将Interface{}替换为“Any”,这是一个类型别名:typeany=interface{}这会引入了泛型作好准备,实际上,带有泛型的Go1.18Beta...

一文带你看懂Golang最新特性(golang2.0特性)

作者:腾讯PCG代码委员会经过十余年的迭代,Go语言逐渐成为云计算时代主流的编程语言。下到云计算基础设施,上到微服务,越来越多的流行产品使用Go语言编写。可见其影响力已经非常强大。一、Go语言发展历史...

Go 每日一库之 java 转 go 遇到 Apollo?让 agollo 来平滑迁移

以下文章来源于GoOfficialBlog,作者GoOfficialBlogIntroductionagollo是Apollo的Golang客户端Apollo(阿波罗)是携程框架部门研...

Golang使用grpc详解(golang gcc)

gRPC是Google开源的一种高性能、跨语言的远程过程调用(RPC)框架,它使用ProtocolBuffers作为序列化工具,支持多种编程语言,如C++,Java,Python,Go等。gR...

Etcd服务注册与发现封装实现--golang

服务注册register.gopackageregisterimport("fmt""time"etcd3"github.com/cor...

Golang:将日志以Json格式输出到Kafka

在上一篇文章中我实现了一个支持Debug、Info、Error等多个级别的日志库,并将日志写到了磁盘文件中,代码比较简单,适合练手。有兴趣的可以通过这个链接前往:https://github.com/...

如何从 PHP 过渡到 Golang?(php转golang)

我是PHP开发者,转Go两个月了吧,记录一下使用Golang怎么一步步开发新项目。本着有坑填坑,有错改错的宗旨,从零开始,开始学习。因为我司没有专门的Golang大牛,所以我也只能一步步自己去...