排除的字符串列表中的相似率

问题描述

在比较2个字符串的相似性时,我想排除一个字符串列表,例如,忽略“ Texas”和“ US”。

我试图在Difflib的SequenceMatcher中使用参数'isjunk':

exclusion = ['Texas','US']
sr = SequenceMatcher(lambda x: x in exclusion,'Apple,Texas,US','Orange,autojunk=True).ratio()

print (sr)

相似率高达0.72,因此显然不排除不需要的字符串。

正确的方法是什么?

解决方法

我对软件包不熟悉,但是作为一个好奇的人,我用谷歌搜索了一下,并通过一些自我例子进行了探索。 我发现了一些有趣的东西,这不是解决您的问题的解决方案,而是您收到的结果的借口

我发现here

ratio()返回输入之间的相似性分数(浮于[0,1]中) 字符串。它求和所有返回的匹配序列的大小 函数get_matching_blocks并将比率计算为:ratio = 2.0 * M / T,其中M =匹配,T =两个序列中的元素总数

所以让我们看一个例子:

from difflib import SequenceMatcher
exclusion = ['Texas','US']
a = 'Apple,Texas,US'
b = 'Orange,US'
sr = SequenceMatcher(lambda x: x in exclusion,a,b,autojunk=True)
matches = sr.get_matching_blocks()
M = sum([match[2] for match in matches])
print(matches)
ratio = 2*M/(len(a) + len(b))
print(f'ratio calculated: {ratio}')
print(sr.ratio())

我知道了:

[Match(a=4,b=5,size=12),Match(a=16,b=17,size=0)]
ratio calculated: 0.7272727272727273
0.7272727272727273

因此,对于本示例,我希望得到相同的结果:

a = 'Apple,USTexasUS'
b = 'Orange,US'

我期望多余的TexasUS将被忽略,因为它在exclusion列表中,然后ratio将保持不变, 让我们看看我们得到了什么:

[Match(a=4,Match(a=23,size=0)]
ratio calculated: 0.6
0.6

定量比小于第一个示例,没有任何意义。 但是,如果我们深入研究输出,我们将看到匹配完全相同!那有什么区别呢?字符串的长度(它与排除的字符串一起计算)! 如果我们保留链接中的命名约定,那么T现在会更大:

T2>T1 ----> ratio2<ratio1

我建议您在匹配单词之前先过滤单词,如下所示:

exclusion = ['Texas',US'
for word2exclude in exclusion:
    a = a.replace(word2exclude,'')
    b = b.replace(word2exclude,'')
sr = SequenceMatcher(None,b)

希望您会发现它很有用,也许不是解决您的问题,而是理解它(了解问题是解决方案的第一步!)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...