首页 > 解决方案 > 如何匹配和打印列表中不匹配的字符串元素?

问题描述

我的问题

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

下面是我的逐字比较器的代码,以及我正在使用 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']

因为然后我可以查看每个元素并对其所犯的错误进行分类。任何建议表示赞赏。

标签: pythonalgorithmlist

解决方案


我最好的猜测是,您正在寻找每对单词的逐字符差异。

假设您正在寻找最小的差异并且字符的顺序很重要,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


推荐阅读