您將要集羣這些條款,以及相似性量度我建議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