TF-IDF计算相似度为什么要对稀疏向量建立索引?
TF-IDF的向量表示的稀疏问题
之前在看tf-idf代码时候思考了一个问题,不知道对于初学的大部分同学有没有这样一个疑惑,用tf-idf值构成的向量,维度可能跟词表的大小有关,那么对于一句话来说,这样的向量表示是不是太稀疏了?
例如,对于下面的数据(文档),词表大小为32个词,那么我们每一句话(eg:['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'])将用32维的向量表示,但是这句话中只涉及7个词,其余25个位置全为0,这样岂不是很稀疏?对于此表更大的情况,计算相似度的时候会不会很慢甚至出错?
dataset = [['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'],
['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'],
['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'him'],
['stop', 'posting', 'stupid', 'worthless', 'garbage'],
['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'],
['quit', 'buying', 'worthless', 'dog', 'food', 'stupid']]
果然会有这样的问题,但是我也看到了解决方法,那就是为稀疏向量建立索引。
今天看到了代码,这个代码使用的是gensim这个库写的,
# 获取语料库每个文档中每个词的tfidf值,即用tfidf模型训练语料库
tfidf = models.TfidfModel(corpus)
# 对稀疏向量建立索引
index = similarities.SparseMatrixSimilarity(tfidf[corpus], num_features=len(dictionary.keys()))
sim = index[tfidf[doc_text_vec]] # 相当于sim = index.get_similarities(tfidf[doc_text_vec])
稀疏向量
其实这种处理方式并不是在tf-idf中特有的,而是对于处理这一类向量的一种方法,这种向量我们称为稀疏向量(sparse vector),与稀疏向量相对应的当然就是密集向量(dense vector)。对于这两种向量的表示,我们可以从下面这个例子看出来:
比如向量(1,0,3,4)的创建有三种方法:
密集向量:直接Vectors.dense(1,0,3,4)
稀疏向量:
方法一:Vector.sparse(4,(0,2,3),(1,3,4)) (0,2,3)
表示该向量的第0个,第2个,第3个位置,(1,3,4) 表示(0,2,3)位置对应的数值分别为1,3,4
方法二:Vector.sparse(4,(0,1),(2,3),(3,4))
(0,1)就是(索引,数值)的形式。位置0的数值为1, 位置2的数值为3,位置3的数值为4
对于之前提到的gensim的代码,我debug后得到测试句子的tf-idf向量表示
(0, 0) 0.3536708
(0, 1) 0.37080795
(0, 2) 0.37080795
(0, 3) 0.12360264
(0, 4) 0.1768354
(0, 5) 0.1768354
(0, 6) 0.1768354
(0, 7) 0.1768354
(0, 8) 0.1768354
(0, 9) 0.1768354
(0, 10) 0.1768354
(0, 11) 0.1768354
(0, 12) 0.1768354
(0, 13) 0.039230715
(0, 14) 0.1768354
(0, 15) 0.070369884
(0, 16) 0.1768354
(0, 17) 0.1768354
(0, 18) 0.1768354
(0, 19) 0.12360264
(0, 20) 0.1768354
(0, 21) 0.1768354
(0, 22) 0.1768354
(0, 23) 0.1768354
(0, 24) 0.1768354
: :
: :
(9, 53) 0.1024829
(9, 55) 0.03036039
(9, 58) 0.04348179
(9, 82) 0.077995226
(9, 92) 0.1024829
(9, 95) 0.1024829
(9, 110) 0.3074487
(9, 122) 0.13699634
(9, 135) 0.1024829
(9, 155) 0.2739927
(9, 168) 0.1024829
(9, 224) 0.13699634
(9, 269) 0.13699634
(9, 311) 0.19599745
(9, 312) 0.19599745
(9, 313) 0.19599745
(9, 314) 0.19599745
(9, 315) 0.19599745
(9, 316) 0.3919949
(9, 317) 0.19599745
(9, 318) 0.19599745
(9, 319) 0.19599745
(9, 320) 0.19599745
(9, 321) 0.19599745
(9, 322) 0.19599745
具体什么意思呢,也就是说这个测试样句一共有10个词,第一个词也就是位置为0的那个词,它的值为词表的第一个词时候,它的tf-idf值为0.3536708,所以表示为(0, 0) 0.3536708,那这个位置如果为此表中第二个词的时候,tf-idf值为多少呢?没错就是0.37080795,表示为:(0, 1) 0.37080795,其它的就同理啦
TF-IDF计算相似度为什么要对稀疏向量建立索引?的更多相关文章
- TF/IDF计算方法
FROM:http://blog.csdn.net/pennyliang/article/details/1231028 我们已经谈过了如何自动下载网页.如何建立索引.如何衡量网页的质量(Page R ...
- 信息检索中的TF/IDF概念与算法的解释
https://blog.csdn.net/class_brick/article/details/79135909 概念 TF-IDF(term frequency–inverse document ...
- 转:Lucene之计算相似度模型VSM(Vector Space Model) : tf-idf与交叉熵关系,cos余弦相似度
原文:http://blog.csdn.net/zhangbinfly/article/details/7734118 最近想学习下Lucene ,以前运行的Demo就感觉很神奇,什么原理呢,尤其是查 ...
- Elasticsearch由浅入深(十)搜索引擎:相关度评分 TF&IDF算法、doc value正排索引、解密query、fetch phrase原理、Bouncing Results问题、基于scoll技术滚动搜索大量数据
相关度评分 TF&IDF算法 Elasticsearch的相关度评分(relevance score)算法采用的是term frequency/inverse document frequen ...
- TF/IDF(term frequency/inverse document frequency)
TF/IDF(term frequency/inverse document frequency) 的概念被公认为信息检索中最重要的发明. 一. TF/IDF描述单个term与特定document的相 ...
- tf–idf算法解释及其python代码实现(下)
tf–idf算法python代码实现 这是我写的一个tf-idf的简单实现的代码,我们知道tfidf=tf*idf,所以可以分别计算tf和idf值在相乘,首先我们创建一个简单的语料库,作为例子,只有四 ...
- tf–idf算法解释及其python代码实现(上)
tf–idf算法解释 tf–idf, 是term frequency–inverse document frequency的缩写,它通常用来衡量一个词对在一个语料库中对它所在的文档有多重要,常用在信息 ...
- 文本分类学习(三) 特征权重(TF/IDF)和特征提取
上一篇中,主要说的就是词袋模型.回顾一下,在进行文本分类之前,我们需要把待分类文本先用词袋模型进行文本表示.首先是将训练集中的所有单词经过去停用词之后组合成一个词袋,或者叫做字典,实际上一个维度很大的 ...
- Elasticsearch学习之相关度评分TF&IDF
relevance score算法,简单来说,就是计算出,一个索引中的文本,与搜索文本,他们之间的关联匹配程度 Elasticsearch使用的是 term frequency/inverse doc ...
随机推荐
- 【九度OJ】题目1137:浮点数加法 解题报告
[九度OJ]题目1137:浮点数加法 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1137 题目描述: 求2个浮点数相加的 ...
- 教学日志:javaSE-循环语句
一.while循环和do...while循环 /* while循环:先判断条件,再执行逻辑代码 四部分组成: 1.初始化:循环的初始化变量 2.条件判断:条件返回必须是true或false 3.循环体 ...
- static,final,volatile
static 静态修饰关键字,可以修饰 变量,程序块,类的方法:[被 static 修饰的方法和属性只属于类不属于类的任何对象.] 当你定义一个static的变量的时候jvm会将将其分配在内存堆上, ...
- MongoDB基本介绍与安装(1)
MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功 ...
- 编写Java程序,使用循环结构打印出九九乘法表
编写Java程序,使用循环结构打印出九九乘法表 效果如下: 实现代码: public class Multiplication99 { public static void main(String[] ...
- elasticsearch之警惕inner hits的性能问题
一.inner hits简介 elasticsearch提供了nested数据类型来处理主子文档的问题,可以解决子文档字段被分裂平铺导致字段之间失去了整体的关联性: elasticsearch提供的i ...
- Python_jsonPath模块的使用
jsonpath简介 如果有一个多层嵌套的复杂字典,想要根据key批量提取value,还是比较繁琐的.jsonPath模块就能解决这个痛点,接下来我们来学习一下jsonpath模块. 因为jsonpa ...
- [ vue ] quasar框架踩坑:在vue文件外导入路由,执行router.push('/')没有效果
问题描述: 1. 如图所示的项目结构目录, axios.js 文件负责拦截全局请求和回复,我在拦截回复的代码中写了:如果服务器回复了一个401错误,则执行Router.push('/'),但是该方法失 ...
- maven pom.xml 的 spring-boot-maven-plugin 红色报错 解决
解决方法,添加对应的spring boot 版本号即可
- 曾经大量使用的Model1开发模式,虽不常用,但可以帮我们理解JSP
注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6513394762370777604/ 1.<JSP页面实际上就是Servlet> 2.<JSP页 ...