我正在尝试遵循此处的示例:https ://github.com/explosion/spaCy/tree/master/bin/wiki_entity_linking 。但我只是对训练数据中的内容感到困惑。都是维基百科的吗?假设我只需要一些实体的训练数据。例如,E1、E2 和 E3。该示例是否允许我仅指定几个我想消除歧义的实体?
1 回答
[更新] 请注意,此代码库已移至https://github.com/explosion/projects/tree/master/nel-wikipedia (spaCy v2)
如果您按照https://github.com/explosion/spaCy/tree/master/bin/wiki_entity_linking中提供的方式运行脚本,它们确实会从 Wikipedia 创建一个训练数据集,您可以使用它来训练通用模型。
如果你想训练一个更有限的模型,当然你可以输入你自己的训练集。可以在此处找到一个玩具示例:https ://github.com/explosion/spaCy/blob/master/examples/training/train_entity_linker.py ,您可以在其中推断训练数据的格式:
def sample_train_data():
train_data = []
# Q2146908 (Russ Cochran): American golfer
# Q7381115 (Russ Cochran): publisher
text_1 = "Russ Cochran his reprints include EC Comics."
dict_1 = {(0, 12): {"Q7381115": 1.0, "Q2146908": 0.0}}
train_data.append((text_1, {"links": dict_1}))
text_2 = "Russ Cochran has been publishing comic art."
dict_2 = {(0, 12): {"Q7381115": 1.0, "Q2146908": 0.0}}
train_data.append((text_2, {"links": dict_2}))
text_3 = "Russ Cochran captured his first major title with his son as caddie."
dict_3 = {(0, 12): {"Q7381115": 0.0, "Q2146908": 1.0}}
train_data.append((text_3, {"links": dict_3}))
text_4 = "Russ Cochran was a member of University of Kentucky's golf team."
dict_4 = {(0, 12): {"Q7381115": 0.0, "Q2146908": 1.0}}
train_data.append((text_4, {"links": dict_4}))
return train_data
此示例train_entity_linker.py
向您展示了模型如何学习区分“Russ Cochran”高尔夫球手 ( Q2146908
) 与发布者 ( Q7381115
) 的歧义。请注意,这只是一个玩具示例:一个实际的应用程序需要一个更大的知识库和准确的先验频率(正如您可以通过运行 Wikipedia/Wikidata 脚本获得的那样),当然您需要更多的句子和词汇种类来期望机器学习模型,用于拾取适当的线索并有效地泛化到看不见的文本。