Python 3.x 如何从布朗语料库中获取动词、名词、形容词?

Python 3.x 如何从布朗语料库中获取动词、名词、形容词?,python-3.x,nlp,nltk,corpus,pos-tagger,Python 3.x,Nlp,Nltk,Corpus,Pos Tagger,我一直试图从布朗语料库中分离出所有的名词、动词等,所以我尝试使用代码 brown.all_synsets('n') 但显然,这段代码只适用于wordnet。顺便说一下,我正在使用Python3.4 编辑 @阿尔维斯的回答奏效了。但是当我把它和random一起使用时,它会出错。看一看 nn = {word for word, pos in brown.tagged_words() if pos.startswith('NN')} print(nn) 输出是 {'such', 'rather'

我一直试图从布朗语料库中分离出所有的名词、动词等,所以我尝试使用代码

brown.all_synsets('n')
但显然,这段代码只适用于wordnet。顺便说一下,我正在使用Python3.4


编辑 @阿尔维斯的回答奏效了。但是当我把它和random一起使用时,它会出错。看一看

nn = {word for word, pos in brown.tagged_words() if pos.startswith('NN')}
print(nn)
输出是

{'such', 'rather', 'Quite', 'Such', 'quite'}
但是当我使用

random.choice(nn)
我明白了

回溯(最近一次呼叫最后一次):
文件“/home/aziz/Desktop/2222.py”,第5行,在
打印(随机选择(NN))
文件“/usr/lib/python3.4/random.py”,第256行,在选项中
返回序号[i]
TypeError:“set”对象不支持索引
TL;DR

>>> from nltk.corpus import brown
>>> {word for word, pos in brown.tagged_words() if pos.startswith('NN')}

在较长时间内

遍历
.tagged_words()
函数,该函数将返回
('word','POS')
元组列表:

>>> from nltk.corpus import brown
>>> brown.tagged_words()
[(u'The', u'AT'), (u'Fulton', u'NP-TL'), ...]
请阅读本章了解NLTK corpora API的工作原理:

然后,对其进行列表理解,并保存一组带有名词标记的单词(例如,
NN、NNS、NNP等)。

>>> {word for word, pos in brown.tagged_words() if pos.startswith('NN')}
请注意,输出可能不是您所期望的,因为带有句法和句法名词词性标记的单词不一定是语义参数/实体


另外,我认为你提取的单词不正确。仔细检查列表:

>>> nouns = {word for word, pos in brown.tagged_words() if pos.startswith('NN')} 
>>> 'rather' in nouns
False
>>> 'such' in nouns
False
>>> 'Quite' in nouns
False
>>> 'quite' in nouns
False
>>> 'Such' in nouns
False
列表的输出为:


为什么
随机。当
nn
是一个集合时,选择(nn)
失败?

random.choice()
的输入是一个序列(请参阅)

随机选择(seq)

从非空序列返回随机元素 如下。如果seq为空,则引发indexer

python中的python序列类型是

  • python2.x中的str、unicode、list、tuple、bytearray、buffer、xrange(请参阅)
  • Python3.x中的列表、元组和范围
  • (二进制序列类型)Python 3.x中的字节、字节数组、内存视图
  • Python 3.x中的(文本字符串序列)
    str

由于
set
不是序列,因此您将获得
索引器

欢迎使用StackOverflow。请不要将答案贴在其他答案的回复上,而是编辑您的问题,查看单词是如何以棕色标记的,因为它们大多被视为金/银标准(即基本事实),所以别无选择,只能接受标记。您确定您的输出中得到了“相当”吗?我没有=(是的,我只是做了一些修改。实际的代码是{word-for-word,pos-in-brown.tagged_-words(),如果pos.startswith('NN')),但我把它改成了[word-for-word,pos-in-brown.tagged_-words(),如果pos.startswith('NN')]我很满意。请为这个代码片段添加一些支持文本。解释为什么它会解决OP的问题。帮助其他人理解。当然@APC,抱歉正在准备早餐,所以我做了一个快速的回答。我想你想知道,因为这出现在低质量的后期评论中。当你在做早餐时,我喜欢我的鸡蛋有阳光的一面up:)@alvas,如果我使用自己的语料库,代码会工作吗?如我所见,在这种情况下将不会有
.tagged\u words()
方法。有什么提示吗?
>>> nouns = {word for word, pos in brown.tagged_words() if pos.startswith('NN')} 
>>> 'rather' in nouns
False
>>> 'such' in nouns
False
>>> 'Quite' in nouns
False
>>> 'quite' in nouns
False
>>> 'Such' in nouns
False