为什么NLTK的PoS标记器为单词中的每个字母标记而不是为每个单词标记?

2024-04-25 16:39:51 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个句子:I am a boy。我想找出句子中每个词的词性。这是我的代码:

import nltk
sentence = 'I am a good boy'
for word in sentence:
    print(word)
    print(nltk.pos_tag(word))

但这会产生以下输出:

^{pr2}$

所以,我试着这样做:

sentence = 'I am a good boy'
for word in sentence.split(' '):
    print(word)
    print(nltk.pos_tag(word))

这将产生以下输出:

I
[('I', 'PRP')]
am
[('a', 'DT'), ('m', 'NN')]
a
[('a', 'DT')]
good
[('g', 'NN'), ('o', 'MD'), ('o', 'VB'), ('d', 'NN')]
boy
[('b', 'NN'), ('o', 'NN'), ('y', 'NN')]

为什么它要为每个字母而不是每个单词查找词性词组?我该怎么解决这个问题?在


Tags: inposfortagdtnnamsentence
2条回答

nltk.pos_tag作为参数处理一个列表或类似于列表的东西,并标记其中的每个元素。所以在第二个例子中,它将每个字符串(即每个单词)拆分成字母,就像在第一个示例中将句子拆分成字母一样。当你把从分句中得到的所有列表都输入进来时,它就起作用了:

>>> nltk.pos_tag(sentence.split(" "))
[('I', 'PRP'), ('am', 'VBP'), ('a', 'DT'), ('good', 'JJ'), ('boy', 'NN')]

Per documentation,通常传入NLTK的标记化返回的内容(这是单词/标记的列表)。在

在这两种情况下,拆分数据的方式不同。但是pos_标记需要一个iterable作为输入。
在第一个例子中,您是将一个句子逐字拆分。
对于ex

sentence = "cat"
for word in sentence:
    print(word)
# 'c' , 'a', 't'

然后你要求pos_tagger找出每个字母的词性。在

^{pr2}$

显然,每次将字母作为pos_tag()的输入时,这里都会得到每个字母的词性标记。在


在你的第二个例子中,你用单词来分割句子。 例如:

sentence = 'I am a good boy'
splitted_words = sentence.split() # you can use split() instead of split(' ') 
for word in splitted_words: 
    print(word)
# 'I', 'am', 'a', 'good', 'boy'

现在要注意的一点是,每个单词都是iterableam'是iterable,我们可以通过'am'进行搜索,得到'a'和'm'。 所以很明显pos_tagger给出了单词中字母的结果。

如何克服这个问题:

pos_tag()需要一个iterable作为参数(list、tuple等)。我建议您将tokenizer()与NLTK一起使用,而不是手动按空格分割句子。 所以你的代码应该是这样的:

sentence = "I am a good boy"
tokenised_words = word_tokenize(sentence) # ['I', 'am', 'a', 'good', 'boy']
print(nltk.pos_tag(text))

输出

[('I', 'PRP'), ('am', 'VBP'), ('a', 'DT'), ('good', 'JJ'), ('boy', 'NN')]

相关问题 更多 >

    热门问题