запись связи с использованием ECM в Python - PullRequest
0 голосов
/ 24 мая 2018

Я работаю над проблемой связывания записей и применяю неконтролируемый алгоритм, поскольку у меня нет внешних меток.

Я применил алгоритм ECM.Используемый код:

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)

Теперь он возвращает мультииндекс.Мой вопрос: какой вывод я могу из этого сделать?Как получить информацию о совпадениях / несоответствиях?

Ответы [ 2 ]

0 голосов
/ 11 июня 2019

MultiIndex, возвращаемый ecm.learn(), в основном представляет собой набор пар индексов, которые являются догадками классификатора, для которых элементы совпадают.(Обратите внимание, что ecm.learn() устарело. Новое имя функции - ecm.fit_predict().)

Я не знаю, как выглядят ваши данные, но вот пример с одним из примеров наборов данных:

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)

(Обратите внимание, что этот пример основан на примере, приведенном в документации по адресу здесь .)

Объект совпадений действительно является мультииндексом Pandas.Мы можем преобразовать его в список кортежей, чтобы лучше понять, какую информацию он содержит.

# Look at the first 5 matches
list(matches)[:5]
[('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')]

Это имена индексов в фреймах данных dfA и dfB.Мы можем посмотреть их, чтобы увидеть, что они на самом деле совпадают:

dfA.loc['rec-2371-org'], dfB.loc['rec-2371-dup-0']
 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
0 голосов
/ 20 октября 2018

Я также не смог найти информацию для этого метода, но, насколько я мог понять, ecm_learn возвращает MultiIndex, который является тем же типом данных pairs, который возвращается методом indexer.index().

Итак, вот как я это использовал (и я могу быть совершенно неправ, кстати!)

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..
#...

Если у кого-то есть дополнительная информация, я был бы очень признателен за некоторые отзывы.

Спасибо!

...