Представление сходства слов между словами из двух списков однородно в Python - PullRequest
0 голосов
/ 30 октября 2018

Я пытаюсь использовать технику НЛП, чтобы увидеть сходство слов из двух списков.

Код как ниже

import en_core_web_sm
nlp = en_core_web_sm.load()

Listalpha = ['Apple', 'Grapes', 'Mango', 'Fig','Orange']

ListBeta = ['Carrot', 'Mango', 'Tomato', 'Potato', 'Lemon']

list_n =" ".join(ListBeta)     
doc = nlp(list_n)   


list_str = " ".join(Listalpha)    
doc2 = nlp(list_str)

newlist = []

for token1 in doc:
    for token2 in doc2:
        newlist.append((token1.text, token2.text,token1.similarity(token2)))


words_most_similar = sorted(newlist, key=lambda x: x[2], reverse=True)
print(words_most_similar)

Я получаю следующий вывод

[('Mango', 'Mango', 1.0), ('Potato', 'Mango', 0.71168435), ('Lemon', 'Orange', 0.70560765), ('Carrot', 'Mango', 0.670182), ('Tomato', 'Mango', 0.6513121), ('Potato', 'Fig', 0.6306212), ('Tomato', 'Fig', 0.61672616), ('Carrot', 'Apple', 0.6077532), ('Lemon', 'Mango', 0.5978425), ('Mango', 'Fig', 0.5930651), ('Mango', 'Orange', 0.5529714), ('Potato', 'Apple', 0.5516073), ('Potato', 'Orange', 0.5486618), ('Lemon', 'Fig', 0.50294644), ('Mango', 'Apple', 0.48833746), ('Tomato', 'Orange', 0.44175738), ('Mango', 'Grapes', 0.42697987), ('Lemon', 'Apple', 0.42477235), ('Carrot', 'Fig', 0.3984716), ('Carrot', 'Grapes', 0.3944748), ('Potato', 'Grapes', 0.3860814), ('Tomato', 'Apple', 0.38342345), ('Carrot', 'Orange', 0.38251868), ('Tomato', 'Grapes', 0.3763761), ('Lemon', 'Grapes', 0.28998604)]

Как получить вывод в формате, как показано ниже

[('Mango','Mango',1.0),('Mango', 'Fig', 0.5930651), ('Mango', 'Orange', 0.5529714),('Mango', 'Apple', 0.48833746),('Mango', 'Grapes', 0.42697987),('Carrot', 'Mango', 0.670182),('Carrot', 'Apple', 0.6077532)....]

В основном мне нужно отображение формы (слово в ListBeta, слово в Listalpha, счет косинуса), и оно должно быть равномерным, а не случайным, как в настоящее время. Кроме того, он должен быть в порядке убывания косинуса, как показано выше.

1 Ответ

0 голосов
/ 30 октября 2018

Если это действительно вопрос сортировки результатов, вы можете использовать кортежи в качестве ключевого результата в sorted, т. Е. Ваша лямбда может вернуть кортеж / список, а python будет сортировать по ним поэлементно.

words_most_similar = sorted(newlist, key=lambda t: (t[0], -t[2]))
...