我是一个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的例子。
任何帮助都将不胜感激。
答案 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')]
所以现在"战斗"被正确标记为"动词"和"海龟"复数专有名词。使用这个软件包的缺点是它有点慢。但我可能能够优化我的代码来解决这个问题。 :)