1. 程式人生 > >TF-IDF與餘弦相似性文字處理:自動提取關鍵詞、找出相似文章

TF-IDF與餘弦相似性文字處理:自動提取關鍵詞、找出相似文章

這個標題看上去好像很複雜,其實我要談的是一個很簡單的問題。

有一篇很長的文章,我要用計算機提取它的關鍵詞(Automatic Keyphrase extraction),完全不加以人工干預,請問怎樣才能正確做到?

這個問題涉及到資料探勘、文字處理、資訊檢索等很多計算機前沿領域,但是出乎意料的是,有一個非常簡單的經典演算法,可以給出令人相當滿意的結果。它簡單到都不需要高等數學,普通人只用10分鐘就可以理解,這就是我今天想要介紹的TF-IDF演算法。

讓我們從一個例項開始講起。假定現在有一篇長文《中國的蜜蜂養殖》,我們準備用計算機提取它的關鍵詞。

一個容易想到的思路,就是找到出現次數最多的詞。如果某個詞很重要,它應該在這篇文章中多次出現。於是,我們進行"詞頻"(Term Frequency,縮寫為TF)統計。

結果你肯定猜到了,出現次數最多的詞是----"的"、"是"、"在"----這一類最常用的詞。它們叫做"停用詞"(stop words),表示對找到結果毫無幫助、必須過濾掉的詞。

假設我們把它們都過濾掉了,只考慮剩下的有實際意義的詞。這樣又會遇到了另一個問題,我們可能發現"中國"、"蜜蜂"、"養殖"這三個詞的出現次數一樣多。這是不是意味著,作為關鍵詞,它們的重要性是一樣的?

顯然不是這樣。因為"中國"是很常見的詞,相對而言,"蜜蜂"和"養殖"不那麼常見。如果這三個詞在一篇文章的出現次數一樣多,有理由認為,"蜜蜂"和"養殖"的重要程度要大於"中國",也就是說,在關鍵詞排序上面,"蜜蜂"和"養殖"應該排在"中國"的前面。

所以,我們需要一個重要性調整係數,衡量一個詞是不是常見詞。如果某個詞比較少見,但是它在這篇文章中多次出現,那麼它很可能就反映了這篇文章的特性,正是我們所需要的關鍵詞。

用統計學語言表達,就是在詞頻的基礎上,要對每個詞分配一個"重要性"權重。最常見的詞("的"、"是"、"在")給予最小的權重,較常見的詞("中國")給予較小的權重,較少見的詞("蜜蜂"、"養殖")給予較大的權重。這個權重叫做"逆文件頻率"(Inverse Document Frequency,縮寫為IDF),它的大小與一個詞的常見程度成反比。

知道了"詞頻"(TF)和"逆文件頻率"(IDF)以後,將這兩個值相乘,就得到了一個詞的TF-IDF值。某個詞對文章的重要性越高,它的TF-IDF值就越大。所以,排在最前面的幾個詞,就是這篇文章的關鍵詞

下面就是這個演算法的細節。

第一步,計算詞頻。

考慮到文章有長短之分,為了便於不同文章的比較,進行"詞頻"標準化。

或者

第二步,計算逆文件頻率。

這時,需要一個語料庫(corpus),用來模擬語言的使用環境。

如果一個詞越常見,那麼分母就越大,逆文件頻率就越小越接近0。分母之所以要加1,是為了避免分母為0(即所有文件都不包含該詞)。log表示對得到的值取對數。

第三步,計算TF-IDF。

可以看到,TF-IDF與一個詞在文件中的出現次數成正比,與該詞在整個語言中的出現次數成反比。所以,自動提取關鍵詞的演算法就很清楚了,就是計算出文件的每個詞的TF-IDF值,然後按降序排列,取排在最前面的幾個詞。

