scikit-learn中CountVectorizer报'transform not found' AttributeError的原因排查
scikit-learn中CountVectorizer报'transform not found' AttributeError的原因排查
嘿,我一眼就瞅出你代码里的问题啦!咱们来拆解下为啥会出现这个AttributeError: 'csr_matrix' object has no attribute 'transform'的报错。
问题根源:把特征矩阵当成了CountVectorizer实例
你看这段代码:
vectorizer = CountVectorizer().fit_transform([' '.join(intent) for intent in intents.values()])
这里犯了一个很容易踩的坑:fit_transform()方法的返回值是文本被特征化后的稀疏矩阵(scipy.sparse.csr_matrix类型),而不是CountVectorizer类的实例对象。
也就是说,你现在的vectorizer变量根本不是一个可以调用transform方法的工具,而是一堆数值组成的矩阵,自然就会报错说找不到transform方法啦!
修正方案:把实例化、拟合、转换分开做
咱们需要把CountVectorizer的初始化、拟合语料、转换语料这三个步骤拆开来,这样才能保留住可以处理新文本的实例对象:
# 1. 先创建CountVectorizer的实例,这才是真正的"转换器" vectorizer = CountVectorizer() # 2. 准备我们的意图语料,把每个意图下的句子拼接成字符串 corpus = [' '.join(intent) for intent in intents.values()] # 3. 让vectorizer拟合语料,学习语料中的词汇表等信息 vectorizer.fit(corpus) # 4. 把语料转换成特征矩阵,用来后续计算相似度 corpus_vect = vectorizer.transform(corpus)
然后,咱们还要修改get_intent函数,因为现在计算余弦相似度需要对比的是corpus_vect(语料的特征矩阵),而不是vectorizer实例:
def get_intent(text, vectorizer, corpus_vect): text_vect = vectorizer.transform([preprocess(text)]) sim_scores = cosine_similarity(text_vect, corpus_vect) intent_keys = list(intents.keys()) index = np.argmax(sim_scores) if sim_scores[0][index] < 0.5: return 'Não entendi' else: return intent_keys[index]
小提示
以后用scikit-learn的各种转换器(比如CountVectorizer、TfidfVectorizer)的时候,一定要分清:
- 实例对象:比如
vectorizer = CountVectorizer(),它包含模型的配置和学习到的参数(比如词汇表),拥有fit、transform这些方法; - 特征矩阵:
fit_transform()或者transform()返回的结果,是纯数值数据,没有模型相关的方法。
备注:内容来源于stack exchange,提问作者Guilherme Andrade
相关产品推荐
相关产品推荐

