如何在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
相关产品推荐
相关产品推荐

