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 ...
随机推荐
- 【LeetCode】400. Nth Digit 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- 【LeetCode】876. Middle of the Linked List 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 使用哑结点 不使用哑结点 日期 题目地址:https ...
- OA系统中手写签批功能的实现
一.需求背景 OA系统审批中,有对word或者pdf文件源文档在指定的位置可以插入相应的文字,其实就是一个审批的功能,到了指定的人那边,他可以进行签批.这个功能一般来说,是针对于领导方面,对于一个事情 ...
- Docker 与 K8S学习笔记(八)—— 自定义容器网络
我们在上一篇中介绍了Docker中三种网络,none.host和bridge,除了这三种网络,Docker还允许我们创建自定义网络,当我们要创建自定义网络时,Docker提供了三种网络驱动供我们选择: ...
- 【环境搭建】安装pyQt5 在pycharm报This application failed to start because no Qt platform plugin could be initialized的问题
报错:This application failed to start because no Qt platform plugin could be initialized 解决办法: http:// ...
- JSP中的九大内置对象
JSP九大内置对象 pageContext 存东西 Request 存东西 Response Session 存东西 Application(servletContext) 存东西 config(se ...
- C++string字符串截取其中元素 截取定位字符串
#include <iostream> #include <string> using namespace std; /** * 截取str后的元素 * @param stre ...
- CS5263替代PS176|设计DP1.4转HDMI2.0音视频转换线方案|PS176方案
PS176是一个显示端口 (DP)至HDMI 2.0视频接口转换器适用于需要视频协议转换的电缆适配器.电视接收器.监视器和其他应用.它将接受任何显示端口输入格式,包括DP 1.1a.dp1.2a.dp ...
- 应用TYPE-C外围电源管理IC IM2605
应用于TYPE-C外围集成同步4开关Buck-Boost变换器的电源管理IC IM2605 IM2605描述 IM2605集成了一个同步4开关Buck-Boost变换器,在输入电压小于或大于输出电 ...
- <数据结构>XDOJ324,325图的优先遍历
XDOJ324.图的广度优先遍历 问题与解答 问题描述 已知无向图的邻接矩阵,以该矩阵为基础,给出广度优先搜索遍历序列,并且给出该无向图的连通分量的个数.在遍历时,当有多个点可选时,优先选择编号小的顶 ...