算法集锦(2)|scikit-learn| 如何利用文本挖掘推荐Ted演讲
当我第一次看到"Ted Talk"数据集的时候,脑子里立刻冒出一些有意思的想法。首先,既然Ted Talk数据集包含了许多Ted演讲的演讲词文本,那么我们自然而然的就拥有了一个非常丰富且规范的预料库。第二,既然这个语料库有非常好的语言学属性,那么它可能是一个类似于Reuters 20 News Group这种非常优秀的数据集。所以,我们能不能利用这些演讲文本,利用它们之间的相关性,搭建一个像Ted官方网站一样的内容推荐系统呢?
当然,Ted官网用的推荐引擎,可定比本文采用的算法更加复杂,因为它会利用用户的历史交互信息。而本文则提出了一种仅利用演讲的台词内容,就可以进行内容推荐的方法,这一方法在你没有用户交互数据,但仍希望能推荐给用户一些相关联的内容时非常有用。
接下来,我们介绍具体的方法。
步骤1:审查数据
所有的Ted Talk数据存储在一个Excel表中,每个演讲的台词文本存储在一列名为transcript的单元格内,就像下面的样子。
import pandas as pd
transcripts=pd.read_csv("E:\Kaggle\ted-data\transcripts.csv")
transcripts.head()
检查完数据,我们发现可以从url一列中提取出演讲的名称。而我们的最终目标是利用transcript列的内容来获得演讲之间的相似度,然后推荐4个与给定演讲最相似的视频。
利用以下代码可以轻松的提取演讲名称(title)。
transcripts['title']=transcripts['url'].map(lambda x:x.split("/")[-1])
transcripts.head()
要想创建推荐系统,接下来需要完成以下几个步骤。
(1)创建一个代表演讲文本的向量空间模型
(2)建立向量空间模型的相似度矩阵
(3)基于相似度方法,为每一个演讲选择4个相似的演讲。
步骤2:利用Tf-Idf创建文本向量
因为我们是基于演讲内容进行推荐,所以首先要做的是建立一个便于比较的文本内容标识方法。一种可行的方法是创建文本的Tf-Idf向量。
语料集、文档和向量空间
为了表示文本,我们可以将每个演讲看做一个文档(Document),将所有的文档的词语构成一个语料集(Corpus)。然后用一个布尔型的向量描述每个文档,其中1表示这个词出现在文档中,0则表示该词没有出现。所以,每个文档都可以看做向量空间(语料集)中的一个向量。
但这个简单的方法存在的问题很明显。首先,该方法中每个词在文档中的重要程度相同,但直观来说,出现次数多的词更适合描述一篇文档。此外,当文档比较长时,其与指定文档的重叠的积累更大,从而导致推荐算法更倾向于推荐长文档。
为了解决简单布尔算法的缺陷,文档可以通过Tf-Idf转换成欧几里得空间中的向量。空间的维度构成对应文档中出现的关键词(Term),每个文档在向量空间中的位置由两个子量的乘积得到:词频(Term Frequency)和反文档频率(Inverse document frequency)。
Tf-Idf(Term Frequency -Inverse Document Frequency)方法
可以通过考虑以下三个问题来确定一个单词在文档中的重要性。
(1)该词是否在文档中经常出现?
(2)该词是否在语料集中很少出现 ?
(3)同时满足(1)和(2)?
如果一个单词在文档中出现次数很多,但在其他文档中很少出现,则该单词在文档中无疑是重要的。词频描述某个词在文档中出现的频繁程度;而反文档频率是组合了词频后的第二个指标,旨在降低所有文档中几乎都会出现的关键词的权重。二者的乘积即是Tf-Idf。
利用机器学习框架(比如scikit-learn)计算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)
#print(matrix.shape)
利用Tf-Idf方法,我们解决了演讲内容的向量表示问题,接下来我们研究如何找到与指定内容相似的演讲。
步骤3:找到相似的演讲
为了度量两个不同演讲的相似性,需要计算二者的相似度。通常,利用余弦相似度(Cosine Similarity)来处理Tf-Idf向量。我们可以建立一个余弦相似度矩阵来表示各个演讲之间的相似性。
### Get Similarity Scores using cosine similarity
from sklearn.metrics.pairwise import cosine_similarity
sim_unigram=cosine_similarity(matrix)
最后,我们基于余弦相似度矩阵来实现为选定内容推荐4个相似的演讲这一目标。也就是说,从上面的相似度矩阵中,在指定的行中,找出5个相似度最大的列来,代码如下。
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]
接下来,让我们验证下本文算法的可行性。从Ted演讲集中选择 一个演讲:
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("n")[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']
可以看到,利用Tf-Idf向量及余弦相似度,我们成功的建立了基于演讲内容的推荐算法。
- 使用Python+Tensorflow的CNN技术快速识别验证码
- 数字化医院科研信息化管理平台的设计
- 人工智能双刃剑:可协助安全专家,也可带来挑战
- “人工智能+教育”巨浪冲击下,传统的教育理念是否还能幸存?
- 完美世界战略投资多牛传媒,将联手打造泛娱乐媒体矩阵
- 数据恢复-SQL被注入攻击程序的应对策略
- MySQL数据库数据信息迁移
- NFS存储服务部署
- ssh服务、密钥登陆配置
- 本地yum仓库搭建及rpm软件包定制
- CentOS6.9-zabbix3.2启动失败原因及页面没有mysql选择项
- inotify软件部署及实时同步
- Linux下批量修改文件名方法
- Tomcat启动慢解决方法(本人CentOS7.4系统)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 浙大版《C语言程序设计(第3版)》题目集 习题10-2 递归求阶乘和
- hadoop源码解析之RPC分析
- 存储过程和触发器
- hadoop源码学习之namenode启动
- 浙大版《C语言程序设计(第3版)》题目集 习题10-3 递归实现指数函数
- hadoop2.7.3源码解析之datanode注册和心跳机制
- 审核/审计
- flink教程-聊聊 flink 1.11 中新的水印策略
- 浙大版《C语言程序设计(第3版)》题目集 习题10-4 递归求简单交错幂级数的部分和
- JSP分页显示(前端处理)
- 拓扑排序-HDU2647 Reward
- hadoop2.7.3源码解析之HA架构分析
- hadoop源码解析之hdfs内部结构分析
- 浙大版《C语言程序设计(第3版)》题目集 习题10-5 递归计算Ackermenn函数
- 浙大版《C语言程序设计(第3版)》题目集 习题10-6 递归求Fabonacci数列