问题描述
在比较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)
希望您会发现它很有用,也许不是解决您的问题,而是理解它(了解问题是解决方案的第一步!)