【入門編】【レーベンシュタイン距離】VBScript による文字列類似度算出アルゴリズムの実装と表記揺れデータの自動補正 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

こんにちは、未来のオートメーション・アーキテクトの皆さん。

業務自動化の世界へようこそ。私はこれまで、数え切れないほどのシステムをVBScriptで繋ぎ、泥臭い手作業を優雅な自動処理へと変えてきました。

今日は、プログラミング初学者が最初にぶつかる大きな壁――「データの表記揺れ」を、VBScriptの力でスマートに解決する方法を伝授しましょう。

「A社」と「A社(全角)」、あるいは「株式会社サンプル」と「(株)サンプル」。
これらをコンピュータに「同じもの」だと認識させるのは、単純な一致比較(If A = B)では不可能です。そこで登場するのが、アルゴリズムの至宝「レーベンシュタイン距離」です。

ここをクリアすれば、あなたのVBScriptスキルは「単なるマクロ」から「知的な自動化ツール」へと進化します。さあ、一緒に深淵を覗いてみましょう。

1. 「似ている」を数値化する:レーベンシュタイン距離とは?

レーベンシュタイン距離(編集距離)とは、簡単に言うと「ある文字列を別の文字列に変えるために、最低何回の書き換え(挿入・削除・置換)が必要か」を示す数値です。

  • 「猫」「猫」 → 距離は 0(完全一致)
  • 「林檎」「蜜柑」 → 全く違うので距離は大きい
  • 「Apple」「Aple」 → 「p」を1つ挿入すればいいので距離は 1

この距離が小さければ小さいほど「似ている」と判断できるわけです。これをVBScriptで実装することで、名簿の重複チェックや、入力ミスを自動で補正する仕組みが作れます。

2. VBScriptで実装する「極限のロジック」

VBScriptは非常に軽量で強力ですが、モダンな言語にあるような「便利な組み込み関数」は少ないです。しかし、だからこそ「メモリの動き」や「ループの効率」を意識した本物の基礎力が身につきます。

以下のコードは、2つの文字列を比較し、その「距離」を返す関数です。

実装コード:LevenshteinDistance 関数

Option Explicit

‘ —————————————————————-‘
‘ 関数名:GetLevenshteinDistance
‘ 引数 :str1, str2 (比較したい2つの文字列)
‘ 戻り値:編集距離(数値)
‘ 説明 :2つの文字列の類似度を数値で返します。0なら完全一致。
‘ —————————————————————-‘
Function GetLevenshteinDistance(ByVal str1, ByVal str2)
Dim n, m, i, j, cost
Dim matrix()

n = Len(str1)
m = Len(str2)

‘ 片方が空なら、もう片方の長さがそのまま距離になる
If n = 0 Then
GetLevenshteinDistance = m
Exit Function
End If
If m = 0 Then
GetLevenshteinDistance = n
Exit Function
End If

‘ 2次元配列(行列)の動的確保
‘ VBScriptの配列は(行, 列)で指定。ReDimでメモリ領域を定義する。
ReDim matrix(n, m)

‘ 行列の初期化
For i = 0 To n : matrix(i, 0) = i : Next
For j = 0 To m : matrix(0, j) = j : Next

‘ 1文字ずつ比較してコストを計算
For i = 1 To n
For j = 1 To m
‘ 文字が同じならコストは0、違うなら1(置換コスト)
If Mid(str1, i, 1) = Mid(str2, j, 1) Then
cost = 0
Else
cost = 1
End If

‘ 「削除」「挿入」「置換」のうち、最もコストが小さいものを採用
matrix(i, j) = Minimum(matrix(i – 1, j) + 1, _
matrix(i, j – 1) + 1, _
matrix(i – 1, j – 1) + cost)
Next
Next

‘ 右下のセルの値が最終的な「編集距離」
GetLevenshteinDistance = matrix(n, m)
End Function

‘ VBScriptにはMin関数(複数比較)がないため自作する
Function Minimum(a, b, c)
Dim minVal
minVal = a
If b < minVal Then minVal = b If c < minVal Then minVal = c Minimum = minVal End Function ---

3. コードの解説と「陥りやすい罠」

このコードには、VBScriptを扱う上で大切なエッセンスが詰まっています。

① 配列の動的確保 (`ReDim`)

VBScriptでは、変数の型を事前に決めない「バリアント型」が基本ですが、大きなデータを扱う際は `ReDim` を使って適切に配列のサイズを指定することがメモリ管理のコツです。今回のアルゴリズムでは `Len(str1) Len(str2)` の大きさの行列をメモリ上に展開します。

② 文字列抽出 (`Mid` 関数)

`Mid(str1, i, 1)` は、文字列の `i` 番目から `1` 文字を取り出す関数です。VBScriptの文字列操作は1から始まる(1-based)ため、配列の添字(0-based)とのズレに注意してください。ここを間違えると「インデックスが有効範囲にありません」というエラーの洗礼を受けることになります。

③ なぜ `Option Explicit` を書くのか?

冒頭に書いた `Option Explicit`。これは「変数の宣言を強制する」魔法の言葉です。初学者は面倒に感じるかもしれませんが、タイポ(打ち間違い)によるバグを未然に防ぐ、プロのエンジニアにとっての「命綱」です。

4. 現場で使える「自動補正スクリプト」への応用

さて、距離が測れるようになったら、次は「最も似ているものを選び出す」ツールに仕上げましょう。

‘ 実践例:リストの中から最も似ている名前を探し出す
Dim targets, inputName, bestMatch, minScore, score, i
targets = Array(“株式会社 鈴木製作所”, “佐藤商事”, “田中工業株式会社”, “高橋ロジスティクス”)
inputName = “鈴木製作所” ‘ タイポや略称を想定

minScore = 999 ‘ 十分に大きな値で初期化
bestMatch = “”

For i = 0 To UBound(targets)
score = GetLevenshteinDistance(inputName, targets(i))

‘ 最も距離が短い(=似ている)ものを記憶
If score < minScore Then minScore = score bestMatch = targets(i) End If Next MsgBox "入力された「" & inputName & "」は、" & vbCrLf & _ "おそらく「" & bestMatch & "」のことですね?" & vbCrLf & _ "(編集距離: " & minScore & ")" ---

5. まとめ:VBScriptを掌握するために

レーベンシュタイン距離の実装、いかがでしたか?
一見難しそうなアルゴリズムも、一歩ずつコードを紐解けば、文字列を1文字ずつ丁寧に比較しているだけの純粋なロジックであることがわかります。

ここをクリアしたあなたへ伝えたいこと:
1. インメモリ処理の速さを知る: 外部ライブラリを使わず、VBScript単体でここまで高度なことができます。
2. 「ゆらぎ」を許容する: 完璧な一致だけを求めず、曖昧さを数値化する視点を持ってください。
3. 基礎は最強の武器: このロジックはVBAやVB.NET、果てはPythonやJavaScriptでも全く同じ考え方で通用します。

VBScriptは、Windowsが動いている限りあなたの忠実な右腕となります。今回の「文字列類似度」をマスターすれば、データクレンジングや事務作業の自動化において、あなたは周囲から「魔法使い」と呼ばれるようになるでしょう。

この調子で、一歩ずつ、しかし確実に「掌握」していきましょう。応援していますよ!

タイトルとURLをコピーしました