You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中获取单词的所有词形变体(时态/相关形式)

解决Python中获取单词语法变体/派生相关词的问题

你的核心需求是获取单词的语法屈折变体(如复数、动词时态)和同词根派生词,但之前基于WordNet的代码返回的是语义相关的同义词/近义词,并非目标结果。以下是精准实现的方案:

问题根源

你之前的代码调用wordnet.synsets(word).lemmas()得到的是语义同义词集里的词汇,比如summary的同义词包括sum-up、drumhead等,而非语法层面的词形变化或派生关联词(如summarize、summaries)。

解决方案:结合WordNet派生关系+Inflect屈折生成

我们需要两步:

  1. 用WordNet的derivationally_related_forms()获取同词根的派生词(如名词summary派生出动词summarize)
  2. 用inflect库生成单词的各种语法屈折形式(如动词的现在分词、过去式,名词的复数)

实现代码

import nltk
from nltk.corpus import wordnet
import inflect

# 首次运行需下载NLTK资源
nltk.download('wordnet')
nltk.download('omw-1.4')

def find_variations_of_word(word):
    inflect_engine = inflect.engine()
    variations = set()  # 用集合去重

    # 1. 添加名词复数形式(如果适用)
    plural_form = inflect_engine.plural(word)
    if plural_form != word:
        variations.add(plural_form)

    # 2. 遍历WordNet同义词集,获取派生相关词
    for synset in wordnet.synsets(word):
        for lemma in synset.lemmas():
            # 获取当前lemma的派生关联词形
            for related_lemma in lemma.derivationally_related_forms():
                related_word = related_lemma.name().replace("_", " ")
                variations.add(related_word)

                # 若派生词是动词,生成其屈折形式(现在分词、过去式、过去分词)
                for related_synset in wordnet.synsets(related_word):
                    if related_synset.pos() == 'v':
                        # 生成各种动词形式
                        present_participle = inflect_engine.conjugate(related_word, 'part')
                        past_tense = inflect_engine.conjugate(related_word, 'past')
                        past_participle = inflect_engine.conjugate(related_word, 'ppart')

                        # 非原词的形式才加入
                        if present_participle != related_word:
                            variations.add(present_participle)
                        if past_tense != related_word:
                            variations.add(past_tense)
                        if past_participle != related_word:
                            variations.add(past_participle)

    # 过滤原词,转成有序列表
    return sorted([var for var in variations if var != word])

# 测试
word = "summary"
print(find_variations_of_word(word))
# 输出: ['summaries', 'summarize', 'summarized', 'summarizing']

代码说明

  • inflect库:专门处理英语词形变化,能精准生成复数、动词各种时态形式
  • WordNet派生关系:derivationally_related_forms()能找到同词根的跨词性派生词(如名词转动词)
  • 集合去重:避免重复添加相同变体
  • 词性过滤:仅对动词生成屈折形式,避免无效处理

扩展调整

如果需要覆盖更多变体(如形容词的比较级/最高级),可以在代码中添加对应逻辑:

  • 对形容词词性(pos() == 'a'),用inflect_engine.compare()生成比较级/最高级

内容的提问来源于stack exchange,提问作者Zeke John

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 00:10:51