Синтаксическая ошибка при использовании списочных представлений в Python 3.6 для зацикливания и сравнения триплетов зависимостей для двух предложений - PullRequest
0 голосов
/ 12 июня 2018

У меня есть следующие два предложения:

  1. Я хочу домой.
  2. Я хотел бы уйти.

Моя цель состоит в том, чтобыколичественно определить сходство между двумя предложениями, используя ядро, предложенное в этой статье .Я извлекаю все тройки зависимостей для каждого предложения.Это наборы из 3 элементов, которые содержат все отношения между словами в предложении и выглядят как (хвост, отношение, голова) .

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

Я попытался использовать списочные выражения внутри цикла for, так как полагал, что это будет более эффективно, чем другое вложенноецикл, но я получаю синтаксическую ошибку.Вот мой код:

sim = 0
theta = 2.5

for d1 in deps1:
    [sim += theta for d2 in deps2 if ((d1[0]==d2[0] or d1[2]==d2[2]) and d1[1]==d2[1])]
    [sim += 1 for d2 in deps2 if ((d1[0]==d2[0] or d1[2]==d2[2]) and d1[1]!=d2[1])]

Для справки, вот как выглядят deps1 и deps2 при печати:

[('I', 'nsubj', 'want'), ('want', 'ROOT', 'want'), ('to', 'aux', 'go'), ('go', 'xcomp', 'want'), ('home', 'advmod', 'go')]
[('I', 'nsubj', 'like'), ('would', 'aux', 'like'), ('like', 'ROOT', 'like'), ('to', 'aux', 'leave'), ('leave', 'xcomp', 'like')]

Вопросы:

  1. Какой правильный синтаксиссделать это с пониманием списка?
  2. Есть ли более эффективный способ, возможно, использовать numpy (?), чтобы сделать это вычисление?

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

В Python вы можете использовать выражения в понимании списка, но не выражения .Возможно, вы захотите взглянуть на разницу между выражениями и операторами в Python.

Что касается вашего вопроса в комментарии о том, как вычислить ((# of matching nodes) * (1 if the relationship doesn't match, 2.5 if it does)), который является числителем функции подобия SABK статьи в вашем вопросе, вы можете сделать это с помощью генератораи sum функция:

theta = 2.5
sim = sum((((d1[0] == d2[0]) + (d1[2] == d2[2])) * (theta if d1[1] == d2[1] else 1) for d1, d2 in product(deps1, deps2)))

Или, если вы хотите отделить код для функции подобия на предложение, что улучшает читабельность кода:

def sim_per_sentence(d1, d2):
    matching_nodes = (d1[0] == d2[0]) + (d2[0] == d2[0])
    relation_sim = theta if d1[1] == d2[1] else 1
    return matching_nodes * relation_sim

sim = sum((sim_per_sentence(d1, d2) for d1, d2 in product(deps1, deps2)))

Заметьте, что может быть гораздо эффективнее использовать выражение генератора вместо понимания списка , если у вас много элементов в deps1 и deps2, так как отдельные результаты каждой итерации не нужныхраниться в памяти.

0 голосов
/ 12 июня 2018

То, чего вы хотите достичь, является кумулятивным результатом, но вы не можете сделать это таким образом, потому что выражение sim += theta не возвращает независимый объект, который должен рассматриваться как элемент окончательного результата списка.Вместо этого вы можете умножить переменную theta на счетчик или создать список theta s, а затем создать кумулятивную версию, используя np.cumsum() или itertools.accumulate(), что не рекомендуется, если вы не хотите сохранить оба исходных результата.и кумулятивный.

Кроме того, вместо использования двух циклов вы можете использовать itertools.product для создания всех комбинаций триплетов, а в качестве счетчика вы можете использовать itertools.count.

In [36]: from itertools import product, count

In [37]: c = count(1)

In [38]: [2.5*next(c) for d1, d2 in product(deps1,deps2) if ((d1[0]==d2[0] or d1[2]==d2[2]) and d1[1]==d2[1])]
Out[38]: [2.5, 5.0]

И чтобы выполнить оба условия в одном списке, вы можете сделать следующее:

[(d1[1]!=d2[1] or 2.5)*next(c) for d1, d2 in product(deps1,deps2) if d1[0]==d2[0] or d1[2]==d2[2]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...