2012-04-13 13 views
10

Sorun: Birkaç R paketi, iki dizenin benzerliğini hesaplamak için Levenshtein uzaktan erişim uygulamalarına sahiptir; http://finzi.psych.upenn.edu/R/library/RecordLinkage/html/strcmp.html. Hesaplanan mesafeler, örneğin dize uzunluğu için kolayca normalleştirilebilir, örn. Levenshtein mesafesini, dahil olan en uzun dizinin uzunluğuna bölerek veya iki dizenin uzunluklarının ortalamasına bölerek. Dilbilimdeki bazı uygulamalar için (örneğin, dialekometri ve alıcı çok dillilik araştırması), ham Levenshtein mesafesinin en uzun-en düşük maliyetli hizalamanın uzunluğu için normalleştirilmesi önerilir (Heeringa, 2004: 130-132). Bu, algısal-dilsel bakış açısından daha mantıklı olan mesafe ölçümleri üretme eğilimindedir.İp uzunluğu yerine, maksimum hizalama uzunluğu için Levenshtein mesafesinin nasıl normalleştirilmesi gerekir?

Örnek: Alman dizge "tsYklUs" (Zyklus = döngü) iki ilavesine sahip bir 7-yuvası hizalı olan İsveç aynı türden "sYkEl" (cyckel = (bi) döngüsü) dönüştürülebilir (I) 'e ve 4. Normalleştirilmiş Levenshtein mesafenin toplam dönüşüm maliyeti iki ikameleri (S): 4/7

(A)

t--s--Y--k--l--U--s 
---s--Y--k--E--l--- 
=================== 
I-----------S--S--I = 4 

bir 8 yuvalı hizada dizeleri dönüştürmek de mümkündür 3 ekleme (I) ve 1 silme (D) ile, toplam 4 hizalama maliyeti için. Normalize Levenshtein mesafe: 4/8

(B) [l] hizalar için

t--s--Y--k-----l--U--S 
---s--Y--k--E--l------ 
====================== 
I-----------D-----I--I = 4 

ikinci hizalama, dil ve daha mantıklı yerine [E] ile daha birbirleriyle -phonemes ve [U] ünlüler.

Soru: kimse bana uzun en düşük maliyetli uyum için yerine doğru dize uzunluğu için Levenshtein mesafeleri normalleştirmek için izin verecek herhangi R fonksiyonunun biliyor mu? Girişiniz için teşekkürler!

Referans: W. J. Heeringa (2004), Levenshtein mesafeyi kullanarak lehçesi telaffuz farklılıkları ölçülmesi. Doktora tezi, Groningen Üniversitesi. http://www.let.rug.nl/~heeringa/dialectology/thesis/

Düzelt - Çözüm: Sanırım bir çözüm buldum. adist işlevi, hizalamayı döndürebilir ve varsayılan en düşük maliyetli hizalamaya göre varsayılan gibi görünebilir.Burada tsyklus için sykel ilişkili hizalama var Yukarıdaki örneği almak için: Heeringa (2004) tarafından önerildiği gibi

> attr(adist("sykel", "tsyklus", counts = TRUE), "trafos") 
    [,1]  
[1,] "IMMMDMII" 

uzunluk-normalize mesafeleri hesaplamak için, mütevazı bir fonksiyon yazabiliriz:

yukarıdaki örnek için
normLev.fnc <- function(a, b) { 
    drop(adist(a, b)/nchar(attr(adist(a, b, counts = TRUE), "trafos"))) 
} 

bu

> normLev.fnc("sykel", "tsyklus") 
[1] 0.5 

Bu fonksiyon, bir döner (: 131 2004) örnekler:

> normLev.fnc("bine", "bEi") 
[1] 0.6 
> normLev.fnc("kaninçen", "konEin") 
[1] 0.5555556 
> normLev.fnc("kenEeri", "kenArje") 
[1] 0.5 

dizeleri birkaç çift karşılaştırmak için: LSO Heeringa en doğru normalize mesafeleri döndüren herhangi dilbilimciler bu yazı takılmaları halinde

> L1 <- c("bine", "kaninçen", "kenEeri") 
> L2 <- c("bEi", "konEin", "kenArje") 
> diag(normLev.fnc(L1, L2)) 
[1] 0.6000000 0.5555556 0.5000000 
+0

Benim önerim' etrafında 'normLev.fnc' bazen bazı stran üretir ge sonuçları. Örneğin, diag (normLev.fnc (a = c ("kat", "hond"), b = c ("katze", "hund"))) '0,4 0,2' üretir (0,4 0,25' olmalıdır). 'Mapply' kullanımı daha iyi çalışır: 'a = c (" kat "," hond "); b = c ("katze", "hund"); mapply (normLev.fnc, a = a, b = b) '. –

+0

Müthiş. Python'da eşdeğer bir işlev mi yoksa adist() ile eşdeğer mi olduğunu biliyor musunuz? Görüyorum ki [Python Levenshtein kütüphanesi] (https://github.com/miohtama/python-Levenshtein), fakat normalizasyonu desteklemiyor gibi görünüyor. – Tadhg

+0

Python tabanlı bir [uygulama] var (http: // www. yardımcı olabilecek bir Levenshtein fonksiyonu içeren dialekometri için let.rug.nl/~kleiweg/L04/). –

cevap

3

, İsterdim RecordLinkage paket tarafından sağlanan algoritmalar örneğin ASCII olmayan dizeleri karşılaştırmak için mutlaka uygun değillerdir işaret: `diag() sarmak için

> 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 
İlgili konular