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

5

我正在使用一些具有许多OOV单词和拼写错误的领域特定语言。我注意到Spacy会为这些OOV单词分配一个全零向量,所以我想知道正确处理方式是什么。如果可能的话,请对所有这些问题进行澄清:

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

使用近似语言建模目标来预训练管道组件的“token to vector”(tok2vec)层。具体而言,我们加载预先训练的向量,并训练像CNN、BiLSTM等组件来预测与预训练向量相匹配的向量

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

--use-vectors标志是什么意思? --init-tok2vec标志是什么意思?这在文档中包含错误吗?

  1. 似乎pretrain不是我要寻找的,它不会改变给定单词的向量。有什么最简单的方法可以生成一个新的向量集,包括我的OOV单词,但仍包含语言的通用知识?

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

一个很好的特性是,您还可以查询未出现在数据中的单词!事实上,单词由其子字符串的总和表示。只要未知单词由已知子串组成,就存在其表示形式!

但是似乎Spacy没有使用此功能。是否有办法仍然利用这种方法处理OOV单词?

非常感谢。


也许这个答案可以帮到你:https://stackoverflow.com/questions/57658888/how-to-specify-word-vector-for-oov-terms-in-spacy - Stefano Fiorucci - anakin87
谢谢Anakin,确实帮助我澄清了一些方面,但是大部分问题仍然没有得到解答。 - BaldML
1个回答

14

我认为有些组件存在一些混淆 - 我会尝试澄清:

  1. 分词器不会生成向量。它只是将文本分割成标记的组件。在spaCy中,它是基于规则而非可训练的,并且与向量无关。它通过查看空格和标点来确定句子中独特的标记。
  2. 在spaCy中,nlp模型可以具有预定义(静态)的单词向量,这些向量可以在Token级别访问。每个具有相同词元的标记都获得相同的向量。一些标记/词元可能确实是OOV,例如拼写错误。如果要重新定义/扩展模型中使用的所有向量,可以使用类似init-model(在spaCy v3中为init vectors)的东西。
  3. tok2vec层是一个机器学习组件,它学习如何为标记生成适当的(动态)向量。它通过查看标记的词汇属性来实现此目的,但也可以包括标记的静态向量(参见第2项)。该组件通常不会单独使用,而是作为其他组件的一部分,例如NER。它将是NER模型的第一层,可以在训练NER时进行训练,以生成适合您的NER任务的向量。
在spaCy v2中,您可以使用pretrain先训练tok2vec组件,然后在随后的train命令中使用此组件。请注意,在两个命令中所有设置都需要相同,以使层兼容。
回答您的问题:

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

如果您指的是静态向量,请注意,tok2vec组件会在静态向量之上产生新的向量(可能具有不同的维度),但它不会改变静态向量本身。

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

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

还有没有办法用于OOV单词?

这真的取决于你的“用途”是什么。正如https://stackoverflow.com/a/57665799/7961860所提到的,你可以自己设置向量,或者实现用户hook,它将决定如何定义token.vector

我希望这能帮到你。如果不了解为什么需要OOV向量/你的用例是什么,我无法真正地为你推荐最佳方法。欢迎在评论中进一步讨论!


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