2011-12-25 31 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) 

至少在这个例子中,篮球棒球之间的差额条款应足以将它们分组成单独的组。或者,您可以在代码中使用阈值更直接地使用相似性分数。