【问题标题】:Levenshtein distances and special charactersLevenshtein 距离和特殊字符
【发布时间】:2012-05-23 13:04:54
【问题描述】:

我使用特里树实现了 Levenshtein 距离算法,如Steve Hanov 所述。 但是,我在处理特殊字符时遇到了困难。 例如,如果我计算 Großmann 和 Grossmann 之间的距离,我需要距离为零,因为应该认为 ß 和 ss 相等。

什么是支持这些特殊情况的最佳解决方案(如果有的话)。

我最初的想法是在计算距离之前对所有字符串进行标准化。 所以在 Großmann -> Grossman, österreich -> oesterreich, ... 但是,.NET 中似乎没有这样的功能?

【问题讨论】:

    标签: .net unicode levenshtein-distance unicode-normalization ligature


    【解决方案1】:

    挑战在于当前的文化无法识别单个单词的语言。

    假设你愿意在比赛的一方犯错。

    识别一组永远不需要映射的字符。

    确定所有文化的集合映射。

    确定特定文化的映射。

    首先做一个未映射的 Levenshtein 距离。

    如果未映射的距离为零,则停止。

    如果未映射的距离大于 x(例如 4),则停止,因为它不匹配。

    如果单词只有不需要映射的字符(例如 a-z),则停止。

    将两者映射到所有文化,如果距离为零停止。

    映射到默认区域性,如果距离为零,则停止。

    映射到其他文化,如果距离为零,则停止。

    我添加了一个直接的 string.compare 到 Levenshtein 以报告 0 如果为真。

    【讨论】:

    • 我认为您建议的方法可以满足我的要求,所以谢谢 :-)
    【解决方案2】:

    我认为规范化是要走的路。

    我不知道有任何现成的图书馆可以做到这一点,快速搜索也没有找到任何东西。

    这里讨论了一个类似的问题:Converting "Bizarre" Chars in String to Roman Chars

    他们的解决方案,手动创建映射是可行的,只要您能提前全面识别所有必要的映射。

    【讨论】:

    • 是的,但是那样会很麻烦。例如,在比较德语时,应将 ö 替换为 oe,但是,在比较英国文化时,不应将其标准化。
    • @KevinMeiresonne 我不明白为什么会这样,但如有必要,为每种文化建立单独的映射。
    • 如果文化是英语,您不想将 ö 转换为 oe?这对我来说没有意义。
    • 让我举一个更准确的例子:在德语中 österreich 与 oesterreich 相同(因此 levenshtein distance = 0) 在荷兰语中 römer 与 roemer 不同(因此 levenshtein distance != 0)跨度>
    • @KevinMeiresonne 我明白了;谢谢你的例子。在这种情况下,我认为按文化映射是可行的方法,尽管我承认创建这些映射可能是一项艰巨的任务。如果你这样做,也许你可以将它作为开源发布,因为似乎没有其他人能打败你?
    猜你喜欢
    • 2012-10-24
    • 2012-07-25
    • 2017-05-01
    • 2018-09-21
    • 1970-01-01
    • 2018-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多