【问题标题】:Approximate String Matching Algorithms for names名称的近似字符串匹配算法
【发布时间】:2017-12-23 13:23:52
【问题描述】:

我正在为以下示例寻找模糊字符串算法:给定一个现有名称的数据库,如果匹配准确度高于输入阈值(例如 90%),则将输入匹配到最匹配的名称,或者 NA否则

database = [James Bond, Michael Smith]

输入

James L Bond->James Bond
JBondL->James Bond
Bond,James->James Bond
BandJamesk->James Bond
Jenny,Bond->N/A

目前,Levenstein 等大多数算法和 Soundex 等基于语音的算法都无法匹配 BondJames 等倒置名称。到目前为止 cosine 和 Jacquard 产生了最好的结果,但我正在寻找更多,以便我可以选择最好的或可能组合的算法。

【问题讨论】:

    标签: string algorithm string-matching fuzzy-comparison approximate


    【解决方案1】:

    鉴于你的例子,我会考虑:

    • 将 n1 - 输入中的名称和 n2 - 数据库中的名称分成单词(通过分隔符和大写字母):n1 -> {u1,u2,...}, n2 -> {v1,v2, ...}
    • 找出 n2 中单词的排列顺序,使 s = sum(L(u, v)) 其中 L 是 Levenshtein 距离。
    • 选择最小化s的数据库条目。

    当 L1 中的单词数和 L2 中的单词数不匹配时 - 你应该'惩罚's

    【讨论】:

    • 好主意 Lior,谢谢。一个问题:如果没有逗号或大写字母的好处,您将如何分隔 jamesbond?
    • 我能想到的一种方法可能是一种算法,它允许对字符组进行 1-2 次交换/重定位而不会受到任何惩罚。 (最多 2 个,因为可能有三个组 - 例如,herbertbondjames)我想不出一个现有的算法可以做到这一点,或者任何其他可以考虑到这个标准的算法 bondjames -> jamesbond。
    • 当输入名称只有一个单词时,我不会将其分开,而是将组成数据库名称的单词以不同的排列方式连接起来,并最小化 L(u, v1||v2||...) )。 (''||' 表示串联)。
    猜你喜欢
    • 2010-09-08
    • 1970-01-01
    • 2015-11-27
    • 2011-05-11
    • 2012-06-03
    • 2015-04-14
    • 2013-07-10
    • 1970-01-01
    • 2016-03-28
    相关资源
    最近更新 更多