为 OOV 词添加新向量的正确方法

Bal*_*dML 5 python nlp spacy fasttext

我正在使用一些特定于领域的语言,这些语言有很多 OOV 词以及一些拼写错误。我注意到 Spacy 只会为这些 OOV 词分配一个全零向量,所以我想知道处理这个问题的正确方法是什么。如果可能,我感谢对所有这些要点的澄清:

  1. pre-train 命令究竟是做什么的?老实说,我似乎无法正确解析网站上的解释:

使用近似的语言建模目标对管道组件的“令牌到向量”(tok2vec)层进行预训练。具体来说,我们加载预训练向量,并训练像 CNN、BiLSTM 等组件来预测与预训练向量匹配的向量

tok2vec 不是生成向量的部分吗?那么这个命令不应该改变产生的向量吗?加载预训练向量然后训练一个组件来预测这些向量是什么意思?这样做的目的是什么?

--use-vectors 标志有什么作用?--init-tok2vec 标志有什么作用?这是否错误地包含在文档中?

  1. 似乎 pretrain 不是我要找的,它不会改变给定单词的向量。生成一组新的向量的最简单方法是什么,其中包含我的 OOV 单词但仍包含语言的一般知识?

  2. 据我所知,Spacy 的预训练模型使用 fasttext 向量。Fasttext 网站提到:

一个不错的功能是您还可以查询未出现在您的数据中的单词!实际上,单词由其子串的总和表示。只要未知词是由已知子串组成的,就有它的表示!

但似乎 Spacy 不使用此功能。有没有办法仍然将这个用于 OOV 词?

非常感谢

Sof*_* VL 8

我认为对不同的组件存在一些混淆 - 我将尝试澄清:

  1. 分词器不产生向量。它只是一个将文本分割成标记的组件。在 spaCy 中,它是基于规则的且不可训练,并且与向量无关。它查看空格和标点符号来确定哪些是句子中的唯一标记。
  2. nlpspaCy 中的模型可以具有可在Token级别上访问的预定义​​(静态)词向量。具有相同Lexeme 的每个标记 获得相同的向量。某些标记/词素可能确实是 OOV,例如拼写错误。如果要重新定义/扩展模型中使用的所有向量,可以使用类似init-model.
  3. tok2vec层是一个机器学习组件,它学习如何为令牌生成合适的(动态)向量。它通过查看标记的词汇属性来实现这一点,但也可能包括标记的静态向量(参见第 2 项)。该组件通常不单独使用,而是另一个组件的一部分,例如 NER。它将是 NER 模型的第一层,并且可以作为训练 NER 的一部分进行训练,以生成适合您的 NER 任务的向量。

在 spaCy v2 中,您可以先用 训练一个 tok2vec 组件pretrain,然后将该组件用于后续train命令。请注意,两个命令的所有设置都需要相同,以使图层兼容。

回答您的问题:

tok2vec 不是生成向量的部分吗?

如果你的意思是静态向量,那么不。tok2vec 组件在静态向量之上生成新向量(可能具有不同的维度),但不会更改静态向量。

加载预训练向量然后训练一个组件来预测这些向量是什么意思?这样做的目的是什么?

目的是获得一个tok2vec已经从外部向量数据预训练的组件。外部向量数据已经嵌入了标记的一些“含义”或“相似性”,这可以说是转移到tok2vec组件中,该组件学习产生相同的相似性。关键是tok2vec可以在随后的train命令中使用和进一步微调这个新组件(参见第 3 项)

有没有办法仍然将这个用于 OOV 词?

这实际上取决于您的“用途”是什么。正如/sf/answers/4036605961/提到的,你可以自己设置向量,或者你可以实现一个用户钩子决定如何定义token.vector.

我希望这有帮助。在不了解为什么需要 OOV 向量/用例是什么的情况下,我无法真正为您推荐最佳方法。很高兴在评论中进一步讨论!