我正在尝试使用Python中的spaCy模块进行POS标记。
这是我的相同代码
from spacy.en import English, LOCAL_DATA_DIR
import spacy.en
import os
data_dir = os.environ.get('SPACY_DATA', LOCAL_DATA_DIR)
nlp = English(parser=False, tagger=True, entity=False)
def print_fine_pos(token):
return (token.tag_)
def pos_tags(sentence):
sentence = unicode(sentence, "utf-8")
tokens = nlp(sentence)
tags = []
for tok in tokens:
tags.append((tok,print_fine_pos(tok)))
return tags
a = "we had crispy dosa"
print pos_tags(a)
输出:
[(We , u'PRP'), (had , u'VBD'), (crispy , u'NN'), (dosa, u'NN')]
这里它返回crispy作为名词而不是形容词。但是,如果我使用像
这样的测试句子a="we had crispy fries"
它认识到脆皮是一个形容词。这是输出:
[(we , u'PRP'), (had , u'VBD'), (crispy , u'JJ'), (fries, u'NNS')]
我认为在第一种情况下,脆皮没有被标记为形容词的主要原因是因为dosa被标记为'NN',而薯条在第二种情况下被标记为'NNS'。
在第二种情况下,有什么方法可以让我被标记为形容词吗?
答案 0 :(得分:24)
TL;DR: You should accept the occasional error.
详细说明:
Spacy的标记符是统计的,这意味着您获得的标记是基于训练期间显示的数据的最佳估计值。我猜这些数据不包含单词dosa
。标记者不得不猜测,猜错了。没有一种简单的方法可以纠正其输出,因为它没有使用规则或任何您可以轻松修改的内容。该模型已经在标准的英语语料库中进行了训练,这可能与您用于(域)的语言类型完全不同。如果错误率太高,您可以使用特定于域的数据重新训练模型。但这将是非常费力的。问问自己你想要达到的目标,以及PoS标记中3%的错误率是否是你最严重的问题。
一般而言,您不应根据具体情况判断统计系统的表现。现代英语PoS标记符的准确度为around 97%,与普通人类大致相同。你将不可避免地得到一些错误。然而,模型的错误将与人为错误不同,因为两者已经学会了#34;如何以不同的方式解决问题。有时,模型会被你和我认为显而易见的事情弄糊涂,例如:你的榜样。这并不意味着它总体上是不好的,或者PoS标记是你真正的问题。