n_kunnnnの日記

音楽やら、言語やら。

音声間距離を考慮したエスペラント諸語の系統分析

 

と、こんな感じで自分の無力さを嘆いていたわけですが、

 

 

これらのツールを使うことにより単純なレーベンシュタイン距離であれば(Windows上なら)EXCELで自動計算できることを発見したのでやってみました。

 

上のリンク先のVBAコードをマクロへ貼り付け、

=IF(OR($L2="-",M2="-"),"",lsDist($L2,M2)/MAX(LEN($L2),LEN(M2)))

のような感じに入力して実行!

 

 

さらに、、、

 

 

なんと@gogogouy氏が音素間距離のデータを作ってくださったので、上の関数を変更して実装!

 

 

 

なのですが、

 

この時の関数は論文と齟齬があったので修正し・・・

 

 

音素間距離データが拡張され・・・・・

 

 

こうなりました。

 

ちなみに音素間距離解析のソースコードは↓の通り。

 

Public Function lsDist2_2(baseText As String, tryText As String, zurecost) As Double

Dim matrix() As Variant
Dim i As Integer, j As Integer, cost As Double, onso1 As Integer, onso2 As Integer

If (baseText = tryText) Then
Exit Function
End If
If (Len(baseText) = 0) Then
lsDist2_2 = Len(tryText)
Exit Function
End If
If (Len(tryText) = 0) Then
lsDist2_2 = Len(baseText)
Exit Function
End If

ReDim matrix(Len(baseText), Len(tryText))

For i = 1 To Len(baseText)

For j = 1 To Len(tryText)

onso1 = WorksheetFunction.Match(Mid$(baseText, i, 1), Worksheets("onsokan.data_2").Range("B71:AG71"), 0)
onso2 = WorksheetFunction.Match(Mid$(tryText, j, 1), Worksheets("onsokan.data_2").Range("A72:A103"), 0)

cost = WorksheetFunction.Index(Worksheets("onsokan.data_2").Range("B72:AG103"), onso1, onso2)

If (i = 1) Then

If (j = 1) Then

matrix(i, j) = cost
Else

matrix(i, j) = matrix(i, j - 1) + cost + zurecost

End If

Else

If (j = 1) Then

matrix(i, j) = matrix(i - 1, j) + cost + zurecost
Else


matrix(i, j) = WorksheetFunction.Min(matrix(i - 1, j) + cost + zurecost, matrix(i, j - 1) + cost + zurecost, matrix(i - 1, j - 1) + cost)

End If

End If

Next j

Next i

lsDist2_2 = matrix(Len(baseText), Len(tryText))

End Function
Public Function lsDist(baseText As String, tryText As String) As Integer

Dim matrix() As Variant
Dim i As Integer, j As Integer, cost As Integer

lsDist = 0

If (baseText = tryText) Then
Exit Function
End If
If (Len(baseText) = 0) Then
lsDist = Len(tryText)
Exit Function
End If
If (Len(tryText) = 0) Then
lsDist = Len(baseText)
Exit Function
End If

ReDim matrix(Len(baseText), Len(tryText))

For i = 0 To Len(baseText)
matrix(i, 0) = i
Next i

For j = 0 To Len(tryText)
matrix(0, j) = j
Next j

For i = 1 To Len(baseText)
For j = 1 To Len(tryText)
cost = IIf(Mid$(baseText, i, 1) = Mid$(tryText, j, 1), 0, 1)
matrix(i, j) = WorksheetFunction.Min(matrix(i - 1, j) + 1, matrix(i, j - 1) + 1, matrix(i - 1, j - 1) + cost)
Next j
Next i

lsDist = matrix(Len(baseText), Len(tryText))

End Function

 

「onsokan.data」というのは音素間距離のデータが入ったシート

そこから音素を探し出して音素間距離の数値を拾っています。

「zurecost」というのは(ネーミングがクソ適当すぎますが)、音素の挿入/削除コストです(論文参照)

 

エクセルのシートで

IF(OR($C3="-",D3="-"),"",lsDist2_2($C3,D3,$S$3)/MAX(LEN($C3),LEN(D3)))

のような感じで入力して実行しています。

 

「S3」のセルには音素の挿入/削除コストとして"0.1"を入力しています(論文に合わせた)

 

論文の方でも「意義がある」という判断だったので、それなりに妥当性があるのではないかと思っています。

 

計算結果の詳細はこちら↓

https://docs.google.com/spreadsheets/d/1T38AAaUmftQtJyIlmzIXa-K_1iKYDDfQLlhI95QICjw/edit?usp=sharing

※計算結果の表は一番右端にあります。

 

では!