标签: sequencematcher

Pythons SequenceMatcher如何工作?

SequenceMatcher根据参数的顺序,我对两个不同的答案感到有些困惑.为什么会这样?

SequenceMatcher不可交换:

>>> from difflib import SequenceMatcher
>>> SequenceMatcher(None, "Ebojfm Mzpm", "Ebfo ef Mfpo").ratio()
0.6086956521739131

>>> SequenceMatcher(None, "Ebfo ef Mfpo", "Ebojfm Mzpm").ratio()
0.5217391304347826
Run Code Online (Sandbox Code Playgroud)

python string comparison sequencematcher

12
推荐指数
2
解决办法
3971
查看次数

Difflib的SequenceMatcher - 定制的相等

我一直在尝试使用SequenceMatcher创建嵌套或递归效果.

最终目标是比较两个序列,两个序列都可能包含不同类型的实例.

例如,序列可以是:

l1 = [1, "Foo", "Bar", 3]
l2 = [1, "Fo", "Bak", 2]
Run Code Online (Sandbox Code Playgroud)

通常,SequenceMatcher仅将[1]识别为l1和l2的公共子序列.

我想SequnceMatcher被两次字符串实例应用,以便"Foo""Fo"作为将被视为相等,以及"Bar""Bak",与最长公共子序列将是长度为3的[1, Foo/Fo, Bar/Bak].也就是说,在比较字符串成员时,我希望SequenceMatcher 更宽容.

我尝试做的是为内置的str类编写一个包装器:

from difflib import SequenceMatcher
class myString:
    def __init__(self, string):
        self.string = string
    def __hash__(self):
        return hash(self.string)
    def __eq__(self, other):
        return SequenceMatcher(a=self.string, b=self.string).ratio() > 0.5
Run Code Online (Sandbox Code Playgroud)

编辑:也许更优雅的方式是:

class myString(str):
    def __eq__(self, other):
        return SequenceMatcher(a=self, b=other).ratio() > 0.5
Run Code Online (Sandbox Code Playgroud)

通过这样做,可以实现以下目标:

>>> Foo = myString("Foo")
>>> Fo = myString("Fo")
>>> …
Run Code Online (Sandbox Code Playgroud)

python difflib sequencematcher

7
推荐指数
1
解决办法
1256
查看次数

使用 Fuzzywuzzy 时出错:UserWarning: Using slow pure-python SequenceMatcher。安装 python-Levenshtein 来消除这个警告

我得到低于错误。有没有办法在不安装 python-Levenshtein 的情况下修复它,如果没有,那么如何在 linux 上安装 python-Levenshtein。

UserWarning: Using slow pure-python SequenceMatcher. Install python-Levenshtein to remove this warning
  warnings.warn
Run Code Online (Sandbox Code Playgroud)

python sequencematcher fuzzywuzzy

7
推荐指数
1
解决办法
1万
查看次数

difflib.SequenceMatcher isjunk 参数不考虑?

在 python difflib 库中,SequenceMatcher 类的行为是否出乎意料,还是我误读了假定的行为?

为什么 isjunk 论点在这种情况下似乎没有任何区别?

difflib.SequenceMatcher(None, "AA", "A A").ratio() return 0.8

difflib.SequenceMatcher(lambda x: x in ' ', "AA", "A A").ratio() returns 0.8
Run Code Online (Sandbox Code Playgroud)

我的理解是,如果省略空格,则比率应为1。

python difflib sequencematcher

6
推荐指数
1
解决办法
1442
查看次数

使difflib的SequenceMatcher忽略"垃圾"字符

我有很多字符串,我想匹配相似性(每个字符串平均30个字符).我发现difflib's SequenceMatcher这个任务很棒,因为它很简单,结果很好.但如果我比较hellboyhell-boy喜欢这个

>>> sm=SequenceMatcher(lambda x:x=='-','hellboy','hell-boy')
>>> sm.ratio()
0: 0.93333333333333335
Run Code Online (Sandbox Code Playgroud)

我希望这样的话能给出100%的匹配,即ratio of 1.0.我知道上面函数中指定的垃圾字符不用于比较,而是查找最长的连续匹配子序列.为了比较的目的,有什么办法可以SequenceMatcher忽略一些"垃圾"字符吗?

python difflib sequencematcher

5
推荐指数
1
解决办法
2057
查看次数

SequenceMatcher - 找出两个或多个数据列表中最相似的两个元素

我试图将一组字符串与一组已定义的字符串进行比较。例如,您要查找一封信件的收件人,该信件的文本是通过 OCR 数字化的。

有一个地址数组,其中包含字典作为元素。每个元素都是唯一的,包含 ID、名称、街道、邮政编码和城市。此列表将有 1000 个条目。

由于 OCR 扫描的文本可能不准确,我们需要找到与包含地址的列表最匹配的字符串候选者。

文本长度为 750 字。我们通过使用适当的过滤器函数来减少单词的数量,该函数首先按空格分割,从每个元素中剥离更多的空格,删除所有长度小于 5 个字符的单词并删除重复项;结果列表有 200 字长。

由于每个收件人有 4 个字符串(姓名街道、邮政编码和城市),其余字母长度为 200 个单词,因此我的比较必须运行 4 * 1000 * 200 = 800'000 次。

我使用 python 取得了中等成功。已正确找到匹配项。但是,该算法需要很长时间来处理大量字母(每 1500 个字母最多 50 小时)。列表理解已被应用。有没有办法正确(而不是不必要的)实现多线程?如果此应用程序需要在低规格服务器上运行怎么办?我的 6 核 CPU 没有抱怨这些任务,但是,我不知道在一个小的 AWS 实例上处理大量文档需要多少时间。

>> len(addressees)
1000
>> addressees[0]
{"Name": "John Doe", "Zip": 12345, "Street": "Boulevard of broken dreams 2", "City": "Stockholm"}
>> letter[:5] # already filtered
["Insurance", "Taxation", "Identification", "1592212", "St0ckhlm", "Mozart"]
>> from difflib import SequenceMatcher
>> def get_similarity_per_element(addressees, …
Run Code Online (Sandbox Code Playgroud)

python algorithm difflib sequencematcher python-3.x

5
推荐指数
1
解决办法
1668
查看次数