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

如何在Python中比较非英文语言字符串的相似度——解决Jellyfish库jaro_distance函数的Unicode解码问题

解决方案:非英文字符串相似度计算(支持旁遮普语等)

首先,你遇到的UnicodeDecodeError问题主要是Python 2环境下的字符串编码处理不当导致的——jellyfish的jaro_distance其实是支持Unicode字符的,只是你传递参数的方式不对。另外,我也整理了几个替代库的方案,供你选择。

一、修复Jellyfish的使用方式

如果你用的是Python 2:

你之前用unicode(string1)会默认用ASCII编码解码字节串,而旁遮普语的字节是UTF-8编码的,所以必然报错。正确的做法是显式将字节串解码为Unicode对象:

import jellyfish

# 假设你的字符串是以UTF-8存储的字节串,先解码为Unicode
string1 = "ਬੁੱਧਵਾਰ"
string2 = "ਬੁੱਧਵਾ"
score = jellyfish.jaro_distance(string1.decode('utf-8'), string2.decode('utf-8'))
print(score)

如果你用的是Python 3:

Python 3的字符串默认就是Unicode,直接传入即可,不需要额外处理:

import jellyfish

string1 = "ਬੁੱਧਵਾਰ"
string2 = "ਬੁੱਧਵਾ"
score = jellyfish.jaro_distance(string1, string2)
print(score)

二、替代方案:其他支持Unicode的相似度计算库

如果Jellyfish还是不符合你的需求,试试下面这些库:

1. Python标准库difflib(无需额外安装)

difflib的SequenceMatcher.ratio()方法直接返回0到1之间的相似度,完美支持Unicode:

from difflib import SequenceMatcher

string1 = "ਬੁੱਧਵਾਰ"
string2 = "ਬੁੱਧਵਾ"
similarity = SequenceMatcher(None, string1, string2).ratio()
print(similarity)

2. python-Levenshtein(高性能)

这个库基于Levenshtein编辑距离算法,性能比difflib好,支持Unicode。先安装:pip install python-Levenshtein

import Levenshtein

string1 = "ਬੁੱਧਵਾਰ"
string2 = "ਬੁੱਧਵਾ"
# 直接获取0-1之间的相似度
similarity = Levenshtein.ratio(string1, string2)
print(similarity)

# 或者手动转换编辑距离为相似度(可选)
distance = Levenshtein.distance(string1, string2)
max_length = max(len(string1), len(string2))
similarity = 1 - (distance / max_length)
print(similarity)

3. fuzzywuzzy(功能丰富)

这个库封装了Levenshtein算法,提供多种相似度计算方式(比如部分匹配、token匹配等),支持Unicode。安装:pip install fuzzywuzzy

from fuzzywuzzy import fuzz

string1 = "ਬੁੱਧਵਾਰ"
string2 = "ਬੁੱਧਵਾ"
# 返回0-100的分数,除以100得到0-1的相似度
similarity = fuzz.ratio(string1, string2) / 100.0
print(similarity)

内容的提问来源于stack exchange,提问作者Yogendiran Barath

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 14:52:46