【问题标题】:calculate path similarity score and list comprehension questions计算路径相似度分数和列表理解问题
【发布时间】:2017-08-30 16:32:35
【问题描述】:

我有两个从 wordnet.synsets() 生成的同义词列表:

import numpy as np
import nltk
from nltk.corpus import wordnet as wn
import pandas as pd

#convert tag to the one used by wordnet
def convert_tag(tag):
    tag_dict = {'N': 'n', 'J': 'a', 'R': 'r', 'V': 'v'}
    try:
        return tag_dict[tag[0]]
    except KeyError:
        return None

#define a function to find synset reference
def doc_to_synsets(doc):
    token = nltk.word_tokenize(doc)
    tag = nltk.pos_tag(token)
    wordnet_tag = convert_tag(tag)
    syns = [wn.synsets(token, wordnet_tag) for token in nltk.word_tokenize(doc)]
    syns_list = [token[0] for token in syns if token]
    
    return syns_list

#convert two example text documents
doc1 = 'This is a test function.'
doc2 = 'Use this function to check if the code in doc_to_synsets is correct!'

s1 = doc_to_synsets(doc1)
s2 = doc_to_synsets(doc2)

我正在尝试编写一个函数来查找 s2 中的同义词集,该同义词集对于 s1 中的每个同义词集具有最大的“路径相似性”分数。因此,对于包含 4 个独特的同义词集的 s1,该函数应返回 4 个路径相似度分数,我会将其转换为 pandas Series 对象以便于计算。

到目前为止,我一直在编写以下代码

def similarity_score(s1, s2):
    list = []
    for word1 in s1:
        best = max(wn.path_similarity(word1, word2) for word2 in s2)
        list.append(best)
        
    return list

但是,它只返回一个没有任何值的空列表。

[]

有人愿意看看我的 for 循环有什么问题,或许可以在这个问题上启发我吗?

谢谢。

【问题讨论】:

  • 请在单个代码 sn-p 中创建一个minimal reproducible example,我们可以立即复制、粘贴和运行,包括函数调用和打印。

标签: python nltk list-comprehension wordnet synonym


【解决方案1】:

我删除了“Sysnet”类引用,因为我没有该类是什么,并且它对于评分目的无关紧要。 score 函数被抽象出来,所以你可以随意定义它。我尝试了一个非常简单的规则。它比较由. 分隔符划分的每个位置,以查看它们是否相等。如果是,则分数增加。例如,在 s1 中,be.v.01 与组成的 be.f.02 相比,得分为 1,因为前缀匹配。相反,如果我们与 be.v.02 进行比较,我们将得到 2 分,以此类推。

s1 = [('be.v.01'),
('angstrom.n.01'),
('function.n.01'),
('trial.n.02')]

s2 = [('use.n.01'),
('function.n.01'),
('see.n.01'),
('code.n.01'),
('inch.n.01'),
('be.v.01'),
('correct.v.01')]

def score(s1,s2):
    score = 0
    for x,y in zip(s1.split('.'),s2.split('.')): 
        if x == y: 
            score += 1 
    return score

closest = [] # list of [target,best_match]

for sysnet1 in s1:
    max_score = 0
    best = None
    for sysnet2 in s2:
        cur_score = score(sysnet1,sysnet2)
        if cur_score > max_score:
            max_score = cur_score
            best = sysnet2
    closest.append([sysnet1,best])


print(closest)

【讨论】:

  • 您好,感谢您的回复。所需的函数基于 path_similarity(),它是 wordnet 中的内置函数。 Synset 对象是使用第一个代码块生成的。我无法编写一个 for 循环来从两组同义词集中获取路径相似性分数,其长度必须等于进入相似度分数()函数的第一个同义词集的长度。
  • 然后尝试用该函数替换 score。
  • 我看到你的代码示例自第一篇文章以来已经完全改变 - 我会看一下但现在必须运行。乍一看,我没有看到任何明显的错误,但我会避免在内置函数之后命名变量,例如list 在您的示例中。
  • 是的,我尝试将其更改为 token_list 或其他内容。
  • 我打开了另一个问题线程here,这可能更清楚。我只是想不出一种方法来遍历 path_similarity() 上的两个同义词集。
猜你喜欢
  • 1970-01-01
  • 2011-12-10
  • 2011-10-06
  • 1970-01-01
  • 2012-03-11
  • 2019-08-05
  • 2011-06-30
  • 1970-01-01
相关资源
最近更新 更多