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

如何在Scikit-learn近邻算法中实现自定义Jaro距离度量

解决Scikit-learn NearestNeighbors自定义Jaro距离时的TypeError错误

错误原因

你遇到的TypeError: 'csr_matrix' object cannot be converted to 'PyString',是因为用CountVectorizer将文本转换成稀疏矩阵后,直接传给了需要处理字符串的Jaro距离函数。NearestNeighbors计算时会把矩阵的行向量(csr_matrix对象)传入jaro_distance,但jellyfish.jaro_similarity仅接受字符串参数,导致类型不匹配。

解决方案

不需要将文本转换为数值矩阵,直接使用原始字符串作为模型输入,同时指定近邻算法为brute(因为其他算法仅支持数值型特征)。

修正后的完整代码

import pandas as pd
from sklearn.neighbors import NearestNeighbors
import jellyfish

# Jaro距离函数:返回1减去相似度,符合距离越小越相似的逻辑
def jaro_distance(s1, s2):
    return 1 - jellyfish.jaro_similarity(s1, s2)

# 创建样本和待比对的姓名列表
samples = pd.DataFrame({'NAME':['Saige Fuentes','Bowen Higgins','Kylan Gentry','Amelie Griffith','Jaylen Blackwell']})
namelist = pd.DataFrame({'NAME':['Bowen Higgins','Jaylen Blackwell','Marceline Avila']})

# 初始化近邻模型:指定algorithm='brute'以支持自定义字符串度量
nbrs = NearestNeighbors(n_neighbors=1, metric=jaro_distance, algorithm='brute').fit(namelist['NAME'])

# 直接传入原始字符串进行查询
distances, indices = nbrs.kneighbors(samples['NAME'], n_neighbors=1)

# 验证结果
print("匹配距离:", distances.flatten())
print("匹配的姓名:", namelist.iloc[indices.flatten()]['NAME'].values)

关键修改说明

  1. 移除CountVectorizer:Jaro距离是基于字符串本身的相似度计算,无需将文本转换为词频矩阵,直接使用原始字符串即可。
  2. 添加algorithm='brute':Scikit-learn中只有暴力搜索算法支持非数值型样本和自定义字符串度量,其他基于树的算法(如KDTree)仅适用于数值特征。

内容的提问来源于stack exchange,提问作者Gabriel Choo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 23:30:11