給你若干篇文檔,找出這些文檔中最類似的兩篇文檔?html
類似性,能夠用距離來衡量。而在數學上,可以使用餘弦來計算兩個向量的距離。apache
\[cos(\vec a, \vec b)=\frac {\vec a*\vec b}{||\vec a||*||\vec b||}\]ui
所以,用向量來表示文檔,而後就能夠用餘弦來計算兩篇文章之間的類似度了。spa
一篇文檔裏面有不少不少句子,每一個句子又是由一個個的詞組成。詞袋模型,通俗地講,就是:把一篇文檔當作詞袋,裏面裝着一個個的詞。orm
從而,將一篇文檔轉化成了一個個的詞(或者稱之爲 term),顯然地,文檔轉化成一個個的詞以後,詞與詞之間的順序關係丟失了。htm
在計算文檔之間類似度以前,會有一些前提條件:blog
向量是有長度的,向量中的每一個元素是數值,好比一個三維實值向量:(1.2,2.8,4.5)文檔
首先將文檔經過詞袋模型轉化成一個個的詞,通常地,因爲文檔中的詞都會存在於詞典D中,定義一個M維向量(M等於詞典大小),若文檔中的某個詞在詞典中出現了,就給這個詞賦一個實數值。若未出現,則在相應位置處賦值爲0字符串
在給定的文檔集合C和詞典D的狀況下,如何來衡量一個詞(term)的權重呢?即如何計算這個實數值呢?get
tf(term frequency),是指 term 在某篇文檔中出現的頻率。假設文檔集合中共有10篇文章,詞:''國家'',在文檔1中出現了6次,那麼對於文檔1而言,'國家'這個詞的tf值爲6。所以,tf 是針對單篇文檔而言的,即:某個詞在這篇文檔中出現了多少次。詞頻是計算文檔得分的一個因子,所以爲了計算某篇文檔的得分,使用的詞頻指的就是term在這篇文檔中出現的次數,而不是term在全部文檔中出現的次數。
'國家'這個詞在文檔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獲得。
在給定文檔集合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是如何計算文檔的得分,從而找出與查詢字符串最相關的文檔的。
在實際應用中,咱們並非直接使用 TF*IDF 這個理論模型,由於它計算出來的權重偏向於短文本,所以須要某種平滑。
舉個例子來講,term1在docA中出現了3次,term2在docA中出現了9次,根據上面計算TF的方式,意味着:term2的tf權重(或者說重要性)比term1要大3倍,那真的是重要3倍麼?所以,在Lucene的實際評分模型中,計算的是sqrt(tf),即經過 tf 開根號,起到必定的平滑做用。相似地,計算 idf 時,是取log對數,也是爲了平滑。
參考資料: