Набор элементов должен быть хэшируемыми элементами. Список является изменяемым, что означает, что он не может быть хэш. Если вы можете просто переключиться на кортежи, это должно решить вашу проблему с хешированием.
Ваша вычислительная проблема - убийца. Посмотрите на ваше выражение:
ratio = (len(set(pair[0][1]).intersection(pair[1])) /
float(len(set(pair[0]).union(pair[0][1]))))
pair[0][1]
- это один символ. pair[0]
и pair[1]
являются строками. Поскольку длина символа равна 1, это выражение быстро уменьшается до:
1.0 / len(pair[0])
Это не совсем формула Жакара. Попробуйте это:
combo_pairs = [ ['Eat at Joes', 'Eat my shorts'], ['Eat well', 'Eat mamas pies'] ]
def Jaccard_Sim(pair):
"""return Jaccard Similarity Index for similarity between two sentences"""
chars0 = set(pair[0])
chars1 = set(pair[1])
ratio = float(len(chars0.intersection(chars1))) / \
len(chars0.union(chars1))
print(chars0, chars1, ratio)
return (ratio > 0.66)
sim_list = (Jaccard_Sim(pair) for pair in combo_pairs)
print(list(sim_list))
Выход:
{'s', 'E', 'o', 'e', 'J', ' ', 't', 'a'} {'s', 'E', 'y', 'r', 'o', ' ', 'h', 't', 'm', 'a'} 0.5
{'E', 'e', ' ', 'l', 't', 'a', 'w'} {'s', 'E', 'p', 'e', ' ', 'i', 't', 'm', 'a'} 0.45454545454545453
[False, False]