如何基于Tf-Idf词向量和余弦相似性根据字幕文件找出相似的TED演讲

编者按:数据科学顾问gunnvant saini讲解了如何基于tf-idf词向量和余弦相似性根据字幕文件找出相似的ted演讲。
好吧,我喜欢ted演讲,谁不喜欢呢?当我查看kaggle上的ted数据集(rounakbanik/ted-talks)时,有不少发现。首先,由于数据集包含许多ted演讲的字幕,因此我们有了一个非常丰富、语言学上结构良好的语料。其次,由于该语料具备良好的语言学属性,它很可能和reuters 20 news group或者古登堡语料库差不好。这让我灵机一动:
我有许多ted演讲的字幕数据,我能尝试找到一种根据演讲相似性推荐ted演讲(就像ted官网做的那样)的方法吗?
当然,ted官网所用的推荐系统,会比我这里演示的复杂得多,同时涉及一些用户交互的历史数据。
本文想要演示如何仅仅基于内容生成推荐。当你不具备任何用户交互数据时,比如在刚开始的时候,这一技术变得极为重要,它有助于向消费者提供内容相关的上下文推荐。
数据
字幕储存于transcript一列,每行对应一个演讲。
import pandas as pd
transcripts=pd.read_csv(e:\kaggle\ted-data\transcripts.csv)
transcripts.head()
可以看到,从url很容易就能提取演讲的标题。我的目标是使用字幕文本创建相似性的测度,然后为给定演讲推荐4个最相似的演讲。
transcripts['title']=transcripts['url'].map(lambda x:x.split(/)[-1])
transcripts.head()
好了,数据预处理完毕,我可以开始创建推荐系统了:
为字幕创建向量表示
为上一步创建的向量表示创建一个相似性矩阵
基于某种相似性测度,为每个演讲选定4个最相似的演讲
使用tf-idf创建词向量
由于我们的最终目标是基于内容相似性推荐演讲,我们首先要做的就是为字幕创建便于比较的表示。其中一种方法是为每个字幕创建一个tfidf向量。但是,到底什么是tfidf呢?让我们先讨论下这个概念。
语料库、文档和频次矩阵
为了表示文本,我们将把每个字幕看成一个“文档”,然后将所有文档的集合看成一个“语料库”。然后,二维码将创建一个向量,表示每个文档中词汇出现的次数,像这样:
这些向量组成了一个矩阵,称为频次矩阵(count matrix)。不过,这样的表示方式有一个问题。比如,“one”在文档1中只出现过一次,但在其他文档中均未出现,所以“one”是一个重要的词汇。但是如果我们查看文档1的频次向量,“one”的权重和“this”、“is”等词一样,都是1. 而tf-idf可以解决这一问题。
词频-逆向文档频率(tf-idf)
为了理解tf-idf如何帮助识别词汇的重要性,让我们询问自己几个问题,如何决定一个词汇是否重要?
如果这个词汇在文档中多次出现?
如果这个词汇很少在语料库中出现?
同时满足1和2?
如果一个词汇在某个文档中频繁出现,但在语料库中的其他文档中很少出现,那么该词汇对这个文档很重要。词频(term frequency)衡量词汇在给定文档中出现的频繁程度,而逆向文档频率(inverse document frequency)衡量词汇在语料库中出现的罕见程度。两者之积tf-idf衡量词汇的重要程度。使用sklearn机器学习框架,创建tf-idf向量表示非常直截了当:
from sklearn.feature_extraction import text
text=transcripts['transcript'].tolist()
tfidf=text.tfidfvectorizer(input=text,stop_words=english)
matrix=tfidf.fit_transform(text)
现在我们已经解决了如何在词向量中体现词汇重要性的问题,我们将开始考虑下一个问题,如何个找到给定文档的相似文档(在我们的例子中是ted演讲字幕)?
查找相似文档
通常,我们使用余弦相似度,衡量tf-idf向量的接近程度。也就是说,我将基于tf-idf向量创建一个余弦矩阵,表示文档两两之间的相似程度:
同样,使用sklearn做这个非常直接:
from sklearn.metrics.pairwise import cosine_similarity
sim_unigram=cosine_similarity(matrix)
创建了相似度矩阵后,我只需查询这一矩阵,在每一行找出4个余弦相似度最高的列,就可以为每个文档(字幕)选出最相似的4个文档了。
def get_similar_articles(x):
return,.join(transcripts['title'].loc[x.argsort()[-5:-1]])
transcripts['similar_articles_unigram']=[get_similar_articles(x) for x in sim_unigram]
让我们看下效果,比如,随便挑一个演讲,看看哪4个演讲和它最相似:
transcripts['title'].str.replace(_, ).str.upper().str.strip()[1]
'al gore on averting climate crisis'
transcripts['similar_articles_unigram'].str.replace(_, ).str.upper().str.strip().str.split()[1]
['rory bremner s one man world summit',
',alice bows larkin we re too late to prevent climate change here s how we adapt',
',ted halstead a climate solution where all sides can win',
',al gore s new thinking on the climate crisis']
显然,从标题上看,这些演讲的主题是相似的。

运放opa2604最佳供电电压
EMC如何成为下一个设计工程的成功因素
Graphcore 创业公司推出了一种专门用于 AI 计算的处理器芯片IPU
睿创微纳科创板IPO过会 多家创投机构突击入股存隐患
Microchip MOST150 INIC 实现智能天线模块与汽车控制、音视频及IP网络同轴连接
如何基于Tf-Idf词向量和余弦相似性根据字幕文件找出相似的TED演讲
并联电容器组配套装置及应用技术
面对智能制造竞赛 企业如何挑选APM平台
人工智能边缘计算的机遇与挑战
小米6什么时候上市?小米6最新消息:小米6发布时间已定,首批备货10万,又“耍猴”?
从TI新产品用例看智能汽车照明趋势
骨传导耳机怎么样,骨传导耳机的优点
多谐振荡器构成及稳态特性分析
【梦就雅欣】FP6296升压QC和PD协议充电器
TI收购NS是明智之举
即刻体验 | Android 14 开发者预览版 2
浅谈操作系统发展现状
一周新品推荐:AVX 多层陶瓷贴片电感器LCCI系列和Banner Engineering DXMR90控制器
水质毒性快速检测仪的原理及特点说明
SDS抗造的常见方法介绍