Java 杜克重复数据消除引擎:链接记录不工作?

Java 杜克重复数据消除引擎:链接记录不工作?,java,xml,fuzzy-logic,record-linkage,duke,Java,Xml,Fuzzy Logic,Record Linkage,Duke,我正在尝试使用Duke将记录从一个数据库匹配到另一个数据库。一个db有歌曲标题+作者。我试图匹配到另一个数据库,以找到重复项和相应的记录 我已经让杜克跑了,我可以看到一些记录正在匹配。但无论我做什么,找到的正确链接总是=0%,我就是不能直接访问链接文件 这就是我目前所做的: <duke> <schema> <threshold>0.79</threshold> <maybe-threshold>0.70</mayb

我正在尝试使用Duke将记录从一个数据库匹配到另一个数据库。一个db有歌曲标题+作者。我试图匹配到另一个数据库,以找到重复项和相应的记录

我已经让杜克跑了,我可以看到一些记录正在匹配。但无论我做什么,找到的正确链接总是=0%,我就是不能直接访问链接文件

这就是我目前所做的:

<duke>
<schema>
    <threshold>0.79</threshold>
    <maybe-threshold>0.70</maybe-threshold>
    <path>test</path>

    <property type="id">
        <name>PublishingID</name>
    </property>

    <property type="id">
        <name>AmgID</name>
    </property>

    <property>
        <name>NAME</name> 
        <comparator>no.priv.garshol.duke.comparators.JaroWinkler</comparator>
        <low>0.12</low>
        <high>0.61</high>
    </property>
    <property>
        <name>TITLE</name> 
        <comparator>no.priv.garshol.duke.comparators.Levenshtein</comparator>
        <low>0.09</low>
        <high>0.93</high>
    </property>
</schema>

<group>
    <jdbc>
        <param name="driver-class" value="com.mysql.jdbc.Driver"/>
        <param name="connection-string" value="jdbc:mysql://127.0.0.1"/>
        <param name="user-name" value="root"/>
        <param name="password" value="root"/>
        <param name="query" value="
            SELECT pSongs.song_id, pSongs.songtitle, pSongs.publisher_id, pWriters.first_name AS writer_first_name, pWriters.last_name AS writer_last_name 
            FROM    devel_matching.publisher_songs AS pSongs
            INNER JOIN devel_matching.publisher_writers as pWriters ON pWriters.publisher_id = pSongs.publisher_id AND pWriters.song_id = pSongs.song_id
            WHERE pSongs.writers LIKE '%LENNON, JOHN%'
            LIMIT 20000;"/>
        <column name="song_id" property="PublishingID"/>
        <column name="songtitle" property="TITLE" cleaner="no.priv.garshol.duke.cleaners.LowerCaseNormalizeCleaner"/>
        <column name="writer_first_name" property="NAME" cleaner = "no.priv.garshol.duke.cleaners.LowerCaseNormalizeCleaner"/>
    </jdbc>
</group>

<group>
    <jdbc>
        <param name="driver-class" value="com.mysql.jdbc.Driver"/>
        <param name="connection-string" value="jdbc:mysql://127.0.0.1"/>
        <param name="user-name" value="root"/>
        <param name="password" value="root"/>
        <param name="query" value="
            SELECT amgSong.id, amgSong.track, SUBSTRING_INDEX(SUBSTRING_INDEX(amgSong.composer, '/', numbers.n), '/', -1) composer
            FROM 
                devel_matching.numbers INNER JOIN devel_matching.track as amgSong
                ON CHAR_LENGTH(amgSong.composer) - CHAR_LENGTH(REPLACE(amgSong.composer, '/', '')) >= numbers.n - 1
            WHERE amgSong.composer like '%lennon%'
            LIMIT 5000;"/>
        <column name="id" property = "AmgID"/>
        <column name="track" property="TITLE" cleaner="no.priv.garshol.duke.cleaners.LowerCaseNormalizeCleaner"/>
        <column name="composer" property="NAME" cleaner = "no.priv.garshol.duke.cleaners.LowerCaseNormalizeCleaner"/>
    </jdbc>
</group>

0.79
0.70
测试
出版ID
阿姆吉德
名称
不,priv.garshol.duke.comparators.JaroWinkler
0.12
0.61
标题
不,priv.garshol.duke.comparators.Levenshtein
0.09
0.93

输出:

  • 记录总数:5000
  • 比赛总数:8284
  • 不匹配项总数:1587
  • 找到正确链接:0/0(0.0%)
  • 发现错误链接:0/0(0.0%)
  • 找到未知链接:8284
  • 链接百分比正确0.0%,错误0.0%,未知100.0%
  • 精度0.0%,召回率NaN%,f-编号0.0
在Spring STS上运行: 程序参数=
--progress--verbose--testfile=linked.txt--testdebug--showmatches duke.xml


它没有写入linked.txt或找到任何正确的链接。我不知道我做错了什么。任何帮助都会很棒。

事实上,它找到了8284个链接<代码>--testfile用于向Duke提供包含已知正确链接的文件,基本上是测试数据。您需要的是
--linkfile
,它将您找到的链接写入该文件

我想我应该添加一些代码,警告不要使用空的测试文件,因为这很可能表示用户出错


顺便说一句,你最好在杜克邮件列表上问这个问题。

我读了很多(找到了你的演示文稿),最后我编写了一个自定义侦听器,将匹配项保存在内存中,然后再输出到CSV文件。这同样有效。我将加入那个邮件列表。如果我想问:我们集成了solr,是否可以将solr用作数据源并跳过记录索引?和杜克一起工作很有趣:)嗯,是的,我是我。:)在直接使用ElasticSearch方面已经做了一些工作,但如果我没记错的话,在Solr上没有。无论如何,这是完全可能做到的。有一个问题,所以你可以看。谢谢你的回复。我一定会关注这个问题。最后一个问题:有没有办法将lucene指数从一个过程持续到另一个过程?例如,我们为X数据源运行重复数据消除过程。如果向数据源中添加了新记录,则如果我理解正确,第二个重复数据消除过程必须再次为所有记录编制索引?完全可以重用索引。API中有一个覆盖标志,可用于控制此操作。但是,请注意,第二次运行时,您需要使用只返回新记录的数据源。否则一切都会重新匹配。拉斯加,再次感谢你的回复。我一直在调查杜克,看它是否合适。我对链接模式很好奇。在wiki中,它表示将只在另一个数据源中查找一个匹配项。这是否意味着如果数据源有重复项,运行duke as RecordLink将无法解析重复项?我处理的问题是,两个最相似的数据源都有重复项。将重复数据消除到RecordLink中是正确的方法吗?