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。我只是想知道我的方法是否可以,但我对此有点困惑。

4

1 回答 1

3

我们必须更好地记录这一点,但让我尝试解释一下:知识库存储预训练的实体向量。这些向量是实体描述的浓缩版本。虽然这样的描述可以是一个或多个单词(长度可变),但它的向量应该始终具有固定大小。长度为 3 是不现实的,像 64 或 96 这样的长度更有意义。如果我们有,每个实体描述都映射到 96D 空间中,这样我们就可以在更下游的神经网络中使用这些描述。

如您链接的示例所示,您可以使用EntityEncoder创建多词描述到 96D 向量的映射,并且您可以使用嵌入的长度。更大的嵌入意味着您可以捕获更多信息,但也需要更多存储空间。

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

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

另外,我不知道您是否看过这个,但如果您正在寻找一种更现实的方式来运行实体链接,您可以在此处查看用于处理 Wikipedia 和 Wikidata 的脚本。

于 2020-01-23T17:59:38.923 回答