杜克大学_记录链接:与杜克一起玩

杜克大学

最近,我在记录链接方面变得非常有趣,并遇到了Duke项目,该项目提供了一些工具来帮助解决此问题。 我以为我会尝试一下。

进行记录链接时的典型问题是,我们有两个来自不同数据集的记录,它们代表同一实体,但是没有可用于将它们合并在一起的公共键。 因此,我们需要提出一种启发方法,使我们能够这样做。

杜克大学(Duke)有一些实例表明了它的实际作用,我决定与联系国一道 。 在这里,我们有来自Dbpedia和Mondial数据库的国家,我们希望将它们链接在一起。

我们需要做的第一件事是构建项目:

export JAVA_HOME=`/usr/libexec/java_home`
mvn clean package -DskipTests

在撰写本文时,这将导致zip失败,其中包含我们在duke-dist / target /所需的所有内容 。 让我们打开包装:

unzip duke-dist/target/duke-dist-1.3-SNAPSHOT-bin.zip

接下来,我们需要下载数据文件和Duke配置文件:

wget https://raw.githubusercontent.com/larsga/Duke/master/doc/example-data/countries-dbpedia.csv
wget https://raw.githubusercontent.com/larsga/Duke/master/doc/example-data/countries.xml
wget https://raw.githubusercontent.com/larsga/Duke/master/doc/example-data/countries-mondial.csv
wget https://raw.githubusercontent.com/larsga/Duke/master/doc/example-data/countries-test.txt

现在我们准备好尝试了:

java -cp "duke-dist-1.3-SNAPSHOT/lib/*" no.priv.garshol.duke.Duke --testfile=countries-test.txt --testdebug --showmatches countries.xml
 
...
 
NO MATCH FOR:
ID: '7706', NAME: 'guatemala', AREA: '108890', CAPITAL: 'guatemala city',
 
MATCH 0.9825124555160142
ID: '10052', NAME: 'pitcairn islands', AREA: '47', CAPITAL: 'adamstown',
ID: 'http://dbpedia.org/resource/Pitcairn_Islands', NAME: 'pitcairn islands', AREA: '47', CAPITAL: 'adamstown',
 
Correct links found: 200 / 218 (91.7%)
Wrong links found: 0 / 24 (0.0%)
Unknown links found: 0
Percent of links correct 100.0%, wrong 0.0%, unknown 0.0%
Records with no link: 18
Precision 100.0%, recall 91.74311926605505%, f-number 0.9569377990430622

我们可以查看countries.xml ,看看如何计算记录之间的相似度:

<schema>
    <threshold>0.7</threshold>
...
    <property>
      <name>NAME</name>
      <comparator>no.priv.garshol.duke.comparators.Levenshtein</comparator>
      <low>0.09</low>
      <high>0.93</high>
    </property>
    <property>
      <name>AREA</name>
      <comparator>no.priv.garshol.duke.comparators.NumericComparator</comparator>
      <low>0.04</low>
      <high>0.73</high>
    </property>
    <property>
      <name>CAPITAL</name>
      <comparator>no.priv.garshol.duke.comparators.Levenshtein</comparator>
      <low>0.12</low>
      <high>0.61</high>
    </property>
  </schema>

因此,我们通过计算首都和国家/地区的Levenshtein距离(即,将一个单词转换为另一个单词所需的最小单字符编辑次数)来计算出相似性

如果其中一个数据集的拼写有误或有差异,这将非常有效。 但是,我很好奇,如果该国有两个完全不同的名称,例如科特迪瓦有时被称为象牙海岸,那会发生什么。 让我们尝试在以下文件之一中更改国家/地区名称:

"19147","Cote dIvoire","Yamoussoukro","322460"
java -cp "duke-dist-1.3-SNAPSHOT/lib/*" no.priv.garshol.duke.Duke --testfile=countries-test.txt --testdebug --showmatches countries.xml
 
NO MATCH FOR:
ID: '19147', NAME: 'ivory coast', AREA: '322460', CAPITAL: 'yamoussoukro',

我还通过曼联对托特纳姆热刺的BBCESPN比赛报告进行了尝试-BBC按姓氏引用球员,而ESPN有其全名。

当我使用Levenshtein比较器将全名与姓氏进行比较时,没有您所期望的匹配。 我必须将ESPN名称分解为名字和姓氏才能使链接正常工作。

同样,当我将球队名称更改为“曼联”而不是“曼联”和“热刺”而不是“托特纳姆热刺”时,它们也不起作用。

我想我可能需要编写一个特定于域的比较器,但我也很好奇是否可以拿出一堆训练示例,然后训练一个模型来检测什么使两条记录相似。 它的确定性较差,但可能更健壮。

翻译自: https://www.javacodegeeks.com/2015/08/record-linkage-playing-around-with-duke.html

杜克大学

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值