如何使用 fuzzywuzzy 从单个长字符串(不带空格)中获取子字符串

问题描述 投票:0回答:1

我正在尝试使用 process.extract from thefuzz (fuzzywuzzy) 使用目标词对单个长“单词”执行模糊搜索。但是,我得到的是单个字母/数字,而不是部分匹配(通过 fuzz.partial_ratio 检测到)。我如何获得与partial_ratio检测到的序列相匹配的序列?

片段:

from thefuzz import fuzz, process

target = "1234"
source = "012345"
print(fuzz.partial_ratio(target, source))
print(process.extract(target, source, limit=2))

第一个打印产生的partial_ratio为100,清楚地表明目标位于源内部。然而,提取返回;

[('1', 90), ('2', 90)]

与(我所期待的)相反;

[('1234', 100)]

我做错了什么和/或误解了什么?

search fuzzywuzzy
1个回答
0
投票

要解决您的问题,请将最后一个打印行修改为以下内容:

print(process.extract(target, [source], scorer=fuzz.partial_ratio))
# [('012345', 100)]

您的代码不起作用的原因有两个。

  1. source
    应该是 一个列表或类似字典的对象。这就是为什么你会得到“1”、“2”等,因为该函数正在迭代字符串并获取字符。
  2. 默认情况下,
  3. process.extract
    使用与 partial_ratio
    不同的记分器
    (使用
    fuzz.WRatio

要解决 1),请将源设为列表

print(process.extract(target, [source], limit=2))
# [('012345', 90)]

注意 limit 在这里没有任何作用,因为如果有多个源字符串要搜索,它会为您提供更多结果,例如

target = '1234'
sources = ['012345', '324423', '0123567']
print(process.extract(target, sources, scorer=fuzz.partial_ratio, limit=2))
# [('012345', 100), ('0123567', 75)]

解决2)并得到你想要的结果

print(process.extract(target, [source], scorer=fuzz.partial_ratio))
# [('012345', 100)]

注意您在这里不会得到“1234”,因为结果告诉您与哪个源字符串进行比较并以此精度找到目标。它不仅仅是像您想象的那样给您目标。

© www.soinside.com 2019 - 2024. All rights reserved.