【问题标题】:spaCy, preparing training data: doc.char_span returning 'None'spaCy,准备训练数据:doc.char_span 返回“无”
【发布时间】:2021-12-26 18:52:32
【问题描述】:

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

我的问题从这一行开始:

span = doc.char_span(start, end, label=label)

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

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

('Payments from the Guardian, Kings Place, 90 York Way, London N1 9GU, for articles:', [(18, 26, 'ORG')]) // Returns a span object for 'Guardian'

('24 July 2020, received £100. Hours: 1 hr. (Registered 02 February 2021)', [(24, 28, 'MONEY')]) // Returns None for '£100'

注意: Â 出现在控制台中,但它不在原始 json 文本文件中。留下它以防它成为问题的一部分

有人对我哪里出错有任何建议吗?

[我是 spacy 的新手(上周开始学习),所以请 ELI5!]

更新:似乎 Â 可能是问题所在,下面是我加载数据的方式。我如何摆脱A的? (在原始文件中不可见)

with open('training_data.json') as train_data:
    train_data_json = json.load(train_data)

【问题讨论】:

  • 是的,是 Â 符号导致了问题。可能会更改您加载数据的编码格式或删除任何不需要的符号
  • 当您说 As 在原始文件中不可见时,您在查看它们没有出现的原因是什么?符号 £ 是没有 A 还是其他什么?
  • 我在记事本和可视代码工作室中查看它们。符号是 £,没有 A。

标签: python nlp spacy named-entity-recognition spacy-3


【解决方案1】:

打开文件时遇到编码问题。 MONEY 类型的 tags 上的信息提取上下文无法正常工作,这很可能是因为令牌的开头不是 £

不清楚文件使用的是什么编码,所以首先尝试一些最常见的编码,它们是utf-8iso-8859-1latin1

with open('training_data.json', encoding='utf-8')
    # your logic here

encoding 替换为其他潜在候选人

【讨论】:

  • 谢谢!编码 utf-8 修复了它。
  • 考虑到我首先安装了 spacy 来识别您的问题,因此接受这个答案有点不公平。连同我的评论,建议在此答案前 4 小时更新索引和编码
【解决方案2】:

 符号导致问题。当它存在时,span 返回 None,正如您正确指出的那样。

用于测试的训练数据(注意 'MONEY' 注释的更新索引):

train = [("Tokyo Tower is 333m tall.", [(0, 11, "BUILDING")]),
        ('Payments from the Guardian, Kings Place, 90 York Way, London N1 9GU, for articles:', [(18, 26, 'ORG')]),
        ('24 July 2020, received £100. Hours: 1 hr. (Registered 02 February 2021)', [(23, 27, 'MONEY')])]

您分享的 spacy 文档中的代码:

db = DocBin()
for text, annotations in train:
    doc = nlp(text)
    for start, end, label in annotations:
        span = doc.char_span(start, end, label=label)
        print(span)

输出:

Tokyo Tower
Guardian
£100

【讨论】:

  • 谢谢。 Â 不在原始 json 文件中,但稍后会出现在控制台中。如果它甚至不在原始文件中,您知道我如何摆脱它吗? (我将添加一些代码来展示我是如何加载数据的。)
  • 如果你说这个字符实际上并没有出现,那么如果不能访问文件,就无法真正提供解决方案。您可以指定编码with open('training_data.json', encoding='utf-8')。尝试打开json文件并重新保存等。
  • 谢谢!这行得通!现在所有现金金额都作为跨度类型返回。
【解决方案3】:

正如其他答案所指出的,您有一个需要解决的编码问题。我们不能说你的文件是什么编码而不看它。通常在 Linux 上,您可以使用 file 命令来检查编码(不完美,但非常好),但 JSON 应该始终是 UTF8,所以在这里没有帮助。如果您有权访问 pre-JSON 数据源,您可能需要检查一下。

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

在这种情况下,听起来您有一个需要修复的系统错误,但如果少量注释不好,您可以将选项传递给函数,告诉它在对齐关闭时扩展或收缩.更多详情请查看the docs

【讨论】:

  • 添加 encoding = utf-8 到 with open() 修复它!感谢您的帮助。
猜你喜欢
  • 2018-03-29
  • 2019-09-30
  • 1970-01-01
  • 2021-07-30
  • 1970-01-01
  • 1970-01-01
  • 2015-12-16
  • 2020-04-29
  • 1970-01-01
相关资源
最近更新 更多