gpt4 book ai didi

python - 在 Python 3.6 中使用列表推导式循环并比较两个句子的依赖三元组时出现语法错误

转载 作者:太空宇宙 更新时间:2023-11-04 02:24:25 24 4
gpt4 key购买 nike

我有下面两句话:

  1. 我想回家。
  2. 我想离开。

我的目标是使用建议的内核来量化两个句子之间的相似性 this paper .我为每个句子提取所有依赖三元组。这些是包含句子中单词之间所有关系的 3 项元组,看起来像(tail, relationship, head)

为了计算相似度,我需要遍历句子中所有可能的三元组组合,并根据匹配的节点数和关系是否匹配,将特定数字添加到相似度得分。

我尝试在 for 循环中使用列表理解,因为我认为它比另一个嵌套 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(?))来进行此计算?

最佳答案

在 Python 中,您可以在列表理解中使用表达式,但不能使用语句。你可能想看看 diffence between expressions and statements在 Python 中。

关于如何计算 ((# of matching nodes) * (1 if the relationship doesn't match, 2.5 if its)),这是分子您问题中论文的 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)))

请注意,使用 generator expression instead of a list comprehension 可能更有效如果您在 deps1deps2 中有很多元素,因为每次迭代的单独结果不需要存储在内存中。

关于python - 在 Python 3.6 中使用列表推导式循环并比较两个句子的依赖三元组时出现语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50814296/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com