使用 spaCy 依赖树提高 NER 模型的准确性

数据挖掘 nlp nltk 命名实体识别 斯派西
2022-02-17 14:17:44

我进行了很多搜索,但无法找到解决我的问题的方法……我正在训练一个 NER 模型,它应该检测两种类型的单词:指令和条件。这不是 NER 的标准用例,因为它不搜索特定类型的单词(例如 Google == Corporation),而是更多地依赖于句子结构。

例如:如果汽车发生碰撞,安全气囊应该熄灭

  • “崩溃”应标记为:“条件”
  • 'go' 应该标记为:“instruction”

在训练模型时,我想为每个句子不仅提供我的注释,还提供由“en_core_web_sm”模型计算的句子的依赖树。我希望我的模型不仅可以根据给定的单词进行训练,还可以根据句子结构进行训练。

我的训练数据目前看起来像这样,但我想通过添加使用“en_core_web_sm”模型生成的每个句子的依赖树来扩展它:

train_data = 
    ("If the car crashes, the airbag should activate", [(11, 17, 'CON'), (38, 46, 'INS')]),
    ...
]

这是我当前的训练循环,使用 spaCy 的更新功能,但我愿意尝试不同的工具:

import random 
import datetime as dt
from spacy.util import minibatch, compounding
from spacy.util import decaying

dropout = decaying(0.6, 0.2, 1e-4)

nlp = create_blank_nlp(TRAIN_DATA)
optimizer = nlp.begin_training()
for i in range(80):
    losses = {}
    batches = minibatch(TRAIN_DATA, size=compounding(4.0, 32.0, 1.001))
    for batch in batches:
        texts, annotations = zip(*batch)
        nlp.update(
            texts,               # batch of texts
            annotations,         # batch of annotations
            drop=next(dropout),  # dropout
            losses=losses,
        )
    print(f"Losses at iteration {i} - {dt.datetime.now()} {losses}")

我很好奇这是否以及如何可能。不使用预训练模型感觉像是一种浪费(请注意,来自 spaCy 的预训练 NER 模型可能对我没有帮助,只有依赖部分)。

接受任何建议,谢谢。

0个回答
没有发现任何回复~