音声間距離を考慮したエスペラント諸語の系統分析
エスペラント諸語でこれやりたいなぁhttps://t.co/n5JPT1Z4is
— þoþufa(俺くん語) (@n_langvo) 2019年11月23日
と、こんな感じで自分の無力さを嘆いていたわけですが、
感謝します
— þoþufa(俺くん語) (@n_langvo) 2019年11月23日
そういえばvisual basicでレーベンシュタイン距離を求めるソースコードがあるのでWindowsの環境があればレーベンシュタイン距離は自動計算できると思います
— þoþufa(俺くん語) (@n_langvo) 2019年11月23日
これらのツールを使うことにより単純なレーベンシュタイン距離であれば(Windows上なら)EXCELで自動計算できることを発見したのでやってみました。
上のリンク先のVBAコードをマクロへ貼り付け、
=IF(OR($L2="-",M2="-"),"",
のような感じに入力して実行!
エクセルで実行したらこんな感じになった
— þoþufa(俺くん語) (@n_langvo) 2019年11月23日
スプレッドシートみたいに時間かからない(というか一瞬で計算される) pic.twitter.com/k2rd1HZSMF
さらに、、、
https://t.co/MUQWj3CvBb
— とひ (@gogogouy) 2019年11月24日
とりあえずwikipedia見ながら計算した https://t.co/xbZgg94N2t
なんと@gogogouy氏が音素間距離のデータを作ってくださったので、上の関数を変更して実装!
実装しました!!!
— þoþufa(俺くん語) (@n_langvo) 2019年11月24日
計算が間違ってなければこんな結果に…🤔🤔🤔 https://t.co/8BzShnRUrl pic.twitter.com/JGSx08jc2M
なのですが、
この時の関数は論文と齟齬があったので修正し・・・
今見てもらってるかもしれないけどヴォラピュクの3母音を追加したシートが新しく作られたhttps://t.co/MUQWj3CvBb
— とひ (@gogogouy) 2019年11月25日
音素間距離データが拡張され・・・・・
最終結果はこれ pic.twitter.com/OypWaAzRDZ
— þoþufa(俺くん語) (@n_langvo) 2020年3月15日
こうなりました。
ちなみに音素間距離解析のソースコードは↓の通り。
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="-"),"",
のような感じで入力して実行しています。
「S3」のセルには音素の挿入/削除コストとして"0.1"を入力しています(論文に合わせた)
論文の方でも「意義がある」という判断だったので、それなりに妥当性があるのではないかと思っています。
計算結果の詳細はこちら↓
https://docs.google.com/
※計算結果の表は一番右端にあります。
では!