小编jvh*_*_ch的帖子

如何规范Levenshtein距离以获得最大对齐长度而不是字符串长度?

问题: 一些R包用Levenshtein距离实现来计算两个字符串的相似性,例如http://finzi.psych.upenn.edu/R/library/RecordLinkage/html/strcmp.html.计算的距离可以很容易地对于弦长度进行归一化,例如通过将Levenshtein距离除以所涉及的最长弦的长度或者将其除以两个弦的长度的平均值.然而,对于语言学中的一些应用(例如方言学和接受多语言研究),建议将原始Levenshtein距离标准化为最长最小成本比对的长度(Heeringa,2004:130-132).从感性 - 语言学的角度来看,这往往会产生更有意义的距离测量.

示例: 德语字符串"tsYklUs"(Zyklus = cycle)可以7个插槽对齐转换为瑞典同源"sYkEl"(cyckel =(bi)循环),其中包含两个插入(I)和两个替换(S)总转化成本为4.标准化Levenshtein距离:4/7

(一个)

t--s--Y--k--l--U--s
---s--Y--k--E--l---
===================
I-----------S--S--I = 4
Run Code Online (Sandbox Code Playgroud)

也可以将8个插槽对齐的字符串转换为3个插入(I)和1个删除(D),总的对齐成本也是4.标准化的Levenshtein距离:4/8

(B)

t--s--Y--k-----l--U--S
---s--Y--k--E--l------
======================
I-----------D-----I--I = 4
Run Code Online (Sandbox Code Playgroud)

后者对准更有意义语言,因为它对准[1]彼此-phonemes而不是与[E]和[U]元音.

问题: 有没有人知道任何R函数可以让我将Levenshtein距离标准化为最长的最低成本比对而不是正确的字符串长度?感谢您的输入!

参考文献: WJ Heeringa(2004),使用Levenshtein距离测量方言发音差异.博士论文,格罗宁根大学.http://www.let.rug.nl/~heeringa/dialectology/thesis/

编辑 - 解决方案:我想我找到了一个解决方案.该adist函数可以返回对齐,并且似乎默认为最长的低成本对齐.举个例子,这里是与sykeltsyklus相关的对齐方式:

> attr(adist("sykel", "tsyklus", counts = TRUE), "trafos")
     [,1]      
[1,] "IMMMDMII"
Run Code Online (Sandbox Code Playgroud)

为了计算Heeringa(2004)推荐的长度标准化距离,我们可以编写一个适度的函数:

normLev.fnc <- function(a, b) {
  drop(adist(a, b) / nchar(attr(adist(a, b, counts = TRUE), "trafos")))
}
Run Code Online (Sandbox Code Playgroud)

对于上面的示例,这将返回

> normLev.fnc("sykel", "tsyklus")
[1] 0.5
Run Code Online (Sandbox Code Playgroud)

此函数还返回Heeringa(2004:131)示例的正确标准化距离:

> normLev.fnc("bine", "bEi")
[1] …
Run Code Online (Sandbox Code Playgroud)

edit-distance similarity levenshtein-distance

11
推荐指数
1
解决办法
4368
查看次数