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计算相似度为什么要对稀疏向量建立索引?的更多相关文章

  1. TF/IDF计算方法

    FROM:http://blog.csdn.net/pennyliang/article/details/1231028 我们已经谈过了如何自动下载网页.如何建立索引.如何衡量网页的质量(Page R ...

  2. 信息检索中的TF/IDF概念与算法的解释

    https://blog.csdn.net/class_brick/article/details/79135909 概念 TF-IDF(term frequency–inverse document ...

  3. 转:Lucene之计算相似度模型VSM(Vector Space Model) : tf-idf与交叉熵关系,cos余弦相似度

    原文:http://blog.csdn.net/zhangbinfly/article/details/7734118 最近想学习下Lucene ,以前运行的Demo就感觉很神奇,什么原理呢,尤其是查 ...

  4. Elasticsearch由浅入深(十)搜索引擎:相关度评分 TF&IDF算法、doc value正排索引、解密query、fetch phrase原理、Bouncing Results问题、基于scoll技术滚动搜索大量数据

    相关度评分 TF&IDF算法 Elasticsearch的相关度评分(relevance score)算法采用的是term frequency/inverse document frequen ...

  5. TF/IDF(term frequency/inverse document frequency)

    TF/IDF(term frequency/inverse document frequency) 的概念被公认为信息检索中最重要的发明. 一. TF/IDF描述单个term与特定document的相 ...

  6. tf–idf算法解释及其python代码实现(下)

    tf–idf算法python代码实现 这是我写的一个tf-idf的简单实现的代码,我们知道tfidf=tf*idf,所以可以分别计算tf和idf值在相乘,首先我们创建一个简单的语料库,作为例子,只有四 ...

  7. tf–idf算法解释及其python代码实现(上)

    tf–idf算法解释 tf–idf, 是term frequency–inverse document frequency的缩写,它通常用来衡量一个词对在一个语料库中对它所在的文档有多重要,常用在信息 ...

  8. 文本分类学习(三) 特征权重(TF/IDF)和特征提取

    上一篇中,主要说的就是词袋模型.回顾一下,在进行文本分类之前,我们需要把待分类文本先用词袋模型进行文本表示.首先是将训练集中的所有单词经过去停用词之后组合成一个词袋,或者叫做字典,实际上一个维度很大的 ...

  9. Elasticsearch学习之相关度评分TF&IDF

    relevance score算法,简单来说,就是计算出,一个索引中的文本,与搜索文本,他们之间的关联匹配程度 Elasticsearch使用的是 term frequency/inverse doc ...

随机推荐

  1. 【九度OJ】题目1052:找x 解题报告

    [九度OJ]题目1052:找x 解题报告 标签(空格分隔): 九度OJ [LeetCode] http://ac.jobdu.com/problem.php?pid=1052 题目描述: 输入一个数n ...

  2. 【LeetCode】382. Linked List Random Node 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 数组保存再随机选择 蓄水池抽样 日期 题目地址:ht ...

  3. Optimal Symmetric Paths(UVA12295)

    Description   You have a grid of n rows and n columns. Each of the unit squares contains a non-zero ...

  4. 1127 - Funny Knapsack

    1127 - Funny Knapsack    PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB ...

  5. centos 与虚拟机

    一 创建虚拟机 1. 下载 centos7 和 vmware .centos的下载地址:见上一篇. 2.安装vmware ,具体安装过程,自行百度(一路点击确定) 3.打开vmware ,点击创建新的 ...

  6. Sublime Text3快速创建HTML5框架

    输入html:5 按tab键即可

  7. Exploring Architectural Ingredients of Adversarially Robust Deep Neural Networks

    目录 概 主要内容 深度 宽度 代码 Huang H., Wang Y., Erfani S., Gu Q., Bailey J. and Ma X. Exploring architectural ...

  8. [Git]解决Permission denied, please try again问题

    在gitlab上传项目的时候出现Permission denied, please try again问题, 网上有很多解释,但是都没能解决我的问题,后来经过自己尝试成功了,这里把经验分享给大家. 在 ...

  9. Ranger-Solr审计日志安装

    使用RangerAdmin安装solr,基于已有的solr环境安装,主要是在solr创建用于存储数据的CoreAdmin. # 1.解压安装 在solr的安装机器上面,获取RangerAdmin并且解 ...

  10. mt19937

    额,这个是一个小记.没什么,就是记给自己看的,你可以走了. mt19937 需要 C++11.生成高质量随机数. mt19937 rnd(chrono::system_clock::now().tim ...