为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PIPIONE 2023-04-11 15:37:55
我正在使用一些特定领域的语言,其中有很多 OOV 词以及一些拼写错误。我注意到 Spacy 只会为这些 OOV 词分配一个全零向量,所以我想知道处理这个问题的正确方法是什么。如果可能的话,我感谢对所有这些要点的澄清:预训练命令到底做了什么?老实说,我似乎无法正确解析网站上的解释:使用近似的语言建模目标预训练流水线组件的“令牌到向量”(tok2vec) 层。具体来说,我们加载预训练向量,并训练像 CNN、BiLSTM 等组件来预测与预训练向量匹配的向量tok2vec 不是生成向量的部分吗?那么这个命令不应该改变产生的向量吗?加载预训练向量然后训练一个组件来预测这些向量是什么意思?这样做的目的是什么?--use-vectors 标志有什么作用?--init-tok2vec 标志有什么作用?这是否被错误地包含在文档中?似乎 pretrain 不是我要找的,它不会改变给定单词的向量。生成包含我的 OOV 单词但仍包含该语言的一般知识的一组新向量的最简单方法是什么?据我所知,Spacy 的预训练模型使用的是快速文本向量。Fasttext网站提到:一个不错的功能是您还可以查询未出现在您的数据中的单词!事实上,单词是由其子串的总和表示的。只要未知单词是由已知子串组成的,就有它的表示!但似乎 Spacy 没有使用此功能。有没有办法仍然将它用于 OOV 词?多谢
查看完整描述

1 回答

?
SMILET

TA贡献1796条经验 获得超4个赞

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

  1. 分词器不产生向量。它只是一个将文本分割成标记的组件。在 spaCy 中,它是基于规则的,不可训练,与向量没有任何关系。它查看空格和标点符号以确定哪些是句子中的独特标记。

  2. spaCy 中的模型nlp可以具有预定义的(静态)词向量,这些词向量可在级别上访问Token。具有相同 Lexeme的每个标记都获得相同的向量。一些标记/词素可能确实是 OOV,比如拼写错误。如果你想重新定义/扩展模型中使用的所有向量,你可以使用类似的东西init-modelinit vectors在 spaCy v3 中)。

  3. tok2vec层是一个机器学习组件,它学习如何为令牌生成合适的(动态)向量。它通过查看令牌的词法属性来完成此操作,但也可能包括令牌的静态向量(参见第 2 项)。该组件通常不单独使用,而是作为另一个组件的一部分,例如 NER。它将是 NER 模型的第一层,它可以作为训练 NER 的一部分进行训练,以生成适合您的 NER 任务的向量。

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

回答你的问题:

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

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

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

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

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

这真的取决于你的“用途”是什么。

查看完整回答
反对 回复 2023-04-11
  • 1 回答
  • 0 关注
  • 71 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信