改进现有的基本 GloVe 模型
Improving on the basic, existing GloVe model
我正在使用 GloVe 作为我研究的一部分。我已经从 here 下载了模型。我一直在使用 GloVe 进行句子分类。我正在分类的句子特定于特定领域,比如一些 STEM 主题。然而,由于现有的 GloVe 模型是在通用语料库上训练的,它们可能无法为我的特定任务产生最佳结果。
所以我的问题是,我将如何加载重新训练的模型并在我自己的语料库上再训练它一点以学习我的语料库的语义?如果可能的话,这样做是有好处的。
经过一番挖掘,我在 git 存储库中找到了 this issue。有人提出以下建议:
Yeah, this is not going to work well due to the optimization setup. But what you can do is train GloVe vectors on your own corpus and then concatenate those with the pretrained GloVe vectors for use in your end application.
这就是答案。
我相信 GloVe(全局向量)不应该被附加,因为它是基于语料库的整体词 co-occurrence 来自仅在初始训练时已知的单个语料库的统计数据
您可以使用 gensim.scripts.glove2word2vec
api 将 GloVe 向量转换为 word2vec,但我不认为您可以继续训练,因为它是在 KeyedVector 中加载的,而不是完整模型
Mittens 库(可通过 pip 安装)如果您的 corpus/vocab 不是太大或者您的 RAM 足以处理整个 co-occurrence 矩阵。
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}
数据pre-processing
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
表示预训练手套中不存在的词汇。 co-occurrence 矩阵是从 new_vocab 构建的。它是一个稀疏矩阵,需要 space 的复杂度 O(n^2)。您可以选择过滤掉罕见的 new_vocab 词以节省 space
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- 建筑 co-occurrence 矩阵:
sklearn 的 CountVectorizer
将文档转换为 word-doc 矩阵。
矩阵乘法 Xt*X
给出 word-word co-occurrence 矩阵。
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- Fine-tuning 连指手套模型 - 实例化模型和 运行 拟合函数。
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()
我正在使用 GloVe 作为我研究的一部分。我已经从 here 下载了模型。我一直在使用 GloVe 进行句子分类。我正在分类的句子特定于特定领域,比如一些 STEM 主题。然而,由于现有的 GloVe 模型是在通用语料库上训练的,它们可能无法为我的特定任务产生最佳结果。
所以我的问题是,我将如何加载重新训练的模型并在我自己的语料库上再训练它一点以学习我的语料库的语义?如果可能的话,这样做是有好处的。
经过一番挖掘,我在 git 存储库中找到了 this issue。有人提出以下建议:
Yeah, this is not going to work well due to the optimization setup. But what you can do is train GloVe vectors on your own corpus and then concatenate those with the pretrained GloVe vectors for use in your end application.
这就是答案。
我相信 GloVe(全局向量)不应该被附加,因为它是基于语料库的整体词 co-occurrence 来自仅在初始训练时已知的单个语料库的统计数据
您可以使用 gensim.scripts.glove2word2vec
api 将 GloVe 向量转换为 word2vec,但我不认为您可以继续训练,因为它是在 KeyedVector 中加载的,而不是完整模型
Mittens 库(可通过 pip 安装)如果您的 corpus/vocab 不是太大或者您的 RAM 足以处理整个 co-occurrence 矩阵。
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}
数据pre-processing
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
表示预训练手套中不存在的词汇。 co-occurrence 矩阵是从 new_vocab 构建的。它是一个稀疏矩阵,需要 space 的复杂度 O(n^2)。您可以选择过滤掉罕见的 new_vocab 词以节省 space
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- 建筑 co-occurrence 矩阵:
sklearn 的 CountVectorizer
将文档转换为 word-doc 矩阵。
矩阵乘法 Xt*X
给出 word-word co-occurrence 矩阵。
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- Fine-tuning 连指手套模型 - 实例化模型和 运行 拟合函数。
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()