【问题标题】:Improving on the basic, existing GloVe model改进现有的基本 GloVe 模型
【发布时间】:2017-09-22 21:49:07
【问题描述】:

我正在使用 GloVe 作为我研究的一部分。我已经从here 下载了模型。我一直在使用 GloVe 进行句子分类。我正在分类的句子是特定于特定领域的,比如一些 STEM 主题。但是,由于现有的 GloVe 模型是在通用语料库上训练的,因此它们可能无法为我的特定任务产生最佳结果。

所以我的问题是,我将如何加载重新训练的模型并在我自己的语料库上对其进行更多的重新训练以学习我的语料库的语义?如果可能的话,这样做是有好处的。

【问题讨论】:

    标签: nlp text-classification glove


    【解决方案1】:

    经过一番挖掘,我在 git repo 上找到了this issue。有人提出以下建议:

    是的,由于优化设置,这不会很好地工作。但是您可以做的是在您自己的语料库上训练 GloVe 向量,然后将这些向量与预训练的 GloVe 向量连接起来,以便在您的最终应用程序中使用。

    这就是答案。

    【讨论】:

    • 这不会学习预训练语料库中的单词与您的自定义语料库中的单词之间的任何依赖关系吗?
    • @JesseTG 不幸的是。但总比没有好。
    【解决方案2】:

    我相信GloVe(全局向量)不是要附加的,因为它是基于仅在初始训练时才知道的单个语料库的语料库整体单词共现统计数据

    您可以使用gensim.scripts.glove2word2vec api 将 GloVe 向量转换为 word2vec,但我认为您不能继续训练,因为它加载的是 KeyedVector 而不是完整模型

    【讨论】:

      【解决方案3】:

      Mittens 库(可通过 pip 安装)如果您的语料库/词汇不是太大或者您的 RAM 大到足以处理整个共现矩阵,则可以这样做。

      3 步-

      import csv
      import numpy as np
      from collections import Counter
      from nltk.corpus import brown
      from mittens import GloVe, Mittens
      from sklearn.feature_extraction import stop_words
      from sklearn.feature_extraction.text import CountVectorizer
      

      1- 加载预训练模型 - Mittens 需要将预训练模型作为字典加载。从https://nlp.stanford.edu/projects/glove获取预训练模型

      with open("glove.6B.100d.txt", encoding='utf-8') as f:
          reader = csv.reader(f, delimiter=' ',quoting=csv.QUOTE_NONE)
          embed = {line[0]: np.array(list(map(float, line[1:])))
                  for line in reader}
      

      数据预处理

      sw = list(stop_words.ENGLISH_STOP_WORDS)
      brown_data = brown.words()[:200000]
      brown_nonstop = [token.lower() for token in brown_data if (token.lower() not in sw)]
      oov = [token for token in brown_nonstop if token not in pre_glove.keys()]
      

      这里使用棕色语料库作为样本数据集,new_vocab 表示预训练手套中不存在的词汇。共现矩阵是从 new_vocab 构建的。它是一个稀疏矩阵,需要 O(n^2) 的空间复杂度。您可以选择过滤掉稀有的 new_vocab 单词以节省空间

      new_vocab_rare = [k for (k,v) in Counter(new_vocab).items() if v<=1]
      corp_vocab = list(set(new_vocab) - set(new_vocab_rare))
      

      删除那些稀有词并准备数据集

      brown_tokens = [token for token in brown_nonstop if token not in new_vocab_rare]
      brown_doc = [' '.join(brown_tokens)]
      corp_vocab = list(set(new_vocab))
      

      2- 构建共现矩阵: sklearn 的 CountVectorizer 将文档转换为 word-doc 矩阵。 矩阵乘法Xt*X给出了词-词共现矩阵。

      cv = CountVectorizer(ngram_range=(1,1), vocabulary=corp_vocab)
      X = cv.fit_transform(brown_doc)
      Xc = (X.T * X)
      Xc.setdiag(0)
      coocc_ar = Xc.toarray()
      

      3- 微调连指手套模型 - 实例化模型并运行拟合函数。

      mittens_model = Mittens(n=50, max_iter=1000)
      new_embeddings = mittens_model.fit(
          coocc_ar,
          vocab=corp_vocab,
          initial_embedding_dict= pre_glove)
      

      将模型保存为 pickle 以备将来使用。

      newglove = dict(zip(corp_vocab, new_embeddings))
      f = open("repo_glove.pkl","wb")
      pickle.dump(newglove, f)
      f.close()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-09-05
        • 2021-11-30
        • 2017-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-11
        相关资源
        最近更新 更多