我进行了很多搜索,但无法找到解决我的问题的方法……我正在训练一个 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 模型可能对我没有帮助,只有依赖部分)。
接受任何建议,谢谢。