【问题标题】:Damerau–Levenshtein distance for language specific quirks语言特定怪癖的 Damerau-Levenshtein 距离
【发布时间】:2023-03-25 20:48:02
【问题描述】:

对于说荷兰语的人来说,“ij”这两个字符被认为是一个很容易与“y”交换的字母。

对于我正在处理的项目,我希望有一个 Damerau–Levenshtein distance 的变体,它将“ij”和“y”之间的距离计算为 1,而不是当前值 2。

我自己一直在尝试,但失败了。我的问题是我不知道如何处理两个文本长度不同的事实。 有没有人有关于如何解决这个问题的建议/代码片段?

谢谢。

【问题讨论】:

  • 如果你把荷兰语转录成音素然后走距离呢?
  • AFAIK 那么与“原始”两个文本相比,距离可能会发生变化。

标签: compare fuzzy linguistics levenshtein-distance fuzzy-comparison


【解决方案1】:

*文章的术语相当松散。 “自然语言”中没有“字符串”之类的东西。自然语言中的音素可以用文字和组合来表示。

一些字符组合是保留到现代的历史惯例的遗迹,例如在现代英语“rough”中,“gh”可以听起来像 -f- 或根本不发声。在我看来,在关注原始“字符串”时,算法必须不知道语言和正字法约定的历史关系,这会在字符组合与单个音素相关时导致一些任意度量。它如何衡量“粗糙”到“ruf”?还是“通过”到“通过”? 还是德语 o-umlaut 为“oe”?

在您的情况下,-y- 可以与 -ij- 进行拼音和拼写交换。那么根据算法,两次删除后插入一个,或者一次删除 -j- 或 -i- 然后将剩余字符转置为 -y- 是什么?或者是 -ij- 被合并,合并之后是一个转置?

我建议您在应用算法之前为 -ij- 使用另一个未使用的组合字符,也许是 U00EC,带有重音的拉丁小写字母 i。

算法如何处理多码位字符?

【讨论】:

  • 多码点字符处理得很好,因为我使用的实现是基于 Java 的(使用“char”类型)并且只是比较“等于”和“不等于”。
  • 我的团队做了一些令人费解的事情并找到了解决方案。当您提供最有用的建议时,我将您授予“答案”。谢谢。
【解决方案2】:

由于它测量距离的方式,DL 距离本身无法为您处理。

由于这里不涉及代码(或语言),我只能给您一个建议,以确保所有字符串都遵循相同的结构。

为了澄清自您提出笼统问题以来的情况,

请记住,D-L 距离会逐个字符进行比较,并且实际上并不会读取您的字符串本身,因此您必须在比较之前进行解析,因为 ij 不应该与 y 交换的情况会导致其他而是问题。

【讨论】:

    【解决方案3】:

    一个想法是将每个字符串翻译成某种构造的正字法表示,其中诸如“ij”和英语“gh”“th”之类的二合字母和朋友只有一个字符长。在进行 Damerau-Levenshtein 时,所有类型的替换的距离度量不必相等,因此您可以使用任何您想要的惩罚,但表格需要在本地填充,因此您真的希望每个声音都是表格中的一个单元格.

    但是,当“ij”不是“ij”而是拼写错误或在分词边界(我不知道这是否会在荷兰语中发生)时,或者在任何其他情况下它不是实际上(意思是)一个有向图。

    否则,您将需要进行一些环顾,这会使事情复杂化,但不应该改变算法的增长顺序(我相信),前提是您只查看周围恒定数量的细胞。不过,常数因子仍然会大得多。

    【讨论】: