支持重复数据消除和合并的工作流

mergic的Python项目详细描述


梅吉奇

重复数据消除和合并的工作流支持

假设你有一堆字符串,其中一些是不同的,但指的是相同的东西。可能只是一个长列表,也可能是要合并数据集中两个关键列的内容。

David Copperfield
Lance Burton
Dave Copperfield
Levar Burton

以下是您可以使用Mergic进行的操作:

把所有的标识符,每行一个。如果它们位于名为 originals.txt的文件中:

mergic calc originals.txt

您将看到关于基于其默认距离函数生成的可能分组的输出。(使用自定义距离功能很容易,请参见下文。)

num groups, max group, num pairs, cutoff
----------------------------------------
         4,         1,         0, -0.909090909091
         3,         2,         1, 0.0909090909091
         2,         2,         2, 0.25
         1,         4,         6, 0.714285714286

利用给定的距离函数,mergic可以进行4个分组,从每个名称对应一个组到所有四个名称对应一个组。

num groups 是给定的 截止值下 mergic 可以生成的组数。

max group 是该分组中最大组中的项目数。

num pairs 列指示与分组相对应的组内链接数。从某种意义上说,这代表了检查mergic所做的所有链接需要做多少工作。分组思考要比个体配对比较好得多,但是这个指标对于总结有多少联系是有用的。

截止值确定哪些项对放在同一组中。如果两个项目之间的距离等于或小于 截止值,则这些项目将组合在一起。

选择一个截断点以生成您希望看到的分组。如果您想使用截止值0.3并将结果放入名为 grouping.json的文件中:

mergic make originals.txt 0.3 > grouping.json

现在 grouping.json 包含原始数据的分组,在 json 中指定。它被设计成可读的,可编辑的,所以你可以检查它并根据需要改进它。最大的组将位于顶部,相似的项将彼此靠近。

{
    "Lance Burton": [
        "Lance Burton",
        "Levar Burton"
    ],
    "David Copperfield": [
        "Dave Copperfield",
        "David Copperfield"
    ]
}

有两个提议的团体,提议的名字是"兰斯伯顿"和"大卫科波菲尔"。您可能需要复制生成的文件并编辑副本。

cp grouping.json grouping_fixed.json
# edit `grouping_fixed.json`

如果愿意,可以编辑建议的组名对象的键。数据的原始值位于对象的数组值中,您可以移动它们来更正分组。在这种情况下,您还可以使用0.1的截止值重新运行 mergic ,以获得正确的分组:

{
    "David Copperfield": [
        "Dave Copperfield",
        "David Copperfield"
    ],
    "Lance Burton": [
        "Lance Burton"
    ],
    "Levar Burton": [
        "Levar Burton"
    ]
}

现在 grouping_fixed.json 已经尽可能完美了,您可以继续前进了。

您还可以比较两个json分组文件并查看您所做的更改:

mergic diff grouping.json grouping_fixed.json > diff.json

现在文件 diff.json 包含了 grouping.json grouping\u fixed.json 之间的区别。< T >>mergic diff 命令类似于文本文件的常规 diff ,但它知道json分区格式,因此可以智能地捕获更改。

您可以对mergic生成的文件应用更改以恢复编辑的版本。

mergic apply grouping.json diff.json > grouping_new.json

现在 grouping_new.json 等同于 grouping_fixed.json ,您可以验证:

David Copperfield
Lance Burton
Dave Copperfield
Levar Burton
0

这样,您就有了完整的、可验证的工作记录,包括整个文件级别和手动更改级别。

json分组格式对人类非常方便,但是对于表格数据,合并表更有用。合并表有一列包含数据的原始值,另一列包含新键。它们在输出中分别命名为 原始 Mergic

David Copperfield
Lance Burton
Dave Copperfield
Levar Burton
1

文件 merge_table.csv 如下所示:

David Copperfield
Lance Burton
Dave Copperfield
Levar Burton
2

这个合并表现在可以用于任何表格数据系统。对于合并,首先将其合并到两个表上,然后按 mergic 键合并。对于重复数据消除,请将其合并到感兴趣的表中,然后像使用原始数据一样使用 mergic 列。

安装

David Copperfield
Lance Burton
Dave Copperfield
Levar Burton
3

使用自定义距离功能

mergic 包提供了一个名为 mergic 的命令行脚本,该脚本使用python内置的difflib.sequencematcher.ratio() 来计算字符串距离,但是 mergic 的一个主要优点是它可以通过 mergic.blender 类轻松定制距离函数。制作定制的mergic脚本非常简单:

David Copperfield
Lance Burton
Dave Copperfield
Levar Burton
4

现在可以像标准的mergic脚本一样使用定制的mergic.py!

还有一个函数确定如何为组生成键。它接受一个列表并返回一个字符串。默认情况下, mergic.blender 将使用组值中最长的值(第一个最长的值,按稳定的排序顺序)。您还可以提供生成密钥的自定义功能。

您可能喜欢的距离

levenshtein字符串编辑距离 :经典!它有许多实现;其中之一是 python levenshtein

David Copperfield
Lance Burton
Dave Copperfield
Levar Burton
5

seatgeek的fuzzywuzzy:正如他们的博客中所描述的,一些人发现这些变体在实践中很好地工作。fuzzywuzzy的响应用整数百分比相似度表示;一种方法是从100中减去距离。

David Copperfield
Lance Burton
Dave Copperfield
Levar Burton
6

有很多距离,甚至就在提到的两个包内!

你也可以自己做!

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
Java中ArrayList的超简单问题   Java 8在一段时间后过期   java如何创建具有用户定义维度的矩阵,并使用从上到下、从左到右的递增值填充它?   java从JDBC重启mysql   带有sqlite的java LiveData未更新UI   带有JDialog的java小程序在Mac OSX中未正确隐藏   java ActionListener无法从公共类引用数组?   java Apache Digester:NoSuchMethodException:没有这样的可访问方法   安卓中数据库中的java数据没有以正确的格式检索   java快速排序实现:使用random pivot时几乎排序   安卓 Java:高效的ArrayList过滤?   java如何在单独的文件中制作GUI程序   jasper报告如何从JSP或Java代码在JasperReport中传递参数值?