杜克大学
最近,我在记录链接方面变得非常有趣,并遇到了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.xmlNO MATCH FOR:
ID: '19147', NAME: 'ivory coast', AREA: '322460', CAPITAL: 'yamoussoukro',
我还通过曼联对托特纳姆热刺的BBC和ESPN比赛报告进行了尝试-BBC按姓氏引用球员,而ESPN有其全名。
当我使用Levenshtein比较器将全名与姓氏进行比较时,没有您所期望的匹配。 我必须将ESPN名称分解为名字和姓氏才能使链接正常工作。
同样,当我将球队名称更改为“曼联”而不是“曼联”和“热刺”而不是“托特纳姆热刺”时,它们也不起作用。
我想我可能需要编写一个特定于域的比较器,但我也很好奇是否可以拿出一堆训练示例,然后训练一个模型来检测什么使两条记录相似。 它的确定性较差,但可能更健壮。
翻译自: https://www.javacodegeeks.com/2015/08/record-linkage-playing-around-with-duke.html
杜克大学