确定一个单词是否为名词

9
给定一个单词,我希望确定它是否为名词(例如在歧义情况下,如“cook”可以是名词或动词,该单词必须被确定为名词)。
实际上,我使用 Stanford Parser 的 POS 标签器(以单个单词作为输入,仅从结果中提取 POS 标签)。结果相当不错,但处理时间非常长。
有没有一种方法(请使用 Python :)来比我现在执行此任务更快?

1
斯坦福解析器在输入上执行了许多其他操作(依赖关系分析,组成结构分析等),这在这里是浪费时间。此外,对于我想要做的事情来说,词性标注是否有点过于强大了(通常词性标注是在整个句子而不是单个单词上执行的)? - permanganate
3个回答

15
如果您只是想检查一个单词是否可以用作名词,最快的方法可能是构建一个包含所有名词的集合,然后仅检查该单词是否属于该集合。要获取所有名词的列表,您可以使用WordNet语料库(例如可以通过NLTK进行访问):
>>> from nltk.corpus import wordnet as wn
>>> nouns = {x.name().split('.', 1)[0] for x in wn.all_synsets('n')}
>>> "cook" in nouns
True
>>> "and" in nouns
False

这是一种可能性,谢谢 :) nltk 提供了 67176 个名词,我们不会失去很多吗?(在您的代码中,我认为您忘记了 ()name 后面) - permanganate
你说得对:我不确定有多少英语名词!你可能能够在其他地方找到更大的列表,以扩展WordNet提供的内容。 (在我的Python和NLTK版本中,.name(不带括号)似乎是访问该单词的正确方式。) - Alex Riley
我认为 name 是一个函数,代码应该是 nouns = {x.name().split('.', 1)[0] [...]} - Ponkadoodle
1
感谢@Wallacoloo;看起来自从我写这个答案以来,name已经从属性更改为方法。我已经更新了它。 - Alex Riley

1
我无法代表Python封装程序发言,但如果您使用斯坦福的POS标记器而不是解析器,速度应该更快。有Stanford CoreNLP的封装程序,其中包括标记器:https://pypi.python.org/pypi/corenlp-python; 或者,看起来nltk也有一个斯坦福标记器模块 http://www.nltk.org/_modules/nltk/tag/stanford.html
如果您将单个单词嵌入玩具句子中,还可以获得更好的结果。这样做类似于“X是一件事情”。根据句子的不同,这可能会导致你更倾向于或远离猜测名词。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接