NLP文本類似度(TF-IDF)

本篇博文是數據挖掘部分的首篇,思路主要是先聊聊類似度的理論部分,下一篇是代碼實戰。
 
    咱們在比較事物時,每每會用到「不一樣」,「同樣」,「類似」等詞語,這些詞語背後都涉及到一個動做——雙方的比較。只有經過比較才能得出結論,到底是相同仍是不一樣。可是萬物真的有這麼極端的區分嗎?在我看來不是的,生活中經過「 類似度」這詞來描述可能會更加準確。好比男人和女人,雖然生理器官和可能思想有些不一樣,但也有相同的地方,那就是都是人,就是說類似度不爲0;好比石頭與小草,它們對於虛擬類都是一種實體類,類似度也不爲0;兩個句子詞和詞的順序都一致,類似度就是1。一個概念能夠應用到不一樣於相同的兩個方面的定義。可真謂方便至極了。  
    
    在生活中,信息檢索、文檔複製檢測等領域都應用到「文本類似度」。可能有人以爲文本是文字,其實不盡然,文本類似度的應用更廣,除了文字的匹配,還能夠是圖片,音頻等,由於他們的實質都是在計算機中都是以二進制的方式存在的。
    
    類似度,實質就是計算個體間相程度。什麼是個體?對於語句,個體就是語句,對於圖片,個體就是圖片。
    
    先介紹最經常使用最簡單的方法:餘弦類似度。
    餘弦類似度就是經過一個向量空間中兩個向量夾角的餘弦值做爲衡量兩個個體之間差別的大小。把1設爲相同,0設爲不一樣,那麼類似度的值就是在0~1之間,全部的事物的類似度範圍都應該是0~1,若是不是0~1的話,就不是咱們應該研究的事了,那是神經學家和生物學家的事了。餘弦類似度的特色是餘弦值接近1,夾角趨於0,代表兩個向量越類似。看下圖,
                  
    三角形越扁平,證實兩個個體間的距離越小,類似度越大;反之,類似度越小。可是,文本的類似度計算只是針對字面量來計算的,也就是說只是針對語句的字符是否相同,而不考慮它的語義,那是另一個研究方向來着。好比,句子1:你真好看:。句子2:你真難看。這兩句話類似度75%,可是它們的語義相差十萬八千里,能夠說是徹底相反。又好比,句子1:真好吃。句子2:很美味。兩個句子類似度爲0,可是語義在某個場景下是一致的。
    因此在實際中,沒有很完美的解決方案。每一個公司會針對業務要求來調節類似度算法,使其在某些場合可以精確計算。
 
    計算兩個圖片的類似度,就是把圖片a,圖片b,映射爲向量,而後經過這個公式來計算出類似度。在這裏,最最最重要的是「映射」這個過程,這個過程,若是在大數據的應用中,涉及到了對數據的分詞,去重,轉換,計算等步驟。
                                                                   
                                          向量a和向量b是二維                                                                                                                                 拓展到n維的計算模型
 
    經過計算模型公式能夠明確的求出餘弦類似度的值。那麼對於咱們寫程序實現這個算法,就是把兩個個體轉換爲向量,而後經過這個公式求出最終解。
    好比向量a(x1, x2, x3, x4, x5),向量b(y1, y2, y3, y4, y5)。分子爲(x1*y1)+(x2*y2)+(x3*y3)+(x4*y4)+(x5*y5),分母爲sqrt(x1*x1+x2*x2+x3*x3+x4*x4+x5*x5)。
    下面經過實際例子來看如何由一個句子轉換爲向量。
                                                                                    
    由圖可知,兩個句子的類似度計算的步驟是:
    1.經過中文分詞,把完整的句子根據分詞算法分爲獨立的詞集合
    2.求出兩個詞集合的並集(詞包)
    3.計算各自詞集的詞頻並把詞頻向量化
    4.帶入向量計算模型就能夠求出文本類似度
