更新spaCy词汇表

时间:2017-04-20 15:48:51

标签: python word2vec spacy

我想知道是否可以更新spacys默认词汇表。我正在尝试做的是:

  • 使用gensim在我自己的语料库上运行word2vec
  • 使用nlp.vocab.load_vectors_from_bin_loc(\path)
  • 将矢量加载到我的模型中

但由于我的语料库中的很多单词都不是默认词汇,我无法使用导入的向量。是否有(简单)方法添加缺少的类型?

修改
我意识到混合矢量可能会有问题。所以我的问题是:
如何将自定义词汇表导入spacy?

1 个答案:

答案 0 :(得分:2)

这在下一个版本中会更容易,本周应该出来了 - 我刚刚完成测试。现在:

默认情况下,spaCy会加载data / vocab / vec.bin文件,其中“data”目录位于spacy.en模块目录中 使用spacy.vocab.write_binary_vectors从bz2文件创建vec.bin文件 要么替换spaCy的vec.bin文件,要么在运行时调用nlp.vocab.load_rep_vectors,并指向二进制文件的路径。 上面的内容有点不方便,但二进制文件格式要小得多,加载速度也快,而矢量文件也相当大。请注意,GloVe以gzip格式分发,而不是bzip。

出于兴趣:您使用的是GloVe向量,还是您使用自己的数据训练过的东西?如果你自己的数据,你使用Gensim?我想让这更容易,所以我很欣赏您希望看到的工作流程的建议。

在运行时加载新向量,可选择转换它们

    import spacy.vocab

    def set_spacy_vectors(nlp, binary_loc, bz2_loc=None):
        if bz2_loc is not None:
            spacy.vocab.write_binary_vectors(bz2_loc, binary_loc)
        write_binary_vectors(bz2_input_loc, binary_loc)

        nlp.vocab.load_rep_vectors(binary_loc)

替换vec.bin,因此默认情况下会加载矢量

from spacy.vocab import write_binary_vectors
    import spacy.en

    from os import path

    def main(bz2_loc):
        bin_loc = path.join(path.dirname(spacy.en.__file__), 'data', 'vocab', 'vec.bin')
        write_binary_vectors(bz2_loc, bin_loc)

if __name__ == '__main__':
    plac.call(main)