Jaccard係數(Jaccard Coefficient)和tf-idf方法

這個方法在信息檢索或者搜索引擎中經常用到,用於衡量兩個詞庫的交集。這裏面的兩個詞庫可能來源於文檔或者請求的語句。雖然簡單,但是很實用。

比如A和B是由文檔(Document)或者請求語句(Query)得到的兩個詞庫 (term sets)。




所以,我們有 JACCARD(A, A) = 1; 當A∩B=0 JACCARD(A, B) = 0; 0=<JACCARD(A, B)<=1。

注意,兩個詞庫A和B大小不一定相同。


舉個簡單的例子,請求語句(Query):“ides of March”,

                               文檔(Document):"Caesar died in March"

我們有JACCARD(q, d) = 1/6。(A與B的並集中March出現了兩次,並作一次) 


但是這個方法有個非常突出且嚴重的缺陷,就是沒有考慮到term出現的頻率(term frequency),僅僅統計了次數。同時,我們需要一個使文檔長度歸一化的方法。


我們不考慮term出現的順序,所以這種模型爲bag of words model。比如說“John is quicker than Mary”和“Mary is quicker than John”,我們認爲是一樣的。之所以不考慮term出現的順序,是考慮到算法複雜度(complexity),也就是運行速度(speed)問題。

那麼如何加進去term frequency這個維度呢?

這裏介紹一種非常實用且現在搜索引擎中也用到的tf-idf方法。之前也看了網上的一些算法介紹,但總感覺比較模糊。這次修了Information Retrieval這門課,對算法中一些不理解的地方豁然開朗了。下面我就介紹一下這個算法。

我們用tf(t,d)來表示term t在document d中出現的次數。但是,這樣生成的term frequency並不是我們希望的,一個term在某個文檔中的tf=10,而在另一個文檔中tf=1,但這並不意味着tf大的文檔與term的相關性是另一個文檔的10倍;也就是說,相關性(relevance)並不會隨着這種term frequency成正比增加。所以,用log frequency weight來代替之前“粗暴”的表示。

Term t在文檔d中的log frequency term定義爲:




所以,對於一對document-query,這個document的score爲  由document和query得來的兩個詞彙集合交集的詞(term)的log frequency weight之和。


如果query的term庫中沒有出現在document中,那麼這個score便是0。


看起來這樣貌似就可以表示term frequency了,但是,我們還需要考慮到這樣一種情況:通常很少出現的詞反而比出現頻率高的詞信息量更大。比如:“the”、"a"等詞在文檔中出現的頻率相當高,而類似於“Arachnocentric” (蜘蛛學)這樣的詞出現次數比較少,而正是這種很少出現的詞能表現出相關性。所以,我們需要提高這些很少出現的term的權重(height)。這裏,用document frequency這個因素來作爲權重。Document frequency爲所有documents中出現這個term的documents的數目。

因爲document frequency越高,越說明這個詞不重要,所以我們採用其倒數來表示,term t 的權重idf定義爲:


idf 可以用來衡量某個term的信息豐富程度, 其中,N爲所有documents的數目。之所以採用log,是爲了"抑制" idf 的影響。

從上可以看出,我們對term frequency和document frequency都取了log。

比方說,我們用下面的公式來計算idf(t) :


注意,idf 是用於含至少兩個term的query的情況下,決定文檔的排序。如果query只有一個term,那麼 idf 的影響就很小。


某個term的 tf-idf weight 定義爲 該term的 tf-weight 和 idf-weight 之間的乘積:


這就是信息檢索(information retrieval)領域非常出名的加權方案(weighting scheme)。也可記爲 tf.idx,tf x idf。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章