注意,詞包肯定以後,詞的順序是不能修改的,否則會影響到向量的變化。
    以上是對兩個句子作類似度計算,若是是對兩篇文章作類似度計算,步驟以下:
    1.找出各自文章的關鍵詞併合成一個詞集合
    2.求出兩個詞集合的並集(詞包)
    3.計算各自詞集的詞頻並把詞頻向量化
    4.帶入向量計算模型就能夠求出文本類似度
    句子的類似度計算只是文章類似度計算的一個子部分。文章的關鍵詞提取能夠經過其餘的算法來實現,這裏先跳過,下一篇才介紹。
 
    到這裏出現一個關鍵的名詞——詞頻TF,詞頻是一個詞語在文章或句子中出現的次數。若是一個詞很重要,很明顯是應該在一個文章中出現不少次的,可是這也不是絕對的,好比「地」,「的」,「啊」等詞,它們出現的次數對一篇文章的中心思想沒有一點幫助,只是中文語法結構的一部分而已。這類詞也被稱爲「停用詞」。因此,在計算一篇文章的詞頻時,停用詞是應該 過濾掉的。
    可是僅僅過濾掉停用詞就能接近問題?也不必定的,好比若是想分析近期的十九屆中央紀委二次全會等新聞文章,很明顯出現「中國」這個詞語一定會出如今每篇文章,可是對於每一個新聞的主幹思想有幫助嗎?對比「反腐反敗」,「人工智能」「大數據」等詞語,「中國」這個詞語在文章中應該是次要的。
    所以進一步假設,若是某個詞比較少見(在咱們準備的文章庫中的佔比比較少),可是它在這篇文章中屢次出現,那麼它極可能反映了這篇文章的特性,正是咱們所須要的關鍵詞。在此,在詞頻TF的基礎上又引出了反文檔頻率IDF的概念。通常來講,在一篇文章或一個句子來講,對於每一個詞都有不一樣的重要性,這也就是詞的權重。在詞頻的基礎上,賦予每個詞的權重,進一步體現該詞的重要性。好比一篇報道中國農業養殖的新聞報道。最多見的詞(「的」、「是」、「在」)給予最小的權重,較常見的詞(「國內」、「中國」、「報道」)給予較小的權重,較少見的詞(「養殖」、「維基」)。因此刻畫能力強的詞語,權重應該是最高的。
    將TF和IDF進行相乘,就獲得了一個詞的TF-IDF值,某個詞對文章重要性越高,該值越大,因而排在前面的幾個詞,就是這篇文章的關鍵詞。(在實際中,還要考慮詞的詞性等多維度的特性,動詞,名詞,形容詞的刻畫能力也是有所差異的;因社會熱點而詞的刻畫性爆發式提升(好比 打call))。
    下圖是詞頻的計算方法:
                                                                                            
    詞頻標準化的目的是把全部的詞頻在同一維度上分析。詞頻的標準化有兩個標準,第一種狀況,得出詞彙較小,不便於分析。通常狀況下,第二個標準更適用,由於可以使詞頻的值相對大點,便於分析。好比一本書出現一個詞語100次,但整本書10萬字,詞頻可是在一句話中出現5次,
    下面是反文檔頻率的計算方法:
                            
    針對這個公式,可能有人會有如下的疑問:
    1.爲何+1?是爲了處理分母爲0的狀況。假如全部的文章都不包含這個詞,分子就爲0,因此+1是爲了防止分母爲0的狀況。
    2.爲何要用log函數?log函數是單調遞增,求log是爲了歸一化,保證反文檔頻率不會過大。
    3.會出現負數?確定不會,分子確定比分母大。
    
    TF-IDF = 計算的詞頻(TF)*計算的反文檔頻率(IDF)。經過公式能夠知道,TF-IDF與在該文檔中出現的次數成正比,與包含該詞的文檔數成反比。
 
    在知道TF-IDF後,先拋出兩個小實踐:
1.利用TF-IDF計算類似文章:
    1)使用TF-IDF算法,找出兩篇文章的關鍵詞
    2)每篇文章各取出若干個關鍵詞(好比20個),合併成一個集合,計算每篇文章對於這個集合中的詞的詞頻(爲了不文章長度的差別,可使用相對詞頻)
    3)生成兩篇文章各自的詞頻向量
    4)計算兩個向量的餘弦類似度,值越大就表示越類似
    利用TF-IDF計算文章類似度,上面已經給出很詳細的流程了。這裏再也不分析,下面來講說自動摘要技術。
    文章的信息都包含在句子中,有些句子包含的信息多,有些句子包含的信息少。 "自動摘要"就是要找出那些包含信息最多的句子。句子的信息量用"關鍵詞"來衡量。若是包含的關鍵詞越多,就說明這個句子越重要。只要關鍵詞之間的距離小於「門檻值」 ,它們就被認爲處於同一個簇之中,若是兩個關鍵詞之間有5個以上的其餘詞,就能夠把這兩個關鍵詞分在兩個簇。下一步,對於每一個簇,都計算它的重要性分值
                                                                                                             
有時候,爲了方便實際的操做能夠化簡爲不考慮簇的用法,
1)計算原始文本的詞頻,生成詞頻數組 [(2, '你好'), (10, '大數據'), (4, '智能'), (100, '的')...]
2)過濾停用詞,得出新的詞頻數組  [(2, '你好'), (10, '大數據'), (4, '智能')...]
3)按照詞頻進行排序 [(2, '你好'), (4, '智能'), (10, '大數據')...]
4)將文章分爲句子
5)選擇關鍵詞首先出現的句子 (通常文章首段和最後一段,每段的首句和末句是比較重要的)
6)將選中的句子按照出現順序,組成摘要
 
   這樣作的優勢是簡單快速,結果比較符合實際狀況。缺點是單純以「詞頻」作衡量標準,不夠全面,詞性和詞的出現位置等因素沒有考慮到,並且有時重要的詞可能出現的次數並很少。這種算法沒法體現詞的位置信息,出現位置靠前的詞與出現位置靠後的詞,都被視爲重要性相同,這是不正確的。(一種解決方法是,對全文的第一段和每一段的第一句話,給予較大的權重。) 
相關文章
相關標籤/搜索