Duke-快速的相似数据过滤引擎

0.概述

Duke是一个基于JAVA的快速灵活的重复数据过滤引擎。

1.实例

假设我们正在处理一个客户资料数据库,并试图识别重复的客户记录。数据记录中有这样的三行数据:

ID NAME ADDRESS ZIP EMAIL
1 J. Random Hacker Main St 101 21231
2 John Random Hacker Mian Street 101 21231 hack@gmail.com
3 Jacob Hacker Main Street 201 38122 jacob@hotmail.com

首先,Duke先从数据库中读取每条数据,并将数据记录转换为Duke记录对象。该过程中数据将被清洗。清洗后,数据如下:

ID NAME ADDRESS ZIP EMAIL
1 j. random hacker main street 101 21231
2 john random hacker mian street 101 21231 hack@gmail.com
3 jacob hacker main street 201 38122 jacob@hotmail.com

然后,Duke将对记录做详细的比较,看看他们代表同一客户的可能性是多少?。我们使用以下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<schema>
<threshold>0.732</threshold>

<property type="id">
<name>ID</name>
</property>
<property>
<name>NAME</name>
<comparator>no.priv.garshol.duke.comparators.QGramComparator</comparator>
<low>0.35</low>
<high>0.88</high>
</property>
<property>
<name>ADDRESS1</name>
<comparator>address-comp</comparator>
<low>0.25</low>
<high>0.65</high>
</property>
<property>
<name>EMAIL</name>
<comparator>no.priv.garshol.duke.comparators.ExactComparator</comparator>
<low>0.4</low>
<high>0.8</high>
</property>
<property>
<name>ZIP</name>
<comparator>no.priv.garshol.duke.comparators.ExactComparator</comparator>
<low>0.45</low>
<high>0.6</high>
</property>
</schema>

注意这个address-comp比较器,这是一个对象引用,通常,你可以用以下方式创建对象引用。然后在需要使用的地方引用就可以了。

1
2
3
4
5
6
7
8
<object class="no.priv.garshol.duke.comparators.WeightedLevenshtein$DefaultWeightEstimator"
name="estimator">
<param name="digit-weight" value="10.0"/>
</object>
<object class="no.priv.garshol.duke.comparators.WeightedLevenshtein"
name="address-comp">
<param name="estimator" value="estimator"/>
</object>

在上面的schema代码中,threshold(阀值)参数表示只有当概率为0.732(73.2%)或者更高时候,才能代表两个记录为同一事物。否则就认为这是两个不同的实物。含有忽略参数的属性将被忽略。

记录1和记录2的比较结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
---ADDRESS1
'main street 101' ~ 'mian street 101': 0.867 (prob 0.6127)
Result: 0.5 -> 0.6127

---NAME
'j. random hacker' ~ 'john random hacker': 0.8 (prob 0.78542)
Result: 0.6127 -> 0.8527

---ZIP
'21231' ~ '21231': 1.0 (prob 0.6)
Result: 0.8527 -> 0.8967

Overall: 0.8967

如果我们比较记录1和3,结果是不同的:

1
2
3
4
5
6
7
8
9
10
11
12
13
---ADDRESS1
'main street 101' ~ 'main street 201': 0.73 (prob 0.58)
Result: 0.5 -> 0.58

---NAME
'j. random hacker' ~ 'jacob hacker': 0.6 (prob 0.64)
Result: 0.58 -> 0.71

---ZIP
'21231' ~ '38122': 0.0 (prob 0.45)
Result: 0.71 -> 0.67

Overall: 0.67

我希望这有助于说明Duke如何权衡来自不同领域的证据,并利用它来达成裁决。

参考地址:https://github.com/larsga/Duke/wiki