首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在python中使用ECM进行记录链接

在python中使用ECM进行记录链接
EN

Stack Overflow用户
提问于 2018-05-24 19:53:45
回答 2查看 1.2K关注 0票数 3

我正在处理一个记录链接问题,并应用无监督算法,因为我没有外部标签。

我已经应用了ECM算法。使用的代码为:

代码语言:javascript
复制
import recordlinkage

indexer = recordlinkage.BlockIndex(on=['FirstName_CD','LastName_CD'])
pairs = indexer.index(data1, data2)

compare_cl = recordlinkage.Compare()

compare_cl.string('FirstName_CD', 'FirstName_CD', method='jarowinkler', threshold=0.50,label='given_name')
compare_cl.string('LastName_CD', 'LastName_CD', method='jarowinkler', threshold=0.50, label='surname')
compare_cl.exact('Date.Of.Birth_CD', 'Date.Of.Birth_CD', label='date_of_birth')
compare_cl.exact('Gender_CD', 'Gender_CD', label='gender')
compare_cl.exact('Profession_CD', 'Profession_CD', label='profession')
compare_cl.string('Address_CD', 'Address_CD', threshold=0.85, label='address_1')

features = compare_cl.compute(pairs,data1)

ecm = recordlinkage.ECMClassifier()
result_ecm=ecm.learn(features)

现在它返回一个多索引。我的问题是,我可以从中得出什么推论?如何获取匹配/不匹配信息?

EN

回答 2

Stack Overflow用户

发布于 2019-06-12 03:35:06

ecm.learn()返回的MultiIndex基本上是一堆索引对,它们是分类器对哪些项匹配的猜测。(请注意,ecm.learn()已弃用。新函数名为ecm.fit_predict()。)

我不知道您的数据是什么样子,但这里有一个示例数据集:

代码语言:javascript
复制
from recordlinkage.datasets import load_febrl4

dfA, dfB = load_febrl4()

# Indexation step
indexer = recordlinkage.Index()
indexer.block('given_name')
candidate_links = indexer.index(dfA, dfB)

# Comparison step
compare_cl = recordlinkage.Compare()
compare_cl.string('surname', 'surname', method='jarowinkler', threshold=0.85, label='surname')
compare_cl.exact('date_of_birth', 'date_of_birth', label='date_of_birth')
compare_cl.exact('suburb', 'suburb', label='suburb')
compare_cl.exact('state', 'state', label='state')
compare_cl.string('address_1', 'address_1', threshold=0.85, label='address_1')

features = compare_cl.compute(candidate_links, dfA, dfB)

ecm = recordlinkage.ECMClassifier()
matches = ecm.fit_predict(features)

(请注意,此示例基于here的文档中的示例。)

matches对象实际上是一个Pandas MultiIndex。我们可以将其转换为元组列表,以便更好地了解它包含的信息。

代码语言:javascript
复制
# Look at the first 5 matches
list(matches)[:5]
代码语言:javascript
复制
[('rec-2371-org', 'rec-2371-dup-0'),
 ('rec-3024-org', 'rec-3024-dup-0'),
 ('rec-4652-org', 'rec-4652-dup-0'),
 ('rec-4795-org', 'rec-4795-dup-0'),
 ('rec-1016-org', 'rec-1016-dup-0')]

这些是dfAdfB数据帧中的索引名称。我们可以查找它们,看看它们实际上是匹配的:

代码语言:javascript
复制
dfA.loc['rec-2371-org'], dfB.loc['rec-2371-dup-0']
代码语言:javascript
复制
 given_name           michaela
 surname              dunstone
 street_number              37
 address_1        deane street
 address_2            rosedown
 suburb              woodcroft
 postcode                 2065
 state                     vic
 date_of_birth        19121018
 soc_sec_id            3166178
 Name: rec-2371-org, dtype: object

 given_name           michaela
 surname              dunstone
 street_number              37
 address_1        deane street
 address_2            rosedlwn
 suburb              woodcroft
 postcode                 2065
 state                     vic
 date_of_birth        19121018
 soc_sec_id            3166178
 Name: rec-2371-dup-0, dtype: object
票数 1
EN

Stack Overflow用户

发布于 2018-10-21 00:36:30

我也找不到此方法的信息,但据我所知,ecm_learn返回一个MultiIndex,它与indexer.index()方法返回的pairs的数据类型相同。

所以,这就是我使用它的方式(顺便说一句,我可能完全错了!)

代码语言:javascript
复制
import recordlinkage

indexer = recordlinkage.BlockIndex(on=['FirstName_CD','LastName_CD'])
pairs = indexer.index(data1, data2)

compare_cl = recordlinkage.Compare()

compare_cl.string('FirstName_CD', 'FirstName_CD', method='jarowinkler', threshold=0.50,label='given_name')
compare_cl.string('LastName_CD', 'LastName_CD', method='jarowinkler', threshold=0.50, label='surname')
compare_cl.exact('Date.Of.Birth_CD', 'Date.Of.Birth_CD', label='date_of_birth')
compare_cl.exact('Gender_CD', 'Gender_CD', label='gender')
compare_cl.exact('Profession_CD', 'Profession_CD', label='profession')
compare_cl.string('Address_CD', 'Address_CD', threshold=0.85, label='address_1')

features = compare_cl.compute(pairs,data1)

ecm = recordlinkage.ECMClassifier()
result_ecm=ecm.learn(features)

#reprocess the compute() call with the newly adjusted match information
features = compare_cl.compute(result_ecm,data1)

#now, do your stuff..
#...

如果其他人有进一步的信息,我将非常感谢您的反馈。

谢谢!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50508739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档