You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 14:30:39