如何使用NLTK的pos_tag()提取名词?
我刚开始学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']