如何正确恢复使用 SKLearn 包装器创建的 Word2Vec 模型?
How to properly recover a Word2Vec model created using a SKLearn wrapper?
我正在尝试使用 fit 函数创建并存储一个 gensin Word2Vec 模型,然后将其转换为 SKLearn 管道,对其进行 pickle,以便稍后与 [=21] 一起使用=]对新数据进行转换。
我创建了包装器,但是 self.w2v 对象似乎没有安装并且不识别任何单词。就好像 self.w2v 没见过 any word.
关于如何解决这个问题有什么想法吗?
from sklearn.base import TransformerMixin, BaseEstimator
from gensim.models import Word2Vec
class SentenceVectorizer(TransformerMixin, BaseEstimator):
def __init__(self, vector_size=50):
self.vector_size = vector_size
def sent_vectorizer(self, sentence, vectorizer):
'''
Applies the fitted W2V model for each token of each sentence and returns their vector representation.
'''
sent_vec =[]
numw = 0
for word in sentence:
try:
if numw == 0:
sent_vec = vectorizer.wv[word]
else:
sent_vec = np.add(sent_vec, vectorizer.wv[word])
numw += 1
except: # if word not present
if numw == 0:
sent_vec = np.zeros(self.vector_size)
else:
sent_vec = np.add(sent_vec, np.zeros(self.vector_size))
if numw > 0:
return np.asarray(sent_vec) / numw
else:
return np.zeros(self.vector_size)
def fit(self, X):
self.w2v = Word2Vec(X, vector_size=self.vector_size)
return self
def transform(self, X):
X_vec=[]
for sentence in X:
X_vec.append(self.sent_vectorizer(sentence, self.w2v))
return X_vec
此代码目前在训练中表现良好,但 returns 在推理时将向量置零(因为没有识别出任何单词)。
最有可能的问题:fit 方法没有正确存储 self.w2v,尽管调用 transform 时它似乎存在。
原来我有一个过时的 gensim 版本,它需要 vectorizer[word] 而不是 vectorizer.wv[word]。我会把问题留在这里,因为它可能对某人有用。
我正在尝试使用 fit 函数创建并存储一个 gensin Word2Vec 模型,然后将其转换为 SKLearn 管道,对其进行 pickle,以便稍后与 [=21] 一起使用=]对新数据进行转换。
我创建了包装器,但是 self.w2v 对象似乎没有安装并且不识别任何单词。就好像 self.w2v 没见过 any word.
关于如何解决这个问题有什么想法吗?
from sklearn.base import TransformerMixin, BaseEstimator
from gensim.models import Word2Vec
class SentenceVectorizer(TransformerMixin, BaseEstimator):
def __init__(self, vector_size=50):
self.vector_size = vector_size
def sent_vectorizer(self, sentence, vectorizer):
'''
Applies the fitted W2V model for each token of each sentence and returns their vector representation.
'''
sent_vec =[]
numw = 0
for word in sentence:
try:
if numw == 0:
sent_vec = vectorizer.wv[word]
else:
sent_vec = np.add(sent_vec, vectorizer.wv[word])
numw += 1
except: # if word not present
if numw == 0:
sent_vec = np.zeros(self.vector_size)
else:
sent_vec = np.add(sent_vec, np.zeros(self.vector_size))
if numw > 0:
return np.asarray(sent_vec) / numw
else:
return np.zeros(self.vector_size)
def fit(self, X):
self.w2v = Word2Vec(X, vector_size=self.vector_size)
return self
def transform(self, X):
X_vec=[]
for sentence in X:
X_vec.append(self.sent_vectorizer(sentence, self.w2v))
return X_vec
此代码目前在训练中表现良好,但 returns 在推理时将向量置零(因为没有识别出任何单词)。
最有可能的问题:fit 方法没有正确存储 self.w2v,尽管调用 transform 时它似乎存在。
原来我有一个过时的 gensim 版本,它需要 vectorizer[word] 而不是 vectorizer.wv[word]。我会把问题留在这里,因为它可能对某人有用。