您将要集群这些条款,以及相似性量度我建议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)
至少在这个例子中,篮球和棒球之间的差额条款应足以将它们分组成单独的组。或者,您可以在代码中使用阈值更直接地使用相似性分数。
我认为你需要更多地定义你的问题 - 这需要更多的知识。尝试搜索“聚类分析”。当你需要做某些事情时,NLTK会很有用,比如说预处理这些单词。 – winwaed 2011-12-25 22:38:11