Cer*_*rin 7 python nlp linguistics wordnet
给出一个单词,可能是也可能不是单数形式的名词,你会如何产生复数形式?
基于这个NLTK教程和关于复数规则的非正式列表,我写了这个简单的函数:
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'
Run Code Online (Sandbox Code Playgroud)
但我认为这是不完整的.有一个更好的方法吗?
art*_*omp 28
pattern-en包(对于python 2.5+,但还没有python 3)提供了多元化
>>> import pattern.en
>>> pattern.en.pluralize("dog")
'dogs'
>>>
Run Code Online (Sandbox Code Playgroud)
ala*_*10n 14
另一个支持python 3的选项是Inflect.
import inflect
engine = inflect.engine()
plural = engine.plural(your_string)
Run Code Online (Sandbox Code Playgroud)
首先,值得注意的是,作为常见问题解答所解释的那样,WordNet 无法生成复数形式。
\n\n如果你想使用它,无论如何都可以。借助 Morphy,WordNet 或许能够为许多内容生成复数形式名词生成复数\xe2\x80\xa6\xc2\xa0,但它仍然无法帮助大多数不规则名词,例如“孩子”。
\n\n无论如何,从 Python 使用 WordNet 的简单方法是通过NLTK。NLTK HOWTO 文档之一解释了WordNet 接口。(当然,在不指定语料库的情况下使用 NLTK 会更容易,但这不是您所要求的。)
\n\nWordNet 有一个较低级别的 API,称为pywordnet,但我相信它已不再维护(它成为 NLTK 集成的基础),并且仅适用于旧版本的 Python(可能是 2.7,但不是 3.x)和 WordNet(仅 2.x)。
或者,您始终可以通过使用ctypes或cffi构建自定义绑定来访问 C API,或者使用 Jython 而不是 CPython 来访问 Java API。
或者,当然,您可以通过 调用命令行界面subprocess。
无论如何,至少在某些安装上,如果您给简单的 Morphy 界面一个单数名词,它将返回其复数,而如果您给它一个复数名词,它将返回其单数。所以:
\n\nfrom nltk.corpus import wordnet as wn\nassert wn.morphy(\'dogs\') == \'dog\'\nassert wn.morphy(\'dog\') == \'dog\'\nRun Code Online (Sandbox Code Playgroud)\n\n这实际上并没有记录在案,甚至没有暗示是真的,事实上,对于OP来说,这显然不是真的,所以我不确定我是否想要依赖它(即使它碰巧在您的计算机上运行)。
\n\n另一种方法已被记录为有效,因此您可以编写一些应用所有可能的英语复数规则的规则,调用morphy每个规则,并且返回起始字符串的第一个规则是正确的复数。
然而,它的工作记录方式是通过盲目应用相同类型的规则来有效地实现。因此,例如,它会正确地告诉您不是\xe2\x80\x94doges的复数形式,但不是因为它知道这是正确的答案;而是因为它知道它是正确的答案。只是因为它知道是一个不同的单词,并且它更喜欢“+s”规则而不是“+es”规则。所以,这不会有帮助。dogdogsdoge
另外,如上所述,它对任何不规则复数没有规则\xe2\x80\x94WordNet 不知道 和 children以child任何方式相关。
另外,wn.morphy(\'reckless\')将返回\'reckless\'而不是None。如果你想要这个,你必须先测试它是否是一个名词。你可以只使用相同的界面来做到这一点,尽管它有点hacky:
def plural(word):\n result = wn.morphy(word)\n noun = wn.morphy(word, wn.NOUN)\n if noun in (word, result):\n return result\nRun Code Online (Sandbox Code Playgroud)\n\n为了正确地做到这一点,您实际上需要添加一个复数数据库,而不是试图欺骗 WordNet 做它不能做的事情。
\n\n此外,一个单词可以有多种含义,并且它们可以有不同的复数形式,有时甚至同一含义有多个复数形式。所以你可能想从类似的东西开始(lemma for s in synsets(word, wn.NOUN) for lemma in s.lemmas if lemma.name == word),然后得到所有适当的复数,而不是仅仅返回“the”复数。
| 归档时间: |
|
| 查看次数: |
14677 次 |
| 最近记录: |