关于 spaCy NER 的训练数据

About training data for spaCy NER

我是 NLP 新手。 现在我正在尝试创建 NER 模型以从一些文本中提取音乐艺术家的名字。 但它并没有消失 well.This 是我所做的。

  1. 我得到了1500,000个艺术家的名单

  2. 我用字符串 template.like 创建了训练数据,这个“{artist's name} is so sick.” 所有1500,000个训练数据都是这样的字符串。

TRAIN_DATA = [
    ("Nirvana is so sick", {"entities": [(0, 7, "ARTIST")]}),
    ("City girls is so sick", {"entities": [(0, 10, "ARTIST")]}),
    ("Taylor swift is so sick", {"entities": [(0, 12, "ARTIST")]}),
]

(也许这就是进展不顺利的原因?)

  1. 我训练了30,000个数据后使用了这个模型

  2. 但我没有工作all.All句子被提取为ARTIST。 下面是例子。 'Chris Thomas King' 在这种情况下是艺术家的名字。

Entities [('Not sure how they handled it during filming, but Tim Blake Nelson did sing his own parts (as did Chris Thomas King).', 'ARTIST')]

你有什么想法吗? 提前致谢。

如果你所有的训练数据都是同一句话但有不同的艺术家名字,例如“[artist] 病得很重”,你的训练数据需要更多样。

例如,“这首歌是[艺术家]的”、“[艺术家]因这首歌获得了艾美奖”、“这是[艺术家]有史以来最好的歌曲吗?”。仅通过替换一句话中的艺术家姓名来生成训练数据是行不通的。

你需要的不是很多艺术家的名字,而是很多不同的句子和不同的词。

我会以不同的方式处理这个问题。在我看来,你生成训练数据的方式是有偏见的。以下是我将遵循的生成训练数据的步骤。

生成训练数据:

  1. 从您拥有的艺术家姓名列表开始,并初始化一个 PhraseMatcher。有关如何执行此操作的详细信息,请参阅 here
  2. 然后,使用匹配器在你的句子中标记艺术家的名字(你有 30k 个句子)
  3. 您找到匹配的句子,select 说了 2k 个。每场比赛都有比赛的开始和结束索引。使用它来生成训练数据,即 TRAIN_DATA

完成后,您可以使用训练数据训练您的模型。

编辑

  1. 您有 150 万个艺术家名字
  2. 接下来,您现在需要考虑“我希望我的模型在什么上下文中检测这些名称?”
  3. 一旦你对 2 有了答案,就可以生成训练数据了。您应该在希望它们检测名称的类似上下文中训练您的模型。例如:
    • 如果您希望您的模型检测新闻标题中的艺术家姓名,您应该收集 1k 到 2k 个包含艺术家姓名的新标题。
    • 如果你想让你的模型检测 reddit 评论中的名字,你应该得到 1k 到 2k 的 reddit 评论,其中有艺术家的名字。
    • 你怎么知道这些是否有你问的艺术家名字?你有150万的艺人名字,你可以查字典来验证。
  4. 现在您已经设置了上下文和大量训练数据集,是时候“注释”数据了。
  5. 标注的方式有很多种
    1. 使用注释软件、Doccano、Prodigy 等手动注释
    2. 使用 PhraseMatcher 来匹配检测艺术家的名字,就像您在 (3) 中所做的那样。
  6. 现在你有了带注释的数据;是时候训练模型了。
  7. 瞧,大功告成,现在手头有了一个通用模型。
  8. 对结果还不满意?
    • 添加更多训练数据,转到 (3),重复