使用 spaCy 进行 POS 标记

POS tagging using spaCy

我正在尝试使用 Python 中的 spaCy 模块进行词性标记。

这是我的代码

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')]

在这里 returns crispy 作为名词而不是形容词。但是,如果我使用

这样的测试语句
a="we had crispy fries"

它识别出 crispy 是一个形容词。这是输出:

[(we , u'PRP'), (had , u'VBD'), (crispy , u'JJ'), (fries, u'NNS')]

我认为第一种情况下 crispy 没有被标记为形容词的主要原因是因为 dosa 被标记为 'NN' 而 fries 在第二种情况中被标记为 'NNS'。

有什么方法可以让 crispy 在第二种情况下也被标记为形容词吗?

TL;DR: You should accept the occasional error.

详情:

Spacy 的标记器是统计性的,这意味着您获得的标记是它根据训练期间显示的数据做出的最佳估计。我猜这些数据不包含 dosa 这个词。标注者不得不猜测,结果猜错了。没有一种简单的方法来更正其输出,因为它没有使用规则或任何您可以轻松修改的内容。该模型已经在标准的英语语料库上进行了训练,这可能与您使用它的语言类型(领域)大不相同。如果错误率对于您的目的来说太高,您可以使用特定领域的数据重新训练模型。但这将非常费力。问问自己,您正在努力实现什么,以及 PoS 标记中 3% 的错误率是否是您遇到的最糟糕的问题。

一般来说,您不应该根据具体情况来判断统计系统的性能。现代英语词性标注器的准确率是 around 97%,与普通人大致相同。您将不可避免地遇到一些错误。然而,模型的错误不会与人为错误相同,因为两者有 "learnt" 如何以不同的方式解决问题。有时模型会被你我认为显而易见的事情弄糊涂,例如你的例子。这并不意味着它总体上很糟糕,或者 PoS 标记才是你真正的问题。