1. 程式人生 > 實用技巧 >TF-IDF計算相似度為什麼要對稀疏向量建立索引?

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