计算路径相似性分数并列出理解问题



我有两个从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)

我正在尝试编写一个函数,以在S1中的每个同步子中以最大的"路径相似性"分数找到S2中的同步。因此,对于包含4个唯一综合集的S1,该函数应返回4个路径相似性分数,我将从中转换为PANDAS系列对象以易于计算。

我一直在研究以下代码

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

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

[]

有人愿意看我的循环有什么问题,也许在这个主题上启发我?

谢谢。

我删除了" sysnet"类引用,因为我没有该类是任何类别,而且对于评分目的而言,这也无关紧要。分数功能被抽象出来,因此您可以根据自己的意愿定义它。我对一个非常简单的规则进行了刺伤。它比较了由.分离器划分的每个位置,以查看它们是否相等。如果是,则分数会增加。例如,在s1中,与组成的be.f.02相比,be.v.01的得分为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)

最新更新