還是以《中國的蜜蜂養殖》為例,假定該文長度為1000個詞,"中國"、"蜜蜂"、"養殖"各出現20次,則這三個詞的"詞頻"(TF)都為0.02。然後,搜尋Google發現,包含"的"字的網頁共有250億張,假定這就是中文網頁總數。包含"中國"的網頁共有62.3億張,包含"蜜蜂"的網頁為0.484億張,包含"養殖"的網頁為0.973億張。則它們的逆文件頻率(IDF)和TF-IDF如下:

從上表可見,"蜜蜂"的TF-IDF值最高,"養殖"其次,"中國"最低。(如果還計算"的"字的TF-IDF,那將是一個極其接近0的值。)所以,如果只選擇一個詞,"蜜蜂"就是這篇文章的關鍵詞。

除了自動提取關鍵詞,TF-IDF演算法還可以用於許多別的地方。比如,資訊檢索時,對於每個文件,都可以分別計算一組搜尋詞("中國"、"蜜蜂"、"養殖")的TF-IDF,將它們相加,就可以得到整個文件的TF-IDF。這個值最高的文件就是與搜尋詞最相關的文件。

TF-IDF演算法的優點是簡單快速,結果比較符合實際情況。缺點是,單純以"詞頻"衡量一個詞的重要性,不夠全面,有時重要的詞可能出現次數並不多。而且,這種演算法無法體現詞的位置資訊,出現位置靠前的詞與出現位置靠後的詞,都被視為重要性相同,這是不正確的。(一種解決方法是,對全文的第一段和每一段的第一句話,給予較大的權重。)

有些時候,除了找到關鍵詞,我們還希望找到與原文章相似的其他文章。比如,"Google新聞"在主新聞下方,還提供多條相似的新聞。

為了找出相似的文章,需要用到"餘弦相似性"(cosine similiarity)。下面,我舉一個例子來說明,什麼是"餘弦相似性"。

為了簡單起見,我們先從句子著手。

  句子A:我喜歡看電視,不喜歡看電影。

  句子B:我不喜歡看電視,也不喜歡看電影。

請問怎樣才能計算上面兩句話的相似程度?

基本思路是:如果這兩句話的用詞越相似,它們的內容就應該越相似。因此,可以從詞頻入手,計算它們的相似程度。

第一步,分詞。

  句子A:我/喜歡/看/電視,不/喜歡/看/電影。

  句子B:我/不/喜歡/看/電視,也/不/喜歡/看/電影。

第二步,列出所有的詞。

  我,喜歡,看,電視,電影,不,也。

第三步,計算詞頻。

  句子A:我 1,喜歡 2,看 2,電視 1,電影 1,不 1,也 0。

  句子B:我 1,喜歡 2,看 2,電視 1,電影 1,不 2,也 1。

第四步,寫出詞頻向量。

  句子A:[1, 2, 2, 1, 1, 1, 0]

  句子B:[1, 2, 2, 1, 1, 2, 1]

到這裡,問題就變成了如何計算這兩個向量的相似程度。

我們可以把它們想象成空間中的兩條線段,都是從原點([0, 0, ...])出發,指向不同的方向。兩條線段之間形成一個夾角,如果夾角為0度,意味著方向相同、線段重合;如果夾角為90度,意味著形成直角,方向完全不相似;如果夾角為180度,意味著方向正好相反。因此,我們可以通過夾角的大小,來判斷向量的相似程度。夾角越小,就代表越相似。

以二維空間為例,上圖的a和b是兩個向量,我們要計算它們的夾角θ。餘弦定理告訴我們,可以用下面的公式求得:

假定a向量是[x1, y1],b向量是[x2, y2],那麼可以將餘弦定理改寫成下面的形式:

數學家已經證明,餘弦的這種計算方法對n維向量也成立。假定A和B是兩個n維向量,A是 [A1, A2, ..., An] ,B是 [B1, B2, ..., Bn] ,則A與B的夾角θ的餘弦等於:

使用這個公式,我們就可以得到,句子A與句子B的夾角的餘弦。

餘弦值越接近1,就表明夾角越接近0度,也就是兩個向量越相似,這就叫"餘弦相似性"。所以,上面的句子A和句子B是很相似的,事實上它們的夾角大約為20.3度。

