2011-12-25 58 views
3

我想分析一堆搜索條件,很多,他們單獨他們並沒有多大分辨。也就是說,我想對這些術語進行分組,因爲我認爲類似的術語應該具有相似的效果。例如,分組類似的字符串

Term    Group 
NBA Basketball  1 
Basketball NBA  1 
Basketball   1 
Baseball   2 

這是一個人爲的例子,但希望它解釋了我想要做的。那麼,做我所描述的最好的方法是什麼?我認爲nltk可能有這樣的一些東西,但我只是不太熟悉它。

感謝

+1

我認爲你需要更多地定義你的問題 - 這需要更多的知識。嘗試搜索「聚類分析」。當你需要做某些事情時,NLTK會很有用,比如說預處理這些單詞。 – winwaed 2011-12-25 22:38:11

回答

7

您將要集羣這些條款,以及相似性量度我建議Dice's Coefficient在字符克的水平。例如,將字符串分成兩個字母序列進行比較(term1 =「NB」,「BA」,「A」,「B」,「Ba」...)。

nltk似乎提供了骰子nltk.metrics.association.BigramAssocMeasures.dice(),但它足夠簡單,以允許調整的方式實現。以下是如何在字符而不是字級比較這些字符串。

import sys, operator 

def tokenize(s, glen): 
    g2 = set() 
    for i in xrange(len(s)-(glen-1)): 
    g2.add(s[i:i+glen]) 
    return g2 

def dice_grams(g1, g2): return (2.0*len(g1 & g2))/(len(g1)+len(g2)) 

def dice(n, s1, s2): return dice_grams(tokenize(s1, n), tokenize(s2, n)) 

def main(): 
    GRAM_LEN = 4 
    scores = {} 
    for i in xrange(1,len(sys.argv)): 
    for j in xrange(i+1, len(sys.argv)): 
     s1 = sys.argv[i] 
     s2 = sys.argv[j] 
     score = dice(GRAM_LEN, s1, s2) 
     scores[s1+":"+s2] = score 
    for item in sorted(scores.iteritems(), key=operator.itemgetter(1)): 
    print item 

,當該程序與你的字符串運行,以下相似分數生產:

./dice.py "NBA Basketball" "Basketball NBA" "Basketball" "Baseball" 

('NBA Basketball:Baseball', 0.125) 
('Basketball NBA:Baseball', 0.125) 
('Basketball:Baseball', 0.16666666666666666) 
('NBA Basketball:Basketball NBA', 0.63636363636363635) 
('NBA Basketball:Basketball', 0.77777777777777779) 
('Basketball NBA:Basketball', 0.77777777777777779) 

至少在這個例子中,籃球棒球之間的差額條款應足以將它們分組成單獨的組。或者,您可以在代碼中使用閾值更直接地使用相似性分數。