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

标签 python nlp spacy fasttext

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

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

  • Pre-train the “token to vector” (tok2vec) layer of pipeline components, using an approximate language-modeling objective. Specifically, we load pretrained vectors, and train a component like a CNN, BiLSTM, etc to predict vectors which match the pretrained ones


    tok2vec 不是生成向量的部分吗?那么这个命令不应该改变产生的向量吗?
    加载预训练向量然后训练一个组件来预测这些向量是什么意思?这样做的目的是什么?
    --use-vectors 标志有什么作用?
    --init-tok2vec 标志有什么作用?这是否错误地包含在文档中?
  • 似乎预训练不是我要找的,它不会改变给定单词的向量。生成包含我的 OOV 词但仍包含语言的一般知识的一组新向量的最简单方法是什么?
  • 据我所知,Spacy 的预训练模型使用 fasttext 向量。 Fasttext 网站提到:

  • A nice feature is that you can also query for words that did not appear in your data! Indeed words are represented by the sum of its substrings. As long as the unknown word is made of known substrings, there is a representation of it!


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

    最佳答案

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

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

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

    Isn't the tok2vec the part that generates the vectors?


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

    What does it mean loading pretrained vectors and then train a component to predict these vectors? What's the purpose of doing this?


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

    Is there a way to still make use of this for OOV words?


    这实际上取决于您的“用途”是什么。如 https://stackoverflow.com/a/57665799/7961860提到,你可以自己设置向量,或者你可以实现一个用户hook这将 decide关于如何定义token.vector .
    我希望这有帮助。在不了解为什么需要 OOV 向量/用例是什么的情况下,我无法真正为您推荐最佳方法。很高兴在评论中进一步讨论!

    关于python - 为 OOV 词添加新向量的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63144230/

    相关文章:

    python - 如何在 Python 中将纪元时间戳舍入到最接近的分钟?

    python - 在 Python 中从大型字典中获取前 3 个最高值的快速有效方法是什么?

    python - 如何使用 python nltk 加速 stanford NER 的 NE 识别

    r - 如何使用或不使用文档术语矩阵来对术语频率数据进行制表?

    python - SpaCy:启用以前禁用的管道

    python - 如何从一列计算两相邻行的总和?

    python - python中的快速数据比较

    python - Scikit SGDClassifier 使用字母而不是单词作为特征

    python - 如何判断句子中是否提到了主题? -自然语言处理

    python - 稀疏句子分词器的跨度