Как передать список пар в функцию из списка? - PullRequest
0 голосов
/ 24 августа 2018

У меня есть список пар:

List_Pairs = [
    ["Eat at Joe's", "Eat my shorts"],
    ["Eat well", "Eat mama's pies"],
     ...]

У меня есть функция, которая вычисляет сходство между парой предложений и возвращает значение, превышающее пороговое соотношение:

def Jaccard_Sim(pair):
    """return Jaccard Similarity Index for similarity between two sentences"""
    ratio = len(set(pair[0][1]).intersection(pair[1])/ 
    float(len(set(pair[0]).union(pair[0][1]))))
    return (ratio > 0.66)

Я называю это для каждой из моих пар:

sim_list = (Jaccard_Sim(pair) for pair in combo_pairs)

... и попробуйте напечатать:

print(list(sim_list))

Но я получаю следующую ошибку:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-50-b9508b63e83f> in <module>()
----> 1 list(sim_list)

<ipython-input-49-8ee7726dd300> in <genexpr>(.0)
----> 1 sim_list = (Jaccard_Sim(pair) for pair in combo_pairs)

<ipython-input-47-f211879c6e96> in Jaccard_Sim(pair)
     12 def Jaccard_Sim(pair):
     13     """return Jaccard Similarity Index for similarity between two sentences"""
---> 14     ratio = len(set(pair[0] 
[1]).intersection(pair[1])/float(len(set(pair[0]).union(pair[0][1]))))
     15     return (ratio > 0.66)
     16 

TypeError: unhashable type: 'list

1 Ответ

0 голосов
/ 24 августа 2018

Набор элементов должен быть хэшируемыми элементами. Список является изменяемым, что означает, что он не может быть хэш. Если вы можете просто переключиться на кортежи, это должно решить вашу проблему с хешированием.

Ваша вычислительная проблема - убийца. Посмотрите на ваше выражение:

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]
...