如何用Brown或CoNLL2000标注器/分块器标记句子?

0 投票
2 回答
617 浏览
提问于 2025-04-18 08:03

我刚接触nltk和Python,但我想用Brown或CoNLL2000标注器来标记句子,而不是默认的pos_tag标注器。

现在我只是这样做:

import nltk
from nltk.tag import pos_tag

sentence = "The Turtles fight Shredder."
tags = pos_tag(sentence.split())

结果是

>>> tags
[('The', 'DT'), ('Turtles', 'NNP'), ('fight', 'NN'), ('Shredder.', 'NNP')]

你可以看到,“fight”被错误地标记为“NN”。我在这个页面上注意到,http://text-processing.com/demo/tag/,CoNLL2000标注器给我的结果更好。对于同一句话,它显示:

标记文本

The/DT Turtles/NNS fight/VB Shredder/NN ./.

短语和命名实体

名词短语(NP): The/DT Turtles/NNS 动词短语(VP): fight/VB 名词短语(NP): Shredder/NN

不过,我不太确定怎么使用这些标注器。我觉得这应该很简单,但我在谷歌上搜索时找不到例子。

任何帮助都将不胜感激。

2 个回答

0

我试着使用了TextBlob这个工具,结果效果好多了。

我的代码是这样的:

>>> from textblob import TextBlob
>>> from textblob_aptagger import PerceptronTagger

>>> sentence = "The Turtles fight Shredder."
>>> blob = TextBlob(sentence, pos_tagger=PerceptronTagger())
>>> blob.tags
[('The', u'DT'), ('Turtles', u'NNPS'), ('fight', u'VBD'), ('Shredder', u'NNP')]

现在“fight”被正确标记为“动词”,“Turtles”被标记为复数专有名词。使用这个工具的缺点是速度有点慢。不过我可能可以优化我的代码来解决这个问题。:)

0

在NLTK中,有一个内置的命名实体识别工具:

>>> from nltk.corpus import brown
>>> from nltk import word_tokenize, pos_tag, ne_chunk
>>> sent = "The turtles fight Shredder."
>>> pos_tag(word_tokenize(sent))
[('The', 'DT'), ('turtles', 'NNS'), ('fight', 'VBD'), ('Shredder', 'NNP'), ('.', '.')]
>>> ne_chunk(pos_tag(word_tokenize(sent)))
Tree('S', [('The', 'DT'), ('turtles', 'NNS'), ('fight', 'VBD'), Tree('PERSON', [('Shredder', 'NNP')]), ('.', '.')])
>>> for i in ne_chunk(pos_tag(word_tokenize(sent))):
...     print i
... 
('The', 'DT')
('turtles', 'NNS')
('fight', 'VBD')
(PERSON Shredder/NNP)
('.', '.')

不过它有一些小问题,比如当名词短语首字母大写时,它的处理方式会有所不同:

>>> sent = "The ninja turtles fight Shredder."
>>> for i in ne_chunk(pos_tag(word_tokenize(sent))):
...     print i
... 
('The', 'DT')
('ninja', 'NN')
('turtles', 'NNS')
('fight', 'VBD')
(PERSON Shredder/NNP)
('.', '.')
>>> sent = "The Ninja Turtles fight Shredder."
>>> for i in ne_chunk(pos_tag(word_tokenize(sent))):
...     print i
... 
('The', 'DT')
(ORGANIZATION Ninja/NNP Turtles/NNP)
('fight', 'NN')
('Shredder', 'NNP')
('.', '.')

撰写回答