2010-03-16 85 views
53

我有一系列文本項目 - 來自MySQL數據庫的原始HTML。我想在這些條目中找到最常用的短語(不是最常見的短語,理想情況下,不強制逐字匹配)。如何從一系列文本條目中提取常見/重要短語

我的例子是Yelp.com任何審查,這表明從幾百指定餐廳的評論的3段,格式爲:

「嘗試漢堡包」(44條)

如,該頁面的「審查要點」部分:

http://www.yelp.com/biz/sushi-gen-los-angeles/

我有NLTK安裝,我已經與它玩耍了一點,但我老老實實的選項淹沒。這似乎是一個相當普遍的問題,我一直無法通過在這裏搜索找到一個簡單的解決方案。

+1

與nltk,它很容易得到bigrams和trigrams,但我正在尋找的是更可能的長度爲7 - 8個字的短語。我還沒有想出如何使nltk(或其他方法)提供這樣的「八度」和以上。 – arronsky 2010-03-16 09:23:39

回答

0

那麼,首先,您可能需要刪除所有HTML標籤(搜索「< [^>] *>」並用「」替換)。之後,你可以嘗試尋找每兩個文本項之間最長的常見子串的簡單方法,但我認爲你不會得到很好的結果。 您可以通過將詞彙歸一化(將它們降至基本形式,刪除所有重音符號,將所有內容設置爲低位或大寫)首先執行然後分析。再次,根據您想要完成的內容,如果您允許某些字詞順序靈活性,即將文本項目視爲標準化單詞的袋子並測量袋子內容相似性,則可以更好地將文本項目聚類。

我評論過類似(但不完全相同)的主題here

75

我懷疑你不只是想要最常見的詞組,而是你想要最有趣的搭配。否則,最終可能會出現由常用單詞組成的短語過多,而有趣且信息量較少的短語。

爲此,您基本上需要從數據中提取n-gram,然後找到具有最高point wise mutual information(PMI)的n-gram。也就是說,你想要找到一起出現的單詞比你期望的更多。

NLTK collocations how-to將介紹如何做到這一點的代碼約7系,例如:

import nltk 
from nltk.collocations import * 
bigram_measures = nltk.collocations.BigramAssocMeasures() 
trigram_measures = nltk.collocations.TrigramAssocMeasures() 

# change this to read in your data 
finder = BigramCollocationFinder.from_words(
    nltk.corpus.genesis.words('english-web.txt')) 

# only bigrams that appear 3+ times 
finder.apply_freq_filter(3) 

# return the 10 n-grams with the highest PMI 
finder.nbest(bigram_measures.pmi, 10) 
+1

是的,我同意 - 並且看着那個頁面,我可以得到雙和三克,但是這怎麼擴展到n-gram呢?我相信我會需要長度大於5的短語真正有趣,也許我會表達我的無知,但是這個演示頁面只能讓我得到2到3個單詞集? – arronsky 2010-03-16 09:40:20

+3

爲此,我認爲您需要擴展nltk.collocations.AbstractCollocationFinder,使用BigramCollocationFinder和TrigramColocationFinder作爲指南,請參閱http://nltk.googlecode.com/svn/trunk/doc/api/nltk.collocations-pysrc .html。但是,你確定你真的需要這麼長的短語嗎?在Yelp上,看起來他們突出顯示單詞和搭配以及幾個單詞,在你的生魚片,小東京和魚的鏈接例子中。然後他們選擇一個包含每個有趣單詞或短語的完整句子。 – dmcer 2010-03-16 18:57:12

+3

這個。我認爲你是絕對正確的。輝煌(和優雅)的觀察! – arronsky 2010-03-17 10:13:33

3

,如果你只是想獲得大於3級的n-gram你可以試試這個。我假設你已經去掉了所有的垃圾,如HTML等

import nltk 
ngramlist=[] 
raw=<yourtextfile here> 

x=1 
ngramlimit=6 
tokens=nltk.word_tokenize(raw) 

while x <= ngramlimit: 
    ngramlist.extend(nltk.ngrams(tokens, x)) 
    x+=1 

可能不是很Python的,因爲我只是一直在這樣做了一個月左右自己,但可能會有所幫助!

+1

-1這對我沒有任何幫助。我與OP的情況相同,你的方法只是返回了原始文本結構之後的一大堆元組。我應該如何繼續? – magnetar 2012-10-24 20:24:24

+0

一旦你有了這個列表,你需要遍歷它來計算獨特的ngram的存在。一種方法是通過創建一個字典,其中的關鍵是ngram,並在每次匹配時增加它。 – Toby 2012-10-31 09:49:23

+0

我也不明白這一點。你如何計算獨特的克數?這是一個單獨的詞袋。 – 2016-05-24 03:11:37

3

我認爲你要找的是chunking。我建議閱讀chapter 7 of the NLTK book或者我自己的文章chunk extraction。這兩種方法都假定有關詞性標註的知識,這在chapter 5中已涵蓋。

+0

我真的不明白什麼樣的塊與它有關。 – magnetar 2012-10-24 20:25:05

+1

塊可以解析短語,一旦你有短語,那麼你可以識別常見和重要的短語。 – Jacob 2012-10-25 02:05:53