【问题标题】:NLTK Wordnet Synset for word phrase词组的 NLTK Wordnet Synset
【发布时间】:2015-08-16 19:40:24
【问题描述】:

我正在使用 Python NLTK Wordnet API。我正在尝试找到代表一组单词的最佳同义词集。

如果我需要为“学校和办公用品”之类的内容找到最佳同义词集,我不知道该怎么做。到目前为止,我已经尝试找到单个单词的同义词集,然后计算出最好的最低通用上位词,如下所示:

def find_best_synset(category_name):
    text = word_tokenize(category_name)
    tags = pos_tag(text)

    node_synsets = []
    for word, tag in tags:
        pos = get_wordnet_pos(tag)
        if not pos:
            continue
        node_synsets.append(wordnet.synsets(word, pos=pos))

    max_score = 0
    max_synset = None
    max_combination = None
    for combination in itertools.product(*node_synsets):
        for test in itertools.combinations(combination, 2):
            score = wordnet.path_similarity(test[0], test[1])
            if score > max_score:
                max_score = score
                max_combination = test
                max_synset = test[0].lowest_common_hypernyms(test[1])
    return max_synset

但是,这不是很好,而且成本很高。有什么方法可以确定哪个同义词集最能代表多个单词?

感谢您的帮助!

【问题讨论】:

  • 如果你所有的表达方式都像那个例子,那么你可能不应该寻找一个共同的上位词。 “学习用品”是一种用品,但不是某种学校。相反,您可以考虑最后一个词的同义词,并在使用前面的词的词组之间消除歧义(不过,我不知道该怎么做)。
  • 嗯,我明白你的意思,但我不认为所有的表达方式都像那个例子。我意识到“学校和办公室”是用品的类型,但它们仍然被认为是名词而不是形容词。
  • 好吧,如果表达式具有不同的内部结构,它不会简化您的任务。我建议您在随机样本中手动分配正确的同义词(例如从 20 个开始),然后查看是否可以看到模式。或者手动执行更多实例并训练决策树。

标签: python nltk wordnet


【解决方案1】:

除了我在 cmets 中已经说过的话,我认为您选择最佳上位词的方式可能存在缺陷。你最终得到的同义词不是所有词的最低通用上位词,而只是其中两个词的同义词。

让我们继续以“学校和办公用品”为例。对于表达式中的每个单词,您都会获得许多同义词。所以变量node_synsets 将如下所示:

[[school_1, school_2], [office_1, office_2, office_3], [supply_1]]

在此示例中,有 6 种方法可以将每个同义词组合与其他同义词集:

[(school_1, office_1, supply_1),
 (school_1, office_2, supply_1),
 (school_1, office_3, supply_1),
 (school_2, office_1, supply_1),
 (school_2, office_2, supply_1),
 (school_2, office_3, supply_1)]

这些三元组是您在外部 for 循环中迭代的内容(使用 itertools.product)。如果表达式有 4 个单词,你会迭代四倍,5 是五倍,等等。

现在,使用内部 for 循环,您可以将每个三元组配对。第一个是:

[(school_1, office_1),
 (school_1, supply_1),
 (office_1, supply_1)]

...然后您确定每对中最低的上位词。所以最后你会得到最低的同义词,比如school_2office_1,这可能是某种机构。这可能不是很有意义,因为它不考虑最后一个单词的任何同义词。

也许你应该尝试在它们的同义词组合的每个组合中找到所有三个词的最低共同上位词,并取其中得分最高的一个。

【讨论】:

  • 我同意,我尝试在以后的迭代中这样做。我最终使用的解决方案是不将这些简化为单个上位词,而是使用所有生成的同义词来获得最佳分数。几乎返回“node_synsets”并使用它。如果我确实想找到所有三个的 LCH……我会在其中两个之间找到它,然后在第三个的 LCH 计算中使用它吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-09
  • 2013-07-14
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
相关资源
最近更新 更多