如何正确恢复使用 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]。我会把问题留在这里,因为它可能对某人有用。