由此,我們就得到了"找出相似文章"的一種演算法:

  (1)使用TF-IDF演算法,找出兩篇文章的關鍵詞;

  (2)每篇文章各取出若干個關鍵詞(比如20個),合併成一個集合,計算每篇文章對於這個集合中的詞的詞頻(為了避免文章長度的差異,可以使用相對詞頻);

  (3)生成兩篇文章各自的詞頻向量;

  (4)計算兩個向量的餘弦相似度,值越大就表示越相似。

"餘弦相似度"是一種非常有用的演算法,只要是計算兩個向量的相似程度,都可以採用它。

相關推薦

TF-IDF餘弦相似性文字處理自動提取關鍵詞相似文章

這個標題看上去好像很複雜,其實我要談的是一個很簡單的問題。 有一篇很長的文章,我要用計算機提取它的關鍵詞(Automatic Keyphrase extraction),完全不加以人工干預,請問怎樣才能正確做到? 這個問題涉及到資料探勘、文字處理、資訊檢索等很多計算

TF-IDF餘弦相似性的應用(一)自動提取關鍵詞

有一篇很長的文章,我要用計算機提取它的關鍵詞(Automatic Keyphrase extraction),完全不加以人工干預,請問怎樣才能正確做到?這個問題涉及到資料探勘、文字處理、資訊檢索等很多計算機前沿領域,但是出乎意料的是,有一個非常簡單的經典演算法,可以給出令人相當滿意的結果。它簡單到都不需要高等

TF-IDF余弦相似性的應用(三)自動摘要

下一步 dip target 似的 abs tps .net ebo ace 轉:http://www.ruanyifeng.com/blog/2013/03/automatic_summarization.html 有時候,很簡單的數學方法,就可以完成很復雜的任務。 這個

python檔案文字處理刪除空白行,刪除固定幾行,刪除固定列

話不多說,上程式碼 # coding=gbk # clearBlankline def clearBlankline(infile,outfile): infopen=open(infile,'r',encoding='utf-8') outopen=open(outfile,'

TF-IDF演算法自動提取關鍵詞

前言 關鍵詞提取可以是說是NLP中比較常見研究方向,這個涉及到資料探勘、文字處理、資訊檢索等很多計算機前沿領域。但今天我們就瞭解一個簡單的演算法來提取關鍵詞。 那麼我們該如何實現計算機自動提取關鍵詞呢? 讓我們從一個例項開始講起。假定現在有一篇長文《中國的

Pandas使用DataFrame進行資料分析比賽進階之路(二)日期資料處理按日期篩選顯示及統計資料

首先,表格的資料格式如下: 1、獲取某年某月資料 data_train = pd.read_csv('data/train.csv') # 將資料型別轉換為日期型別 data_train[

文字特徵特徵提取(一)

為了使用機器學習方法處理文字資料,需要找到適合的文字表示形式,對於傳統機器學習方法而言,常用的一種表示方法是將文件轉換為文件-詞項矩陣(document term matrix)。具體就是將多篇文件轉換為資料幀(dataframe),其中: 每個行標籤代表

2017頭條筆試題二維點集中右上角沒有點的點並按x坐標從小到大打印坐標

測試結果 ++ reserve using 如果 穩定 一個 lac 順序 PS:這篇是之前本來就想發的但是一直沒時間寫,加上今天做了京東的題,結果代碼名就命名為jingdong了……懶得改代碼名重新跑一遍結果了=。= 暴力法去做就是遍歷每個點,判斷它是不是“最大點”。判

LeetCode155. Min Stack(棧中最小的那個值)

Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. push(x) -- Push element x onto stack. pop()

textrank演算法原理提取關鍵詞自動提取摘要PYTHON

首先介紹原理與概念 TextRank 演算法是一種用於文字的基於圖的排序演算法。其基本思想來源於谷歌的 PageRank演算法(其原理在本文在下面), 通過把文字分割成若干組成單元(單詞、句子)並建立圖模型, 利用投票機制對文字中的重要成分進行排序, 僅利用單

