我正在使用
TfidfVectorizer
作为文本矢量化器,但当我尝试获取 cosine_similarity
时,我遇到了尺寸不匹配的情况。
我的情况是这样的: 首先,
def clean_text(text):
return re.sub(r'[^a-zA-Z0-9 ]', "", text)
movies['title'] = movies['title'].apply(clean_text)
vectorizer = TfidfVectorizer(ngram_range=(1,2), stop_words ='english')
title_vec = vectorizer.fit_transform(movies['title'])
title = "Toy Story"
title = clean_text(title)
word_vec = vectorizer.transform([title])
similarity = cosine_similarity(word_vec, title_vec)
这会导致错误消息:
ValueError: Incompatible dimension for X and Y matrices: X.shape[1] == 172412 while Y.shape[1] == 156967
PS:我检查了
len
和word_vec
的title_vec
,它们显示的长度不同。
我在矢量化器中设置了 ngram_range=(1,1)
但没有得到积极的结果。
我使用了countvectorizer()
,但问题仍然存在
我别无选择,chatGPT 提供的解决方案并没有解决问题:
from scipy.sparse import hstack
用零填充较小的矩阵
if word_vec.shape[1] > title_vec.shape[1]:
diff = word_vec.shape[1] - title_vec.shape[1]
title_vec = hstack([title_vec, np.zeros((title_vec.shape[0], diff))])
elif title_vec.shape[1] > word_vec.shape[1]:
diff = title_vec.shape[1] - word_vec.shape[1]
word_vec = hstack([word_vec, np.zeros((word_vec.shape[0], diff))])
所以我无法使用上面的代码,但我将其放在这里是为了显示这个问题的严重程度。
感谢您未来的帮助。
以下是处理 TfidfVectorizer 维度不匹配的正确方法:
text_processing.py
# First, fit the vectorizer on your entire corpus
vectorizer = TfidfVectorizer(ngram_range=(1,2), stop_words='english')
title_vec = vectorizer.fit_transform(movies['title'])
# For new input, use the same vectorizer instance
title = "Toy Story"
title = clean_text(title)
word_vec = vectorizer.transform([title])
# Now the dimensions will match and you can compute similarity
similarity = cosine_similarity(word_vec, title_vec)
关键是对两种转换使用相同的向量化器实例。出现此问题的原因是创建新的矢量化器或再次拟合会创建不同的词汇表。
您还可以保存拟合的矢量化器以供以后使用:
save_vectorizer.py
import joblib
# Save the fitted vectorizer
joblib.dump(vectorizer, 'vectorizer.pkl')
# Load it later
loaded_vectorizer = joblib.load('vectorizer.pkl')
此方法可确保所有转换的维数一致,并为文本向量保持相同的特征空间。