两个表之间的模糊匹配

时间:2017-03-22 13:26:43

标签: oracle fuzzy record-linkage

我有两张表,其中包含姓名和地址等客户信息。

ID  Name    Full Address
1   Anurag  123 CA USA 5001
2   Mike    ABC CA USA 5002
3   Jason   ZYZ TX USA 5003
4   Roshan  HBC MS USA 5004
5   Tony    UYS VT USA 5005

New_ID  Name            Full Address
111    Anurag CH        123  3 Floor CA USA 5001
112    Mike Martin      ABC 2 floorCA USA 5002
113    Jason Bond       ABC farms USA 4008
114    Roshan Kappor    HBC MS USA 5004
115    Tony Smith       UYS VT USA 5005
116    Anurag           123 CA USA 5001

我想知道基于完整地址在上面两个表之间进行模糊匹配的最佳方法是什么。模糊匹配应该像模糊Vlookup一样工作,并且应该只为我提供一个最佳匹配。

Desired Output

 ID Name    Full Address    New ID  Name           Full Address      Match Score
 1  Anurag  123 CA USA 5001 116     Anurag         123 CA USA 5001        100
 2  Mike    ABC CA USA 5002 112     Mike Martin    ABC2floorCA USA 5002    90
 3  Jason   ZYZ TX USA 5003 113     Jason Bond     ABC farms USA 4008      89
 4  Roshan  HBC MS USA 5004 114     Roshan Kappor  HBC MS USA 5004         90
 5  Tony    UYS VT USA 5005 115     Tony Smith     UYS VT USA 5005         90

3 个答案:

答案 0 :(得分:3)

尝试UTL_MATCH套餐。计算字符串之间的相似性有两个函数。

要做的步骤。

1)在UTL_MATCH.EDIT_DISTANCE_SIMILARITY(t1.full_adress,t2.full_adress) > 0上将t1加到t2.0是相似度的百分比。我推荐将它设置为50或更多。

2)使用row_number()

进行重复数据删除

3)仅返回具有最高相似度百分比的行

实施例

with tab_1 (ID,name,full_adress) as(
select  1  ,'Anurag'  ,'123 CA USA 5001'  from dual union all
select 2  ,'Mike'    ,'ABC CA USA 5002'  from dual union all
select 3  ,'Jason'   ,'ZYZ TX USA 5003'  from dual union all
select 4  ,'Roshan'  ,'HBC MS USA 5004'  from dual union all
select 5  ,'Tony'    ,'UYS VT USA 5005'  from dual),
 tab_2 (ID_2,name_2,full_adress_2)  as (
select 111    ,'Anurag CH'        ,'123  3 Floor CA USA 5001' from dual union all
select 112    ,'Mike Martin'      ,'ABC 2 floorCA USA 5002' from dual union all
select 113    ,'Jason Bond'       ,'ABC farms USA 4008' from dual union all
select 114    ,'Roshan Kappor'    ,'HBC MS USA 5004' from dual union all
select 115    ,'Tony Smith'       ,'UYS VT USA 5005' from dual union all
select 116    ,'Anurag'           ,'123 CA USA 5001' from dual)
select * from (
select t1.*,t2.*, UTL_MATCH.EDIT_DISTANCE_SIMILARITY(t1.full_adress,t2.full_adress_2) SIMILARITY_PERCENT, row_number() over( partition by t1.id order by UTL_MATCH.EDIT_DISTANCE_SIMILARITY(t1.full_adress,t2.full_adress_2) desc) rn_rank   from tab_1 t1
 join  tab_2 t2 on UTL_MATCH.EDIT_DISTANCE_SIMILARITY(t1.full_adress,t2.full_adress_2) > 0
 ) where rn_rank = 1

答案 1 :(得分:0)

Java中有一个库,您可以输入这些记录并运行模糊匹配。 https://github.com/intuit/fuzzy-matcher

它执行基于相似度的字符匹配并将相似记录分组。 根据与姓名和地址等不同元素的相似度返回分数 但是您可能编写了一个小的Java代码,并将这些记录输入其中。

答案 2 :(得分:0)

这可以在 Python 中轻松完成:

  1. 使用包从 Oracle 加载数据:cx_Oracle

  2. 加载数据的地方是:“Pandas”数据框(Pandas是另一个Python包)

  3. 在 Pandas 数据框中获得数据后,您可以使用 skLearn 计算问题陈述中“FULL ADDRESS”列的余弦相似度。 (参考:https://scikit-learn.org/stable/modules/generated/sklearn.metrics.pairwise.cosine_similarity.html

  4. 余弦相似度是 -1 和 1 之间的值。“一”表示完美匹配,零表示输入字符串值之间的“无相关性”(在您的情况下为“完整地址”),“-1”表示字符串值具有数学上相反的向量。

  5. 您必须将那些具有最高余弦相似度的“完整地址”配对。

研究论文供参考:https://drive.google.com/open?id=1XIk6v_rNbMjIWo4m6oCZOexJJ5M6xc_y