如何匹配和打印列表中不匹配的字符串元素?

2024-05-13 13:58:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我的问题

我有两个列表'预测'和'参考'。每个列表都包含字符串,第一个是模型输出的预测元素,第二个是金标准。我想建立一个自动错误分类器,但无法找出比较每个列表中每个字符串中的每个字符。我可以逐字比较(代码包括在下面),但我想看字符的字符

下面是我的word-wise比较器的代码,以及我正在使用NB的数据列表,除了这个玩具示例之外,这些列表大约有3000个条目长

predicted = ['r * a k t\n', 'd * o u l\n', 'm * i s l\n', 'p * i . v @ p\n']
reference = ['r A k t\n', 'd * o u b\n, 'm * i s l\n, 'i * p . v @ t\n']

########### word-wise finder ##############
p = set(predicted)
r = set(reference)
errors = p - r

return(errors)

上面的代码返回我:

'r * a k t\n', 'd * o u l\n', 'p * i . v @ p\n'

我的梦想是有一个返回的列表,如下所示:

['* a', 'l', 'p * i', 'p']

因为我可以观察每一个元素,对它所犯的错误进行分类。 任何建议都将不胜感激


Tags: 字符串代码模型元素列表标准分类器错误
1条回答
网友
1楼 · 发布于 2024-05-13 13:58:09

我最好的猜测是你在寻找每一对单词的字符差异

假设您正在寻找最小的差异,并且字符的顺序很重要,https://docs.python.org/3/library/difflib.html提供了实现正确算法的SequenceMatcher。它的输出有点混乱

import difflib
print(difflib.SequenceMatcher(a='r * a k t\n', b='r A k t\n').get_opcodes()
# printed: [('equal', 0, 2, 0, 2), ('replace', 2, 5, 2, 3), ('equal', 5, 10, 3, 8)]

从字面上看,这意味着每种语言的range(0, 2) == [0, 1]中的字符是相同的。也就是说,'r '匹配)

然后第一个字符串中range(2, 5) == [2, 3, 4]的字符必须替换为第二个字符串中range(2,3) == [2]的字符。所以'* a''A'替换

然后第一个字符串中range(5, 10) == [5, 6, 7, 8, 9]的字符与第二个字符串中range(3, 8) == [3, 4, 5, 6, 7]的字符匹配。换句话说' k t\n'匹配

对于您似乎要查找的格式(第一个列表中的内容不在第二个列表中),只查找操作码replacedelete就足够了。另外两个操作码是equalinsert

相关问题 更多 >