C語言的組成32個關鍵詞9種控制語句34種運算子

        隨著科技的進步,我們生活的方方面面都已經智慧化了。智慧手機,早已不侷限於拍照聽音樂,各種功能強大到你瞠目;智慧電視,只要是加了微信,在公司也能遙控指揮,從此再不怕忘記關電視;智慧空調,早已經拜託了遙控器,可以通過觸控的方式進行調節。這樣的例子實在是不勝列舉,

電子科技大學推免複試題利用遞迴方法一個數組中的最大值和最小值

/**************************** 編寫一個函式,使之能完成以下功能: 利用遞迴方法找出一個數組中的最大值和最小值,要求遞迴呼叫函式的格式如下: MinMaxValue(arr,n,&max,&min),其中arr是給定的陣列,n是陣

LeetCode 第3題給定一個字串,不含有重複字元的最長子串的長度。

public class LeetCode3 { public static void main(String[] args) { /** * LeetCode第3題: * 給定一個字串,找出不含有重複字元的最

基於LuceneTF-IDF餘弦相似性實現長文字相似度檢測

什麼是TF-IDF TF-IDF(Term Frequency-Inverse Document Frequency),漢譯為詞頻-逆文字頻率指數。 TF指一個詞出現的頻率,假設在一篇文章中某個詞出現的次數是n,文章的總詞數是N,那麼TF=n/N 逆文字頻率指數IDF一

TF-IDF及相關知識(餘弦相似性

自然語言的處理是一個神奇的領域,它涉及到資料探勘、文字處理、資訊檢索等很多計算機前沿領域,由於複習相關知識,所以這裡對該方向的部分知識做一個簡單的介紹和記錄。 該文主要記錄的是一個很簡單卻很經典有效的演算法——TF-IDF。從它的概念到運算可能花不了10分鐘就能瞭解,並且用

達觀資料曾彥能如何用深度學習做好長文字分類法律文書智慧化處理

在NLP領域中,文字分類輿情分析等任務相較於文字抽取,和摘要等任務更容易獲得大量標註資料。因此在文字分類領域中深度學習相較於傳統方法更容易獲得比較好的效果。正是有了文字分類模型的快速演進,海量的法律文書可以通過智慧化處理來極大地提高效率。我們今天就來分析一下當前state of art的文

從零開始的文字TF-IDF向量構造和基於餘弦相似度的文字分類

一、任務需求        1、給定資料庫裡面的N行資料每行代表一篇文章,屬性分別是[id, title, summuary,content] ,從mysql資料庫獲取資料並生成DataFrame格式的資料,有兩列,分別是id 和con

語言處理 - [Today is TF-IDF] - [詞頻-逆檔案頻率]

下看一個簡單的解釋。最通俗易懂: TF-IDF  要解決的問題,如何衡量一個關鍵字在文章中的重要性 總起   TF-IDF,理解起來相當簡單,他實際上就是TF*IDF,兩個計算值的乘積,用來衡量一個詞庫中的詞對每一篇文件的重要程度。下面我們分開來講這兩個值,TF和IDF。

機器學習筆記筆記之三——文字型別處理-詞袋法TF-IDF理解

  在面對文字型特徵時,大致可以分為兩種。    一是列舉型別,比如:男女,小學生初中生高中生大學生……這種型別下類別一般不會超過百種,那麼就可以使用 啞編碼(one-hot)來處理。   另一種就是真正意義上的文字,一條評論或是一篇文章。對於這樣的資

第六章(1.3)自然語言處理實戰——使用tf-idf演算法實現簡單的文字聚類

一、原理 使用jieba切詞 用td-idf計算文字的詞頻和逆文件詞頻 排序選出最重要的2個或3個詞作為這段文字的id 具有相同id的文字被歸為一類 二、使用python實現簡單的文字聚類,其中使用了tf-idf演算法,jieba分詞,把相似的文字聚合在