在过去的几周里,我发布了两个不同的项目,这些项目至少部分是由 Python 脚本提供支持的,该脚本消除了过去需要数小时苦差事的过程中的大量劳动力。
The Upgradies和Feuding Families都依赖于将来自数百个提交的最常见答案的列表编译到 Google 表单中的免费输入框中。正如您所料,这会导致一些相当不一致的数据输入。调查人们今年最喜欢的苹果产品,你会得到Mini、Mac mini、M4 Mac mini、The Mini、The Mac Mini、The New Mac Mini,甚至是Macmini、Mca mini 和 Macini等产品。
我开始走上自动化之路,因为我只是认为计算机在计算相同输入方面会比人类做得更好。确实如此,但我想得越多,我就越希望该工具能够超越计算相同条目的范围,我希望它也能将所有相似的条目也纳入计数。为什么不呢?
因此,我创建了该工具的第一次迭代,Myke Hurley 和我已经在我们的项目中使用该工具一两年了。为了方便起见,它是一个 Python 脚本,只是插入到单行快捷方式中(运行 shell 脚本,因为您可以从 shell 列表中选择 Python)。
原始脚本所做的就是读取剪贴板,将所有内容放入标题大小写(从而避免大小写差异),然后删除一堆无关的空格并通过正则表达式添加“The”。
一旦所有这些都稍微规范化了,它就会通过一个非常令人惊奇的名为 Counter 的 Python 命令运行,该命令包含在集合包中。它接受一个列表并返回一个数组,其中包含每个列表项出现的次数。我的脚本使用most_common
排序技术对其进行处理,并将其格式化以供导出。这样,一、二、三、四、四、四、五、一的数据集就变成:
四 3
一 2
两个 1
三 1
五 1
这很好,但它仍然需要相当多的合并项目,这些项目不够接近,无法被我的一小堆正则表达式捕获和规范化。六色成员 Adrian 登场,他建议使用 Levenshtein 方法将相似的字符串相互匹配。甚至还有一个 Python 包可以做到这一点。
所以我决定使用阿德里安建议的方法重新创建我的脚本。通过删除文章、标点符号、多余空格和不同大小写来规范化列表后,我的脚本循环遍历列表并使用编辑比率来确定字符串是否足够接近以被视为较大组的一部分。
然后我引入了 ChatGPT 1来以我喜欢的方式完成格式化和排序输出的肮脏工作。结果是数据集一、二、三、三、五、一百、一百、一百、三、四、前、五、一变成:
三 3
一百 3
一 2
五 2
四 2
两个 1
我用实际的《Feuding Families》数据测试了这一切。以下是近 700 份投票提交的真实列表的结果,这些投票回答了“星球大战中赏金猎人的名字”这一问题:
波巴·费特 335
Ig-88 86
曼达洛人 41
博斯克36
曼多34
格里多 27
詹戈·费特 27
Ig-11 13
并不完美,我必须手动将The Mandalorian与Mando合并,但仅此而已!它成功地将Baba Fet、Babo Fett、Bob A Fett、Bob Fett、Boba Fet、Boba Fety、Bobafett、Bobba Fet、Bobba Fett、Bobs Fett、Boda Feta、Bona Fett 和Bubba Fett合并为一个“Boba”费特”的回答。
最后,Mac 友好的集成:通过将其保存为快捷方式并选择它出现在服务菜单中,因为该脚本接受输入并生成输出,我实际上可以在几乎任何 Mac 文本编辑器中使用该脚本。我只需选择列表中的文本,从 Apple 菜单下的“服务”子菜单中选择“计算列表中的重复项”,未计数的列表就会被已计数的列表替换。
无论如何,如果您发现自己需要处理一堆类似但不相同的答案,则可以在 GitHub 上以要点形式获取该脚本。
- 专业提示:人工智能助手擅长编写计算事物的软件,但非常不擅长计算事物本身。将这些结果粘贴到聊天机器人中会导致计数极其不准确。 ↩
原文: https://sixcolors.com/post/2025/01/counting-almost-duplicates-in-very-long-lists/