【问题标题】:About training data for spaCy NER关于 spaCy NER 的训练数据
【发布时间】:2020-07-05 04:37:24
【问题描述】:

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

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

  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. 但我根本没有工作。所有句子都被提取为 ARTIST。 下面是例子。在这种情况下,“克里斯·托马斯·金”是艺术家的名字。

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.5M)。然后它逐渐让模型学习一些额外的名称。

标签: nlp spacy training-data


【解决方案1】:

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

生成训练数据:

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

一旦完成,您就可以使用训练数据来训练您的模型。

编辑

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

【讨论】:

  • 感谢您的评论!听起来真好!但是您是否期望我有 30k 个包含艺术家姓名的例句? ``` ・我非常喜欢Taylor swift ・都市女孩刚刚发布他们的新歌!・Nirvana 是摇滚史上最伟大的乐队之一。等等...30k 句 ``` 不幸的是,我没有。我只有 150 万艺术家名单。我想我已经了解 spaCy Matcher。你认为我还应该使用这种方法吗?
  • 你希望我有 30k 个包含艺术家姓名的例句吗?不,我不希望你有 30k 句子。您需要大约 1k 到 2k 个带有艺术家姓名的句子。然后您可以使用匹配器来检测这些句子中的艺术家姓名。您需要记住,这 150 万个艺术家姓名应该包含您希望在您“注释”的 1k-2k 句子中检测到的艺术家的姓名
  • 我在 EDIT 下的原始帖子中添加了更深入的解释。
  • 看起来真不错。谢谢你的来信!你的意思是我只需要收集 1k-2k 样本数据?我的问题是如果我让模型学习 1k-2k 数据,模型是否有可能提取 150 万艺术家姓名?
  • 是的。有可能,但我不能肯定地给你答案。你必须测试。您必须了解该模型不知道所有名称,它试图概括。因此,如果泛化不好,您可能需要使用更多数据进行训练。
【解决方案2】:

如果您的所有训练数据都是同一个句子,但艺术家姓名不同,例如“[艺术家] 病得很厉害”,您的训练数据需要更加多样化。

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

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

【讨论】:

  • 谢谢你告诉我! > 您需要更多种类的训练数据。我认为这很重要。我将尝试使用多种模板创建训练数据。 > 你需要的不是很多艺术家的名字,而是很多不同的句子和不同的词。你的意思是即使模型没有学习特定的名字(比如说“Taylor swift”)模型也有可能学习很多没有“Taylor swift”这个词的不同句子然后模型可以提取“Taylor swift”?
  • 你的意思是即使模型没有学习特定的名字也是可能的(比如说“Taylor swift”)模型学习了很多没有“Taylor swift”这个词的不同句子然后模型可以提取“Taylor swift” “? -
  • 太棒了……!我在想NER需要让模型学习特定的名称(例如Taylor Swift)。如果我不这样做,模型永远不会提取名称。我明白了。谢谢你告诉我!
猜你喜欢
  • 2021-07-30
  • 2018-05-06
  • 2020-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-08
  • 1970-01-01
相关资源
最近更新 更多