关于 spaCy NER 的训练数据



我是NLP的新手。 现在我正在尝试创建NER模型,用于从某些文本中提取音乐艺术家的名字。 但进展并不顺利。这就是我所做的。

  1. 我得到了150万艺术家的名字名单。

  2. 我用字符串模板创建了训练数据,就像这个"{艺术家的名字}太恶心了"。 所有 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. 但我根本没有工作。所有句子均被提取为艺术家。 下面是示例。在这种情况下,"克里斯·托马斯·金"是艺术家的名字。

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

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

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

要生成训练数据,请执行以下操作:

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

完成此操作后,可以使用训练数据训练模型。

编辑

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

如果你所有的训练数据都是同一个句子,但有不同的艺术家名字,例如"[艺术家]病得很重",你需要在训练数据中有更多的多样性。

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

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

最新更新