如何用Brown或CoNLL2000标注器/分块器标记句子?
我刚接触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')
('.', '.')