spaCy,准备训练数据:doc.char_span 返回“None”

mes*_*s1n 2 python nlp named-entity-recognition spacy spacy-3

我正在按照 spaCy 文档中的说明准备我自己的训练数据(此处)。

\n

我的问题从这一行开始:

\n
span = doc.char_span(start, end, label=label)\n
Run Code Online (Sandbox Code Playgroud)\n

对于我标记为组织(“ORG”)的实体,它似乎工作正常,即它返回一个跨度对象。但是,对于我标记为金钱 (\'MONEY\') 的实体,它返回 None 对象。

\n

这是我的训练集中的两个示例:

\n
(\'Payments from the Guardian, Kings Place, 90 York Way, London N1 9GU, for articles:\', [(18, 26, \'ORG\')]) // Returns a span object for \'Guardian\'\n\n(\'24 July 2020, received \xc3\x82\xc2\xa3100. Hours: 1 hr. (Registered 02 February 2021)\', [(24, 28, \'MONEY\')]) // Returns None for \'\xc2\xa3100\'\n
Run Code Online (Sandbox Code Playgroud)\n

注意:\xc3\x82 出现在控制台中,但它不在原始 json 文本文件中。保留它以防万一它是问题的一部分

\n

有人对我出错的地方有什么建议吗?

\n

[我对 spacy 很陌生(上周开始学习),所以请 ELI5!]

\n

UPDATE: As it seems the \xc3\x82 could be the problem, below is how I\'m loading the data. How do I get rid of the \xc3\x82\'s? (which aren\'t visible in the original file)

\n
with open(\'training_data.json\') as train_data:\n    train_data_json = json.load(train_data)\n
Run Code Online (Sandbox Code Playgroud)\n

pol*_*m23 5

正如其他答案所指出的,您有一个需要解决的编码问题。如果没有看到您的文件,我们无法得知它的编码方式。通常在 Linux 上你可以使用file命令来检查编码(虽然不完美,但相当不错),但 JSON 应该始终是 UTF8,所以这在这里没有帮助。如果您有权访问 JSON 之前的数据源,您可能需要检查一下。

然而除此之外,问题是如果您的跨度无效,也就是说,如果您的字符索引与标记边界不对齐,则会char_span返回。None例如,如果您想在“Tokyo Tower is...”示例中标记“Tokyo”,但给出字符索引 0 和 4(“Toky”),您将得到None

在这种情况下,听起来您有一个需要修复的系统错误,但如果少量注释不好,您可以向函数传递一些选项,告诉它在对齐关闭时扩展或收缩。检查文档以获取更多详细信息。