python - 如何匹配和打印列表中不匹配的字符串元素?
问题描述
我的问题
我有两个“预测”和“参考”列表。每个列表都包含字符串,第一个是我的模型输出的预测元素,后者是黄金标准。我想构建一个自动错误分类器,但无法比较每个列表中每个字符串中的每个字符。我可以逐字比较(代码包含在下面),但我想逐个字符地查看。
下面是我的逐字比较器的代码,以及我正在使用 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']
因为然后我可以查看每个元素并对其所犯的错误进行分类。任何建议表示赞赏。
解决方案
我最好的猜测是,您正在寻找每对单词的逐字符差异。
假设您正在寻找最小的差异并且字符的顺序很重要,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'
,匹配。
对于您似乎正在寻找的格式(第一个列表中的内容而不是第二个列表中的内容),只需查找操作码replace
和delete
. 其他两个操作码是equal
和insert
。
推荐阅读
- api - 为什么我需要在 mapbox map.on('load') 中调用两次 XMLHttpRequest 来获取路由
- c - 使用堆栈的河内塔问题 - 它不是解决河内问题,而是移动磁盘
- node.js - 如何在后台启动节点打字稿进程(Express API)?
- url - 如何下载 Blob:url?(没有 *.m3u8)
- javascript - 将 Loop Marquee 样式设置为 Archives 外观
- mysql - 如果行在 2 小时内存在,如何排除行?
- cgal - 用 CGAL 计算两个自相交多边形的相交部分
- python - 创建存储在 for 循环中的 X 个列表,然后保存在 X 个字典中
- kotlin - Kotlin 中 DatePicker 中的月份名称
- regex - 我可以运行与当前目录和所有子目录中的所有文件匹配的 Windows Powershell 命令吗?