生成名词的复数形式(plural of form)

给定一个单词,它可能是也可能不是单数形式的名词,你将如何生成它的复数形式?

给定一个单词,它可能是也可能不是单数形式的名词,你将如何生成它的复数形式?

基于这个NLTK tutorial和这个关于复数规则的informal list,我写了这个简单的函数:

def plural(word):
    """
    Converts a word to its plural form.
    """
    if word in c.PLURALE_TANTUMS:
        # defective nouns, fish, deer, etc
        return word
    elif word in c.IRREGULAR_NOUNS:
        # foot->feet, person->people, etc
        return c.IRREGULAR_NOUNS[word]
    elif word.endswith('fe'):
        # wolf -> wolves
        return word[:-2] + 'ves'
    elif word.endswith('f'):
        # knife -> knives
        return word[:-1] + 'ves'
    elif word.endswith('o'):
        # potato -> potatoes
        return word + 'es'
    elif word.endswith('us'):
        # cactus -> cacti
        return word[:-2] + 'i'
    elif word.endswith('on'):
        # criterion -> criteria
        return word[:-2] + 'a'
    elif word.endswith('y'):
        # community -> communities
        return word[:-1] + 'ies'
    elif word[-1] in 'sx' or word[-2:] in ['sh', 'ch']:
        return word + 'es'
    elif word.endswith('an'):
        return word[:-2] + 'en'
    else:
        return word + 's'

但我认为这是不完整的。有没有更好的方法来做到这一点?

34

pattern-en 包提供pluralization

>>> import pattern.en
>>> pattern.en.pluralize("dog")
'dogs'
>>> 
23

另一个支持 python 3 的选项是Inflect

import inflect
engine = inflect.engine()
plural = engine.plural(your_string)
4

首先,值得注意的是,正如the FAQ所解释的,WordNet 不能生成复数形式。

如果你想使用它,你可以。使用 Morphy,WordNet 可能能够为many名词生成复数...但是对于大多数不规则名词,例如“children”,它仍然没有帮助。

无论如何,从 Python 使用 WordNet 的简单方法是通过NLTK。其中一个 NLTK HOWTO 文档解释了WordNet Intece。(当然,只使用 NLTK 而不指定语料库会更容易,但这不是您所要求的。)

WordNet 有一个较低级别的 API,称为pywordnet,但我相信它不再维护(它成为 NLTK 集成的基础),并且仅适用于旧版本的 Python(可能是 2.7,但不是 3.x)和 WordNet(只有 2.x)。

或者,您可以始终使用ctypescffi或构建自定义绑定来访问 C API,或者使用 Jython 而不是 CPython 来访问 Java API。

或者,当然,您可以通过subprocess调用命令行界面。

无论如何,至少在某些安装上,如果你给简单的 Morphy 接口一个单数名词,它会返回它的复数,而如果你给它一个复数名词,它会返回它的单数。

from nltk.corpus import wordnet as wn
assert wn.morphy('dogs') == 'dog'
assert wn.morphy('dog') == 'dog'

这实际上并没有记录,甚至暗示,是真的,事实上,这显然不是真的 OP,所以我不知道我想依靠它(即使它发生在你的电脑上工作)。

的另一种方式是记录工作,所以你可以写一些规则,应用所有可能的英语复数规则,在每个规则上调用morphy,第一个返回起始字符串是正确的复数。

但是,它记录的工作方式是通过盲目应用相同类型的规则来有效的。因此,例如,它会正确地告诉您doges不是dog的复数-但不是因为它知道dogs是正确的答案;只是因为它知道doge是一个不同的词,所以它更喜欢“s”规则。

此外,如上所述,它没有任何不规则复数的规则-WordNet 不知道childrenchild以任式相关。

此外,wn.morphy('reckless')将返回'reckless'而不是None。如果你想要的话,你必须先测试它是否是一个名词。你可以这样做只是坚持使用相同的接口,虽然它有点 hacky:

def plural(word):
    result = wn.morphy(word)
    noun = wn.morphy(word, wn.NOUN)
    if noun in (word, result):
        return result

要正确地做到这一点,你实际上需要添加一个复数数据库,而不是试图欺骗 WordNet 做它不能做的事情。

此外,一个单词可以有多个含义,它们可以有不同的复数,有时甚至有多个相同含义的复数。所以你可能想从(lemma for s in synsets(word, wn.NOUN) for lemma in s.lemmas if lemma.name == word)开始,然后得到所有适当的复数,而不是只返回“the”复数。

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(472)
网格::右对齐网格项(align grid css)
上一篇
如何在Swift中获取另一个时区的当前日期和时间
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(44条)