如何使用NLTK的pos_tag()提取名词?

4 投票
4 回答
13334 浏览
提问于 2025-04-18 11:01

我刚开始学Python,遇到了一些问题,想提取名词,但找不到错误所在。

我写了以下代码:

import nltk

sentence = "At eight o'clock on Thursday film morning word line test best beautiful Ram Aaron design"

tokens = nltk.word_tokenize(sentence)

tagged = nltk.pos_tag(tokens)


length = len(tagged) - 1

a = list()

for i in (0,length):
    log = (tagged[i][1][0] == 'N')
    if log == True:
      a.append(tagged[i][0])

运行这个代码时,'a' 只有一个元素。

a
['detail']

我不明白为什么会这样?

如果不使用for循环,代码就能正常运行。

log = (tagged[i][1][0] == 'N')
    if log == True:
      a.append(tagged[i][0])

我手动把'i'的值从0改到'长度',输出结果就很好,但用for循环却只返回最后一个元素。有人能告诉我for循环出了什么问题吗?

代码运行后,'a' 应该是这样的:

['Thursday', 'film', 'morning', 'word', 'line', 'test', 'Ram' 'Aaron', 'design']

4 个回答

0

试试这个

import nltk

sentence = "At eight o'clock on Thursday film morning word line test best beautiful Ram Aaron design"

tokens = nltk.word_tokenize(sentence)

tagged = nltk.pos_tag(tokens)

length = len(tagged) - 1

a = list()

for i in range(0, length):
    log = (tagged [i][1][0] == 'N')
    if log == True:
        a.append(tagged [i][0])
print a
0

这一行代码只会循环两次

for i in (0,length):

第一次是当 i = 0,第二次是当 i = length

你想要的是

for i in range(length):
10

在编程中,我们经常会遇到一些问题,特别是在使用某些工具或库的时候。有时候,错误信息可能会让人感到困惑,不知道该如何解决。这个时候,查看其他人的提问和回答就显得特别重要,因为他们可能遇到过类似的问题,并分享了自己的解决方案。

在这个平台上,用户可以提出自己的问题,其他人则可以提供帮助。每个问题下面通常会有许多回答,大家可以根据自己的经验来分享解决方法。通过这些交流,我们可以更快地找到问题的根源,并学习到更多的知识。

总之,利用好这些资源,可以让我们在编程的道路上走得更顺利,避免走弯路。

>>> from nltk import word_tokenize, pos_tag
>>> sentence = "At eight o'clock on Thursday film morning word line test best beautiful Ram Aaron design"
>>> nouns = [token for token, pos in pos_tag(word_tokenize(sentence)) if pos.startswith('N')]
>>> nouns
['Thursday', 'film', 'morning', 'word', 'line', 'test', 'Ram', 'Aaron', 'design']
8
for i in (0,length):

这个代码会遍历两个元素,分别是零和length。如果你想遍历从零到length之间的每一个数字,可以使用range

for i in range(0, length):

更好的是,直接遍历一个序列中的元素,而不是它的索引,这样更符合常规写法。这可以减少像上面那种拼写错误的可能性。

for item in tagged:
    if item[1][0] == 'N':
      a.append(item[0])

对于注重代码简洁的用户来说,可能更喜欢用一行的列表推导式:

a = [item[0] for item in tagged if item[1][0] == 'N']

撰写回答