如何以编程方式确定单词的词性标记?

时间:2016-11-29 07:38:54

标签: nlp nltk grammar pos-tagger

想知道如何准确地确定单词的POS标签。我玩过像Stanford NLP等POS标签,但是当它是动词(VB)时,它们会像“响应”一样被标记为NN(名词)。

查询wordnet或字典转储会更准确吗?例如,“回复”这个词是动词,也可以是名词。或者也许可以从ngrams推断或添加基于频率的健全性检查?

3 个答案:

答案 0 :(得分:3)

POS Tagger传统上基于语料库上单词的概率分布。因此,将用例扩展到新的文本体通常会产生更高的错误率,因为单词的分布是不同的。

其他模型并非严格意义上的概率分布,例如神经网络,需要经过培训,但两者的逻辑相同。

例如,如果我使用Shakespeare中的标记句子为Hamlet文本创建一个POS标记器来定义我的概率分布,那么尝试POS标记Biomedical文本,它可能赢了&表现不错。

因此,为了提高准确性,您应该使用与您的特定域类似的文本进行训练。

当前在NLTK中表现最佳的POS标签是Perceptron Tagger,它是默认设置并使用预先训练的模型。以下是如何训练自己的模型以提高准确性的方法。

import nltk,math
# get data to train and test
tagged_sentences = [sentence for sentence in nltk.corpus.brown.tagged_sents(categories='news',tagset='universal')]
# hold out 20% for testing, get index for 20% split
split_idx = math.floor(len(tagged_sentences)*0.2)
# testing sentences are words only, list(list(word))
testing_sentences = [[word for word,_ in test_sent] for test_sent in tagged_sentences[0:split_idx]]
# training sentences words and tags, list(list(word,tag))
training_sentences = tagged_sentences[split_idx:] 
# create instance of perceptron POS tagger
perceptron_tagger = nltk.tag.perceptron.PerceptronTagger(load=False)
perceptron_tagger.train(training_sentences)
pos_tagged_sentences = [perceptron_tagger.tag([word for word,_ in test_sentence]) for test_sentence in testing_sentences]
perceptron_tagger.train()完成training_sentences

,您可以使用perceptron_tagger.tag()获取对您的域名更有用的pos_tagged_sentences,并提高准确性。

如果做得好,它们将产生高精度的结果。从my basic tests开始,它们会显示以下结果:

Metrics for <nltk.tag.perceptron.PerceptronTagger object at 0x7f34904d1748>
 Accuracy : 0.965636914654
 Precision: 0.965271747376
 Recall   : 0.965636914654
 F1-Score : 0.965368188021

答案 1 :(得分:2)

POS标记是一个令人惊讶的难题,考虑到人类做它时的容易程度。 POS标签使用许多不同的方法编写,斯坦福标记器是英语最好的通用标记器之一。 (请参阅here进行非常权威的比较。)因此,如果您建议的方法有任何好处 - 其中一些是 - ,它们已经在使用中。

如果你认为你可以建立一个更好的标记,那么一定要试一试;这将是一次很棒的学习经历。但是,如果你无法击败最先进的POS标签器,不要感到惊讶。

答案 2 :(得分:-1)

Have you tried TextBlob加载模态对话框?我的一个朋友正在学习语言学课程,他们都用它来标记POS。 这是一个Python库。您可以按包管理器pip安装。

$ pip install -U textblob

使用时,

>> from textblob import TextBlob

有更详细的tutorial。 您也可以安装他们的语料库NLTK。 (我不能发布链接,但只是搜索,教程很多)