想知道如何准确地确定单词的POS标签。我玩过像Stanford NLP等POS标签,但是当它是动词(VB)时,它们会像“响应”一样被标记为NN(名词)。
查询wordnet或字典转储会更准确吗?例如,“回复”这个词是动词,也可以是名词。或者也许可以从ngrams推断或添加基于频率的健全性检查?
答案 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。 (我不能发布链接,但只是搜索,教程很多)