如何使用Brown或CoNLL2000标记器/ chunker标记句子?

时间:2014-05-30 11:38:26

标签: python nltk

我是一个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')]

你可以看到'战斗'被错误地标记为' NN'。我在本页http://text-processing.com/demo/tag/注意到,CoNLL2000标记器对我来说效果更好。对于同一句话,它显示:

  

标记文字

     

/ DT Turtles / NNS战斗/ VB碎纸机/ NN ./.

     

短语和命名实体

     

NP:   / DT Turtles / NNS   VP:   战斗/ VB   NP:   切碎机/ NN

我不知道如何使用这些标记器。我觉得这很简单,但我找不到搜索Google的例子。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:0)

NLTK中有一个内置的Name Entity chunker:

>>> 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')
('.', '.')

答案 1 :(得分:0)

我确实尝试使用TextBlob package,这也让我获得了更好的结果。

我的代码如下所示:

>>> 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')]

所以现在"战斗"被正确标记为"动词"和"海龟"复数专有名词。使用这个软件包的缺点是它有点慢。但我可能能够优化我的代码来解决这个问题。 :)