我有两张表,其中包含姓名和地址等客户信息。
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
答案 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 中轻松完成:
使用包从 Oracle 加载数据:cx_Oracle
加载数据的地方是:“Pandas”数据框(Pandas是另一个Python包)
在 Pandas 数据框中获得数据后,您可以使用 skLearn 计算问题陈述中“FULL ADDRESS”列的余弦相似度。 (参考:https://scikit-learn.org/stable/modules/generated/sklearn.metrics.pairwise.cosine_similarity.html)
余弦相似度是 -1 和 1 之间的值。“一”表示完美匹配,零表示输入字符串值之间的“无相关性”(在您的情况下为“完整地址”),“-1”表示字符串值具有数学上相反的向量。
您必须将那些具有最高余弦相似度的“完整地址”配对。
研究论文供参考:https://drive.google.com/open?id=1XIk6v_rNbMjIWo4m6oCZOexJJ5M6xc_y