问题: 一些R包用Levenshtein距离实现来计算两个字符串的相似性,例如http://finzi.psych.upenn.edu/R/library/RecordLinkage/html/strcmp.html。 计算的距离可以很容易地对于字符串长度进行标准化,例如通过将Levenshtein距离除以所涉及的最长弦的长度或者将其除以两个弦的长度的平均值。 然而,对于语言学中的一些应用(例如方言学和接受多语言研究),建议将原始Levenshtein距离标准化为最长最小成本比对的长度(Heeringa,2004:130-132)。 从感性 - 语言学的角度来看,这往往会产生更有意义的距离测量。
示例: 德语字符串“tsYklUs”(Zyklus =循环)可以7个插槽对齐转换为瑞典同源“sYkEl”(cyckel =(bi)循环),两个插入(I)和两个替换(S)总计转型成本为4。 归一化的Levenshtein距离:4/7
(A)
t--s--Y--k--l--U--s
---s--Y--k--E--l---
===================
I-----------S--S--I = 4
也可以将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
后一种对齐在语言上更有意义,因为它使[l] - 音素彼此对齐而不是与[E]和[U]元音对齐。
问题: 有没有人知道任何R函数可以让我将Levenshtein距离标准化为最长的最低成本对齐而不是正确的字符串长度? 感谢您的投入!
参考: W.J. Heeringa(2004),使用Levenshtein距离测量方言发音差异。博士论文,格罗宁根大学。 http://www.let.rug.nl/~heeringa/dialectology/thesis/
编辑 - 解决方案:我想我找到了一个解决方案。 adist
函数可以返回对齐,并且似乎默认为最长的低成本对齐。要采用上面的示例,这里是与 sykel 关联到 tsyklus 的对齐方式:
> attr(adist("sykel", "tsyklus", counts = TRUE), "trafos")
[,1]
[1,] "IMMMDMII"
为了计算Heeringa(2004)推荐的长度标准化距离,我们可以编写一个适度的函数:
normLev.fnc <- function(a, b) {
drop(adist(a, b) / nchar(attr(adist(a, b, counts = TRUE), "trafos")))
}
对于上面的示例,这将返回
> normLev.fnc("sykel", "tsyklus")
[1] 0.5
此函数还为Heeringa(2004:131)示例返回正确的标准化距离:
> normLev.fnc("bine", "bEi")
[1] 0.6
> normLev.fnc("kaninçen", "konEin")
[1] 0.5555556
> normLev.fnc("kenEeri", "kenArje")
[1] 0.5
比较几对字符串:
> L1 <- c("bine", "kaninçen", "kenEeri")
> L2 <- c("bEi", "konEin", "kenArje")
> diag(normLev.fnc(L1, L2))
[1] 0.6000000 0.5555556 0.5000000
答案 0 :(得分:3)
如果任何语言学家偶然发现这篇文章,我想指出RecordLinkage包提供的算法不一定是比较非ASCII字符串的最佳算法,例如:
> levenshteinSim("väg", "way")
[1] -0.3333333
> levenshteinDist("väg", "way")
[1] 4
> levenshteinDist("väg", "wäy")
[1] 2
> levenshteinDist("väg", "wüy")
[1] 3