14

問題: いくつかの R パッケージは、2 つの文字列の類似度を計算するためのレーベンシュタイン距離の実装を特徴としています。計算された距離は、たとえば、レーベンシュタイン距離を関連する最長の文字列の長さで割るか、2 つの文字列の長さの平均で割ることによって、文字列の長さに対して簡単に正規化できます。ただし、言語学の一部のアプリケーション (例: 弁証法や受容多言語研究) では、生のレーベンシュタイン距離を最長の最小コスト アラインメントの長さで正規化することをお勧めします (Heeringa, 2004: 130-132)。これにより、知覚言語の観点からより意味のある距離測定が生成される傾向があります。

例: ドイツ語の文字列 "tsYklUs" (Zyklus = サイクル) は、2 つの挿入 (I) と 2 つの置換 (S) を持つ 7 スロット アラインメントで、スウェーデン語の同族語 "sYkEl" (cyckel = (bi)cycle) に変換できます。変換コストの合計は 4 です。正規化されたレーベンシュタイン距離: 4/7

(ア)

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

また、3 つの挿入 (I) と 1 つの削除 (D) を含む 8 スロット アラインメントで文字列を変換することも可能で、総アラインメント コストは 4 です。正規化されたレーベンシュタイン距離: 4/8

(ロ)

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

後者のアラインメントは、[E] および [U] 母音ではなく、[l] 音素を相互にアラインするため、言語的にはより意味があります。

質問: 適切な文字列の長さではなく、最長の最小コスト アラインメントのためにレーベンシュタイン距離を正規化できるようにする R 関数を知っている人はいますか? ご意見ありがとうございます。

参照: WJ Heeringa (2004)、レーベンシュタイン距離を使用した方言発音の違いの測定。博士論文、フローニンゲン大学。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
4

1 に答える 1

4

言語学者がこの投稿に出くわした場合に備えて、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
于 2012-04-17T10:40:47.037 に答える