查找字符串值的最佳匹配项-Oracle/Java

查找字符串值的最佳匹配项-Oracle/Java,java,string,oracle,Java,String,Oracle,继我上一篇文章之后,我们现在面临的另一个挑战是找到地址字段的最佳匹配项[ADDR\u LINE\u 1,ADDR\u LINE\u 2,CITY,STATE,ZIP] 我们希望返回数据库中可能与[来自文件]的传入地址记录匹配的所有记录。情况是: 以下是数据库中的2条记录 ADDR_LINE_1, ADDR_LINE_2 , CITY , STATE, ZIP 001 Chestnut Avenue, Apt 100 , Indiana

继我上一篇文章之后,我们现在面临的另一个挑战是找到地址字段的最佳匹配项
[ADDR\u LINE\u 1,ADDR\u LINE\u 2,CITY,STATE,ZIP]

我们希望返回数据库中可能与[来自文件]的传入地址记录匹配的所有记录。情况是:

以下是数据库中的2条记录

ADDR_LINE_1,        ADDR_LINE_2       , CITY       , STATE, ZIP
001 Chestnut Avenue, Apt 100          , Indiana     , IN  , 9999
Apt 100            , 001 Chestnut Ave., Indianapolis, IN  , 9999
对于传入记录,如下所示

ADDR_LINE_1,        ADDR_LINE_2, CITY        , STATE, ZIP
1 Chestnut Avenue,   Apt 100   , Indiana     , IN   , 9999
我想将该记录检测为现有记录,并列出上述两种可能的匹配项

[注意:]数据库条目的顺序可以互换,但仍应作为可能的匹配项列出


有谁能给我提供一些建议,让我如何去做呢

根据Oracle版本的不同,您可以使用来生成相似性分数,然后调整您认为合理的阈值分数。例如,使用Jaro Winkler算法,字符串“001 Chestnut Avenue”和字符串“1 Chestnut Avenue”之间有96%的相似性

SQL> select utl_match.jaro_winkler_similarity( '001 Chestnut Avenue',
  2                                            '1 Chestnut Avenue' )
  3    from dual;

UTL_MATCH.JARO_WINKLER_SIMILARITY('001CHESTNUTAVENUE','1CHESTNUTAVENUE')
------------------------------------------------------------------------
                                                                      96

显然,您可能需要做一些工作来确定各个字段的权重——例如,您可能需要在城市上设置一个更高的匹配阈值,这可能比地址的第二行相对标准化

根据Oracle版本的不同,您可以使用来生成相似性分数,然后调整您认为合理的阈值分数。例如,使用Jaro Winkler算法,字符串“001 Chestnut Avenue”和字符串“1 Chestnut Avenue”之间有96%的相似性

SQL> select utl_match.jaro_winkler_similarity( '001 Chestnut Avenue',
  2                                            '1 Chestnut Avenue' )
  3    from dual;

UTL_MATCH.JARO_WINKLER_SIMILARITY('001CHESTNUTAVENUE','1CHESTNUTAVENUE')
------------------------------------------------------------------------
                                                                      96

显然,您可能需要做一些工作来确定各个字段的权重——例如,您可能需要在城市上设置一个更高的匹配阈值,这可能比地址的第二行相对标准化

第一阶段-定义“可能的匹配”,即不进行手动保存,并严格定义给定记录是否可能匹配。第二阶段-实现这个布尔函数(现在应该很容易了)。感谢你的建议,这里是到目前为止我能想到的:我至少可以根据一些“常量”值(如城市、州、Zipcode)过滤掉记录。这可能会帮助我缩小范围。然后,对于地址行1和地址行2中的字符串标记,我可以连接并查找是否至少1/2的标记匹配,即连接“001 Chestnut Avenue”和“Apt 100”,并与传入记录“1 Chestnut Avenue Apt 100”进行比较,并查找5个字符串标记中的第3个匹配。这使整个记录成为可能的匹配。尽管我有点担心性能,但公司从销售数据清理软件到进行这种复杂的匹配,都过着非常好的生活。我认为你是非常雄心勃勃的,想单独用regex来解决这个问题。@APC:嗯,这不是我工作的公司目前要研究的:-)。。然而,你能为这些软件提供一些参考吗?第一阶段-定义“可能的匹配”,到没有手工操作的程度,并强烈定义给定记录是否可能匹配。第二阶段-实现这个布尔函数(现在应该很容易了)。感谢你的建议,这里是到目前为止我能想到的:我至少可以根据一些“常量”值(如城市、州、Zipcode)过滤掉记录。这可能会帮助我缩小范围。然后,对于地址行1和地址行2中的字符串标记,我可以连接并查找是否至少1/2的标记匹配,即连接“001 Chestnut Avenue”和“Apt 100”,并与传入记录“1 Chestnut Avenue Apt 100”进行比较,并查找5个字符串标记中的第3个匹配。这使整个记录成为可能的匹配。尽管我有点担心性能,但公司从销售数据清理软件到进行这种复杂的匹配,都过着非常好的生活。我认为你是非常雄心勃勃的,想单独用regex来解决这个问题。@APC:嗯,这不是我工作的公司目前要研究的:-)。。但是,你能为这些软件提供一些参考吗?谢谢Justin。你又救了我!:-)谢谢你,贾斯汀。你又救了我!:-)