13

我正在尝试使用 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')]

在这里,它以名词而不是形容词的形式返回脆皮。但是,如果我使用像这样的测试句

a="we had crispy fries"

它承认脆皮是一个形容词。这是输出:

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

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

在第二种情况下,有什么方法可以让我变得酥脆以被标记为形容词吗?

4

1 回答 1

26

TL;DR: You should accept the occasional error.

细节:

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

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

于 2015-12-05T12:45:14.140 回答