1. 問題描述
給你若干篇文檔,找出這些文檔中最相似的兩篇文檔?
相似性,可以用距離來衡量。而在數學上,可使用余弦來計算兩個向量的距離。
\[cos(\vec a, \vec b)=\frac {\vec a*\vec b}{||\vec a||*||\vec b||} \]
因此,用向量來表示文檔,然后就可以用余弦來計算兩篇文章之間的相似度了。
2. 詞袋模型
一篇文檔里面有很多很多句子,每個句子又是由一個個的詞組成。詞袋模型,通俗地講,就是:把一篇文檔看成詞袋,里面裝着一個個的詞。
從而,將一篇文檔轉化成了一個個的詞(或者稱之為 term),顯然地,文檔轉化成一個個的詞之后,詞與詞之間的順序關系丟失了。
3. TF-IDF
在計算文檔之間相似度之前,會有一些前提條件:
- 我們有一個文檔集合C,文檔集合C里面一共有N篇文檔
- 我們有一個詞典D,或者叫詞庫(Vocabulary),詞庫里面一共有M個詞
3.1 文檔到向量的轉化
向量是有長度的,向量中的每個元素是數值,比如一個三維實值向量:(1.2,2.8,4.5)
首先將文檔通過詞袋模型轉化成一個個的詞,一般地,由於文檔中的詞都會存在於詞典D中,定義一個M維向量(M等於詞典大小),若文檔中的某個詞在詞典中出現了,就給這個詞賦一個實數值。若未出現,則在相應位置處賦值為0
3.2 使用TF-IDF 衡量每個詞(term)的權重
在給定的文檔集合C和詞典D的情況下,如何來衡量一個詞(term)的權重呢?即如何計算這個實數值呢?
3.2.1 tf值
tf(term frequency),是指 term 在某篇文檔中出現的頻率。假設文檔集合中共有10篇文章,詞:''國家'',在文檔1中出現了6次,那么對於文檔1而言,'國家'這個詞的tf值為6。因此,tf 是針對單篇文檔而言的,即:某個詞在這篇文檔中出現了多少次。詞頻是計算文檔得分的一個因子,因此為了計算某篇文檔的得分,使用的詞頻指的就是term在這篇文檔中出現的次數,而不是term在所有文檔中出現的次數。
3.2.2 idf值
'國家'這個詞在文檔1中的idf值 由 詞(term) 出現在各個文檔中數目來決定,比如'國家'一共在8篇文檔中出現了,那么對於文檔1而言,'國家'這個詞的idf值由如下公式計算:
\[idf_t=log\frac{N}{df_t} \]
其中,N=10 表示文檔集合中共有10篇文章。\(df_t=8\),表示 term 國家 在8篇文檔中出現了。因此,idf 值是針對所有文檔(文檔集合)而言的,即:數一數這個詞都出現在哪些文檔中。
而TF-IDF,就是將tf值乘以idf值:
\[TF-IDF=tf*idf \]
前面提到,將文檔向量化,需要給文檔中的每個詞賦一個實數值,這個實數值,就是通過tf*idf得到。
4. 總結
在給定文檔集合C和詞典D的條件下,將某篇文檔通過詞袋模型表示成一個個的詞,而后根據 TF-IDF 為每個詞計算出一個實數值;
由於詞典D的大小為M,因此將這篇文檔轉化成一個M維向量,如果詞典中某個詞未出現在文檔中,則這個詞的在向量中對應的元素為0,若某個詞出現在文檔中,則這個詞在向量中對應的元素值為這個詞的tf-idf值。這樣,就把文檔表示成向量了,而這就是 向量空間模型(vector space model)。從這里也可看出:向量空間模型並沒有catch住詞(term)與詞(term)之間的關系,它假設各個term之間是相互獨立的。即:VSM implies the assumption on the independence between terms
而有了文檔向量,也就可以用余弦公式計算文檔之間的相似度了。
由於詞典一般比較大,比如20萬個詞左右的漢語詞典,而一篇文檔中一般只包含幾百個詞,因此可看出:文檔向量是很稀疏的。
另外,由於對於文檔而言,詞與詞之間是有順序的,比如文檔開頭是哪些詞,中間有哪些詞,結尾又是哪些詞,但表示成向量之后,這個 順序 信息丟失了。比如下面2篇文檔,它們的文檔向量是一樣的。
Mary is quick than John
John is quick than Mary
總之,在我看來,向量空間模型是一種將文檔轉化成向量的方式,文檔轉化成了向量,從而可以在同一維度的空間中表示一個個的文檔。向量中的每個元素是一個個的實數,每個元素對應着一個 詞(term),實數 是通過tf-idf計算出來的。由此看來,tf-idf也僅僅是一種將詞(term)轉化成實數的方式,當然我們也可以通過其他方法將 詞 轉化成實數。而這里的 詞 則是由詞典定義的,若詞典中的某個詞 在文檔中,則計算這個詞的tf-idf值,若某個詞不在文檔中,則這個詞對應的向量元素為0。因此,得到的文檔向量是M維的,其中M就是詞典的大小---詞典中詞的個數。
將文檔轉化成了向量,文檔之間的比較,就可以轉化成向量的比較。因此,就能回答給定若干篇文檔,哪兩篇文檔最相關這樣的問題了。在實際應用中,比如Lucene中的TF-IDF Similarity就是基於VSM來實現的。從VSM Model到Lucene Conceptual Scoring Formula 再到 Lucene Practical Scoring Formula,解釋了在實際應用中,我們輸入一個查詢字符串,Lucene是如何計算文檔的得分,從而找出與查詢字符串最相關的文檔的。
5. 實際應用
在實際應用中,我們並不是直接使用 TF*IDF 這個理論模型,因為它計算出來的權重偏向於短文本,因此需要某種平滑。
舉個例子來說,term1在docA中出現了3次,term2在docA中出現了9次,根據上面計算TF的方式,意味着:term2的tf權重(或者說重要性)比term1要大3倍,那真的是重要3倍么?因此,在Lucene的實際評分模型中,計算的是sqrt(tf),即通過 tf 開根號,起到一定的平滑作用。類似地,計算 idf 時,是取log對數,也是為了平滑。
參考資料:
- 《An Introduction to Information Retrieval》第6章
- bm25-the-next-generation-of-lucene-relevation
- Lucene JAVA API TF-IDF Similarity