piapia123
ja

文字列距離

テキスト

処理はすべてブラウザ内で完結します。データは送信されません

入力
ファイルをここにドロップすると読み込めます
出力

2 つの文字列がどれくらい似ているかは、何を問うかによって変わります —— だからここには 5 つのアルゴリズムがあります。5 通りの言い方ではなく、5 通りの問いです: · 編集距離(Levenshtein) —— 何回の編集で相手になるか。挿入・削除・置換を許します。 · Damerau —— それに「隣接する 2 文字の交換を 1 手」を加えたもの。`teh` → `the` は編集距離では 2、Damerau では 1 です。打ち間違いで最も多いのが隣接交換です。 · Hamming —— 置換のみ、同じ長さが必須。DNA の比較やビット誤り率の尺度です。 · Jaro-Winkler —— 距離ではなく 0〜1 の類似度。先頭が一致していると加点されます。姓名照合由来です。 · 最長共通部分列 —— 連続している必要はありません。テキスト diff の基礎です。 ⚠️ 結果に文字ごとの対応表を付ける理由:「距離は 3」という数字だけでは何もできません。どこが違うかが分かって初めて直せます。そこで編集距離の経路では、各位置が一致・置換・挿入・削除のどれかを示します。 ⚠️ 類似度には注意点があります。ここでの類似度は `1 − 距離 ÷ 長いほうの長さ` で換算したもので、一つの約束事であって唯一の定義ではありません。Jaro-Winkler は独自の定義なので、同じ入力で値が異なるのは正常です。直接比較しないでください。 入力の約束:1 行目が A、2 行目が B。すべてブラウザー内で完結します。

機能

  • 編集距離:距離に加えて文字ごとの対応表と変更箇所の一覧(置換・挿入・削除がそれぞれどれか)
  • Damerau-Levenshtein:隣接交換を 1 手と数えるため `teh` → `the` は 2 ではなく 1
  • Hamming 距離:⚠️ 長さが違うときは数値を出さずにその旨を伝えます —— その場合この尺度は定義されないためです
  • Jaro / Jaro-Winkler 類似度(0〜1)。接頭辞は最大 4 文字、加点は原論文のしきい値 0.7 超のみ
  • 最長共通部分列:長さと実際の部分列の両方
  • ⚠️ 類似度には「これは約束事」という注記が付き、Jaro-Winkler と直接比較されないようにしています
  • 日中韓の文字は対応表で 2 桁分として揃えるため、ずれません
  • ⚠️ 1 つの文字列が 5000 文字を超える場合は計算せずに明示 —— 行列でタブが固まるため、固まった結果は誰の役にも立ちません
  • 大文字小文字の区別は任意(正規化は比較にのみ影響し、表示する原文は変わりません)

使い方

  1. 1 行目に A、2 行目に B を入れます
  2. アルゴリズムを選びます —— それぞれ別の問いに答えます
  3. 編集距離の経路では文字ごとの対応表が出るので、それに沿って直せます

よくある質問

なぜ 1 つの類似度ではなく 5 つのアルゴリズムなのですか?
別々の問いに答えるものだからです。1 つだけ示すと誤解を招きます。`teh` と `the` は編集距離で 2、Damerau で 1 —— どちらが正しいかは「キーを何回打ち間違えたか」を見るのか「何文字変わったか」を見るのかで決まります。Hamming は置換のみで同長が必須、DNA やビット誤りの場面です。Jaro-Winkler は距離ではなく類似度を返し、「先頭が同じなら同一人物」という方向に寄ります。間違ったものを選ぶと、数値は数値のままで問いには答えなくなります。
類似度に「約束事である」という注記が必要なのはなぜですか?
距離には厳密な定義がありますが(何回の編集か)、類似度にはありません —— 距離を 0〜1 に畳む方法は複数あります。ここでは `1 − 距離 ÷ 長いほうの長さ` を使っています。Jaro-Winkler は独自の定義を持つため、同じ入力で異なる値になるのは当然です。断らないと、利用者は 2 つの数値を比べて片方が壊れていると結論づけてしまいます。
長さが違うときに Hamming の数値を出さないのはなぜですか?
定義されないからです。Hamming 距離は「同じ長さの 2 つの系列が何箇所で異なるか」であり、長さが違えばその問い自体が成立しません。短いほうに合わせて切るなどして数値を作ることはできますが、それは何の問いにも答えないまま、権威があるように見えてしまいます。だから明示します。
長い入力を計算しないのはなぜですか?
これらのアルゴリズムはいずれも n × m の行列を作るからです。両側 2 万文字なら 4 億セル —— メモリを食い尽くし、そのうえタブが固まります。文字列比較の入力はもともと短いものです:誤字、氏名、1 行の識別子。長い文書を 2 つ貼るのはたいてい道具の選択ミスなので、5000 文字を超えたら固まるのではなく明示します。
入力が 2 行なのはなぜですか?
入力欄は 1 つしかないからです。2 つ目をオプション欄に置くこともできますが、文字列の比較は試行錯誤の連続で、変更のたびに入力欄を離れるのは苦痛です。代償は文字列に改行を入れられないことです —— これは意図したトレードオフで、アルゴリズム自体は複数行でも問題なく動きますが、「何文字目」が画面上で指せなくなります。

関連ツール