fuzzywuzzy extractOne 的匹配问题

尝试用 fuzzywuzzy 对文本进行模糊匹配,使用 fuzz.ratio 能正常返回匹配率,证明能正常匹配中文:

from fuzzywuzzy import fuzz
fuzz.ratio("数据挖掘", "数据挖掘工程师") # 返回 73

fuzzywuzzy 中 extractOne 的用途是,在一个列表中找到跟目标文本最匹配的一个字符串,但我下面这段代码,却只能返回列表第一个字符串,并且匹配率为 0:

from fuzzywuzzy import process
title_list = [u"数据分析师", u"数据挖掘工程师", u"大数据开发工程师", u"机器学习工程师", 
               u"算法工程师", u"数据库管理", u"商业分析师", u"数据科学家", u"首席数据官",
               u"数据产品经理", u"数据运营", u"大数据架构师"]
process.extractOne(u"数据挖掘", title_list) # 返回 (u'\u6570\u636e\u5206\u6790\u5e08', 0)

但如果我将目标文本和列表中加入英文,就能正常返回结果了:

from fuzzywuzzy import process
title_list = [u"数据分析师", u"数据挖掘工程师", u"大数据开发工程师", u"机器学习工程师", 
               u"算法工程师", u"数据库管理", u"商业分析师", u"数据科学家", u"首席数据官",
               u"数据产品经理", u"数据运营", u"大数据架构师", "Data Analyst"]
process.extractOne(u"Data", title_list) # 返回 ('Data Analyst', 90)

请问这里该怎么处理中文字符才能正确获得结果呢?

阅读 11k
2 个回答

是否考虑变通一下

print max([(fuzz.ratio("数据挖掘", _), _) for _ in title_list])

遇到了同样的问题,下班之前挖个坟,给后来者看看.
fuzzywuzzy这个库在处理中文的时候有一些问题需要注意.

  • 可以说不支持utf-8,我没有具体测试太多的情况,在py2.7中,中文字符串一定要加上 u"中文字符串" 才能正常使用.
  • 如下:

from fuzzywuzzy import fuzz
from fuzzywuzzy import process

"""
fuzz.WRatio
fuzz.QRatio
这两个函数都有一个参数 force_ascii=True,
force_ascii: Allow only ascii characters
这个值默认为True的情况下,会导致无法对比中文,返回结果为0.
而prcess.extract这个函数以及这个系列的所有函数,都是默认使用fuzz.WRatio这个Scoring function的.所以在不指定scorer的情况下,中文完全无法使用.
比较贴心的是,还提供了另外两个函数:
fuzz.UQRatio
fuzz.UWRatio
这两个函数是默认force_ascii为False的.
"""
# 如此可以正常处理中文
process.extractOne(u"待匹配字符串", choices=["字符串列表",], scorer=fuzz.UWRatio)

The End.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题