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 ...
随机推荐
- hud -5124-lines(线段树)
题目的意思是求重合层数最多的段(把点也看成段). 给的数据范围为N<1e5; ai<1e9; 有于N只有1e5;那么离散化一下可以将ai的范围映射到1e5,而不改变原端点的相对大小. 接下 ...
- Go语言练习 Rot13
Go语言练习 Rot13 地址:https://tour.go-zh.org/methods/23 package main import ( "io" "os" ...
- Insights直播回顾——手语服务,助力沟通无障碍
HMS Core Insights第九期直播–手语服务,助力沟通无障碍,已于12月29日圆满结束,本期直播与小伙伴们一同了解了HMS Core手语服务的亮点特性.底层技术以及演进规划,下面我们一起来回 ...
- Two pointer方法
I.何为Two pointer 用两个哨兵指向两个序列,通过利用序列本身的性质减少遍历次数,来更快得解决一些归并问题 基本问题 给定一个正整数递增序列和一个正整数M,求序列中两个不同位置的a,b使得a ...
- 新手入门typeScript
强类型与弱类型(类型安全) 强类型不允许随意的隐士类型转换,而弱类型是允许的 变量类型允许随时改变的特点,不是强弱类型的差异 静态类型与动态类型(类型检查) 静态类型:一个变量声明时它的类型就是明确的 ...
- git下载
git快速下载地址:https://github.com/waylau/git-for-win
- mysql中文乱码或者中文报错
当出现中文乱码或者执行包含中文的语句报错时,十有八九就是编码的问题,我们可以执行下面语句查看编码: SHOW VARIABLES LIKE '%char%' 显示 其中character_set_se ...
- Flask + UnitTest(十五)
被测试视图 # coding:utf-8 from flask import Flask, request, jsonify app = Flask(__name__) @app.route(&quo ...
- git 生成忽略文件
一.在.git的同级目录下打开git bash 二.在命令行输入 三.在生成的文件中添加忽略提交的文件夹名称 来自为知笔记(Wiz)
- java 代理模式 总结
1.前言 最近舍友去面试遇到了关于java代理模式的问题. 我虽然知道怎么使用,但是没有做过正经的总结,因此有了这篇随笔,好好总结一下三大代理模式底层原理. 事实上,在开发项目的时候,基本用不上代理, ...