使用spaCy进行词性标注

2024-06-26 01:35:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用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"

它认识到crispy是一个形容词。输出如下:

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

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

在第二种情况下,我有没有办法把crispy也标记为形容词呢?


Tags: 标记posimportdatatagsnnsentencewe
1条回答
网友
1楼 · 发布于 2024-06-26 01:35:45

TL;DR: You should accept the occasional error.

详细信息:

Spacy的标签是统计的,这意味着你得到的标签是基于训练期间显示的数据的最佳估计。我猜这些数据中没有dosa这个词。标记人不得不猜测,而且猜错了。没有一种简单的方法可以更正它的输出,因为它没有使用规则或任何您可以轻松修改的内容。这个模型是在一个标准的英语语料库上训练的,它可能与你所使用的语言(领域)大不相同。如果错误率对于您的目的来说太高,您可以使用特定于域的数据重新训练模型。不过,这将非常辛苦。问问你自己你想达到什么目标,3%的词性标注错误率是否是你最糟糕的问题。

一般来说,你不应该根据具体情况来判断统计系统的性能。现代英语词性标记的准确度是around 97%,与普通人大致相同。你不可避免地会犯一些错误。然而,模型中的错误并不等同于人为错误,因为两人已经“学会”了如何以不同的方式解决问题。有时模型会被你和我认为显而易见的事情弄糊涂,比如你的例子。这并不意味着它是坏的整体,或词性标记是你真正的问题。

相关问题 更多 >