MeanEmbeddingVectorizer对象无transform属性报错问题排查
问题背景
当前在开展文本分类相关工作,使用的数据集包含2列:一列为文本内容,另一列为对应分类标签。作为初学者跟随Word2Vec教程实操验证方案适配场景时,运行代码持续出现报错。
原有实现代码
class MeanEmbeddingVectorizer(object): def __init__(self, word2vec): self.word2vec = word2vec # if a text is empty we should return a vector of zeros # with the same dimensionality as all the other vectors self.dim = len(next(iter(word2vec.values()))) def fit(self, X, y): return self def transform(self, X): return np.array([ np.mean([self.word2vec[w] for w in words if w in self.word2vec] or [np.zeros(self.dim)], axis=0) for words in X ]) train_df['clean_text_tok']=[nltk.word_tokenize(i) for i in train_df['clean_text']] model = Word2Vec(train_df['clean_text_tok'],min_count=1) w2v = dict(zip(model.wv.index_to_key, model.wv.vectors)) modelw = MeanEmbeddingVectorizer(w2v) # converting text to numerical data using Word2Vec X_train_vectors_w2v = modelw.transform(X_train_tok) X_val_vectors_w2v = modelw.transform(X_test_tok)
运行报错信息
Dimension: 100 --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-127-289141692350> in <module> 4 modelw = MeanEmbeddingVectorizer(w2v) 5 # converting text to numerical data using Word2Vec ----> 6 X_train_vectors_w2v = modelw.transform(X_train_tok) 7 X_val_vectors_w2v = modelw.transform(X_test_tok) AttributeError: 'MeanEmbeddingVectorizer' object has no attribute 'transform'
报错原因
核心问题是Python类定义的缩进错误。
定义MeanEmbeddingVectorizer类时,fit()和transform()两个方法没有和类内的__init__()方法保持同一缩进层级,二者实际被定义为了独立的全局函数,不属于MeanEmbeddingVectorizer类的成员方法。因此实例化类对象后调用transform()时,会提示对象不存在该属性。
修复方案
调整fit()、transform()方法的缩进,将两个方法纳入MeanEmbeddingVectorizer类的定义范围内,修正后的类定义代码如下:
class MeanEmbeddingVectorizer(object): def __init__(self, word2vec): self.word2vec = word2vec # 空文本返回与其他向量维度一致的零向量 self.dim = len(next(iter(word2vec.values()))) def fit(self, X, y): return self def transform(self, X): return np.array([ np.mean([self.word2vec[w] for w in words if w in self.word2vec] or [np.zeros(self.dim)], axis=0) for words in X ])
重新运行修正后的类定义代码,再执行后续的文本向量化逻辑即可解决该报错。
内容的提问来源于stack exchange,提问作者Gabry
相关产品推荐
相关产品推荐

