Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nlp 如何以编程方式确定单词的词性标记?_Nlp_Nltk_Grammar_Pos Tagger - Fatal编程技术网

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

Nlp 如何以编程方式确定单词的词性标记?,nlp,nltk,grammar,pos-tagger,Nlp,Nltk,Grammar,Pos Tagger,我一直想知道如何准确地确定一个单词的词性标签。我用过一些词性标记,比如斯坦福NLP等,但它们打了又打,因为“respond”这样的词有时被标记为NN(名词),而它是动词(VB) 查询wordnet或字典转储会更准确吗?“respond”这个词是动词,也可以是名词。或者从ngrams推断或添加基于频率的健全性检查?您尝试过吗?我的一个朋友在上语言学课程,他们都用它来标记词性。 这是一个Python库。您可以通过软件包管理器pip安装 $ pip install -U textblob 使用时 &

我一直想知道如何准确地确定一个单词的词性标签。我用过一些词性标记,比如斯坦福NLP等,但它们打了又打,因为“respond”这样的词有时被标记为NN(名词),而它是动词(VB)

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

您尝试过吗?我的一个朋友在上语言学课程,他们都用它来标记词性。 这是一个Python库。您可以通过软件包管理器
pip
安装

$ pip install -U textblob
使用时

>> from textblob import TextBlob
还有一个更详细的问题。
您也可以安装他们的corpora NLTK。(我不能发布链接,但只是搜索,教程大量存在)

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

其他模型并非严格的概率分布,如神经网络,需要进行训练,但同样的逻辑适用于两者

例如,如果我使用《哈姆雷特》中的标记句来定义我的概率分布,为
莎士比亚
文本制作词性标记,然后尝试对
生物医学
文本进行词性标记,它可能不会很好地执行

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

NLTK中当前性能最好的POS标记器是Perceptron标记器,它是默认的,并使用预先训练的模型。以下是您如何训练自己的模型以提高准确性

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\u tagger.train()
完成
training\u句子
后,您可以使用
perceptron\u tagger.tag()
获得对您的领域更有用、精度更高的
pos\u标记句子

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]
如果操作正确,它们将产生高精度的结果。从中,它们显示以下结果:

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

准确度:0.965636914654
精度:0.965271747376
召回:0.965636914654
F1成绩:0.965368188021

词性标注是一个令人惊讶的难题,考虑到人类这样做看起来是多么容易。POS标记器已经使用许多不同的方法编写,斯坦福标记器是最好的通用英语标记器之一。(请参阅一个相当权威的比较。)因此,如果您建议的方法很好——其中一些很好——那么它们已经在使用了


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

显然,OP知道如何使用POS标记器,但担心准确性。考虑到textblob的一键式方法对实际发生的事情几乎没有控制,我认为这没有任何帮助。PoS标记器是针对手动标记的文本进行培训的,因此他们应该已经知道哪些标记与单词一起出现,以及它们多久出现一次,以及重要的是,哪些标记位于单词前面。准确度取决于算法、训练材料的大小以及训练和测试语料库的相似性(例如体裁和领域)。词性标记并不完美,但如果你的质量真的很差,那么可能会有错误的配置(比如标记的差异)。Thx!我不坚持使用词性标注。基于谷歌的ngram方法会更好吗?也许可以检查动词或名词在这个和那个单词对或单词三元组中是否更频繁。@giorgio79您可以使用一组简化的词性标签,比如只使用名词-动词-其他,但它仍然是词性标签。谷歌n-grams(如果你是这个意思的话)不会有帮助,因为它们没有词性标签。@giorgio79最准确的暴力方法是手动标记词性语料库。机器学习的实现是最先进的approach@giorgio79谢谢,我不知道他们也提供POS标签。我仍然认为这对你没有帮助,因为这些标记是自动预测的——作者估计准确率在95%左右,所以这可能与你已经经历过的类似。@Nathan,你的代码片段看起来像是在对相同的数据进行训练和测试。我肯定你没有犯那个错误,但也许可以扩展代码来说明这一点?