Jupyter内核执行NumPy相似度计算时崩溃,如何解决?
问题排查与解决方法
可能原因1:向量维度/形状不兼容
np.inner处理二维数组时的逻辑和矩阵乘法不同,如果rasa_vector和user_vector的形状不匹配,会触发计算异常甚至内核崩溃。比如一个是(n, 300)、另一个是(m, 300),直接用np.inner会生成(n,m)矩阵,后续除法若维度对齐失败,会引发内存或计算错误。
解决方法:
- 先确认向量形状:
print(rasa_vector.shape, user_vector.shape) - 改用矩阵乘法实现两两余弦相似度,逻辑更清晰且不易出错:
# 计算分子:矩阵点积 dot_product = np.dot(rasa_vector, user_vector.T) # 计算分母:各自L2范数的外积 norm_product = np.outer(np.linalg.norm(rasa_vector, axis=1), np.linalg.norm(user_vector, axis=1)) # 添加极小值避免除以0 similarity_scores = dot_product / (norm_product + 1e-8)
可能原因2:内存不足触发崩溃
de_core_news_lg生成的向量是300维,若DataFrame数据量过大(几万/几十万条),计算过程会占用大量内存,Windows下Jupyter内核的内存限制被触发,直接崩溃。
解决方法:
- 分批处理数据,减少单次计算的内存占用:
batch_size = 1000 similarity_list = [] for i in range(0, len(rasa_vector), batch_size): batch_rasa = rasa_vector[i:i+batch_size] dot = np.dot(batch_rasa, user_vector.T) norm_r = np.linalg.norm(batch_rasa, axis=1).reshape(-1,1) norm_u = np.linalg.norm(user_vector, axis=1).reshape(1,-1) sim = dot / (norm_r * norm_u + 1e-8) similarity_list.append(sim) similarity_scores = np.concatenate(similarity_list, axis=0) - 降低向量维度:改用轻量spaCy模型(如
de_core_news_md/sm),或用PCA降维:from sklearn.decomposition import PCA pca = PCA(n_components=100) # 降到100维 rasa_vector_pca = pca.fit_transform(rasa_vector) user_vector_pca = pca.transform(user_vector) # 用降维后的向量计算相似度
可能原因3:numpy与环境兼容性bug
Python3.9.12搭配的numpy版本可能存在Windows下的内存管理bug,导致矩阵运算时内核崩溃。
解决方法:
- 升级/降级numpy到适配Python3.9的稳定版本:
# 升级到兼容稳定版 pip install --upgrade numpy==1.26.4 # 或降级到适配Python3.9的版本 pip install numpy==1.21.6 - 换IPython终端测试代码,如果终端运行正常,说明是Jupyter内核问题,重新安装内核:
pip install --upgrade ipykernel python -m ipykernel install --user
可能原因4:零向量导致除以零
若文本生成的向量是全零(比如空文本、无意义噪声),np.linalg.norm会返回0,触发除以零错误,极端情况下直接导致内核崩溃(而非普通Python异常)。
解决方法:
- 计算前过滤零向量,或给分母加极小值避免除以零:
# 过滤零向量 rasa_non_zero = rasa_vector[np.linalg.norm(rasa_vector, axis=1) > 1e-8] user_non_zero = user_vector[np.linalg.norm(user_vector, axis=1) > 1e-8] # 或直接在计算时加极小值 similarity_scores = np.inner(rasa_vector, user_vector) / (np.linalg.norm(rasa_vector, axis=1) * np.linalg.norm(user_vector, axis=1) + 1e-8)
内容的提问来源于stack exchange,提问作者klam
相关产品推荐
相关产品推荐

