Spacy实体链接 - 词向量

5

我对词向量的工作方式感到非常困惑,特别是在涉及到spacy的实体链接(https://spacy.io/usage/training#entity-linker)时。

在向知识库添加实体时,其中一个参数是entity_vector。你如何得到这个参数?我已经尝试过:

nlp = spacy.load('en_core_web_sm')
kb = KnowledgeBase(vocab = nlp.vocab, entity_vector_length = 96)
for n in m_yentities:
    kb.add_entity(entity = n, freq = ___, entity_vector = **nlp(n).vector**)

这个**代码给了我96长度的向量,所以我用它来作为entity_vector_length,尽管在示例中他们使用了3。我只是想知道我的方法是否可行,但我对此感到有些困惑。

1个回答

3
我们需要更好地记录这一点,但让我试着解释一下:KnowledgeBase 存储预训练的实体向量。这些向量是实体描述的压缩版本。虽然这样的描述可以是一个或多个单词(长度不同),但它的向量应该始终具有固定的大小。长度为 3 是不现实的,类似于 64 或 96 的长度更加合理。如果我们有了这个,每个实体描述就被映射到一个 96D 空间中,以便我们可以在进一步的下游神经网络中使用这些描述。
如你提供的 example 所示,您可以使用 EntityEncoder 来创建这种从多个单词描述到 96D 向量的映射,并且您可以调整嵌入的长度。更大的嵌入意味着可以捕获更多信息,但也需要更多的存储空间。

为实体描述创建这些嵌入向量是一个离线步骤,只需在创建知识库时完成。然后,当您想要训练神经网络进行实体链接时,该网络的大小将取决于您选择的描述嵌入的大小。

直观地说,“实体嵌入”是所有实体描述中单词向量的一种平均压缩版本。

另外,我不知道您是否看过此内容,如果您正在寻找更真实的实体链接运行方式,可以在这里查看处理Wikipedia和Wikidata的脚本。


谢谢!但是如果我没有使用wikidata怎么办?例如,我只想从csv中读取实体作为我的知识库中的实体,然后给它们添加别名。我已经成功创建了一个知识库,并使用“nlp(n).vector”来获取“entity_vector”,其中nlp = 'en_core_web_sm',n是实体的名称。这样做是否合理? - formicaman
好的,所以需要描述,而实体向量是描述的向量表示,而不是实际实体,对吗? - formicaman
啊,"/"语法来自于pathlib库,我发现这是一种非常直观的库,可以以跨平台的方式定义路径。该脚本设置为期望Path变量并将其解析为此类变量,但如果您只复制粘贴其中的部分,则可能需要执行类似于p = Path('yourlocation')的操作,然后您可以将字符串连接到它上面,生成的对象也将是Path类型的。 - Sofie VL
我同意在这方面文档缺乏清晰度。此外,示例链接已经失效。 - iron9
谢谢,链接已修复,文件已重命名。 - Sofie VL
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接