文字列距離
テキスト処理はすべてブラウザ内で完結します。データは送信されません
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 行目に A、2 行目に B を入れます
- アルゴリズムを選びます —— それぞれ別の問いに答えます
- 編集距離の経路では文字ごとの対応表が出るので、それに沿って直せます
よくある質問
- なぜ 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 つ目をオプション欄に置くこともできますが、文字列の比較は試行錯誤の連続で、変更のたびに入力欄を離れるのは苦痛です。代償は文字列に改行を入れられないことです —— これは意図したトレードオフで、アルゴリズム自体は複数行でも問題なく動きますが、「何文字目」が画面上で指せなくなります。
関連ツール
正規表現テスト
テキストブラウザで正規表現をテスト:一致のハイライト、キャプチャグループ、置換プレビュー、バックトラック対策。JavaScript・Python・Java・Go・PHP のコード生成も。
テキスト差分
テキスト2つのテキストを行ごとに比較し、追加・削除・未変更の行をハイライト表示します。変更は最小差分で整列し、すべてブラウザ内で処理します。
テキスト診断
テキスト見えないゼロ幅文字・BOM・同形異体文字を検出し、正規化形式・改行コード・4 通りの文字数を報告します。すべてブラウザ内で処理します。
文字数カウント
テキスト英語は単語数、日本語や中国語は字数で別々に数えます。文字数・行数・バイト数・読了時間も同時に出し、すべてブラウザ内で処理するので送信しません。
テキスト整形
テキストログや表からコピーした1列を整形します。重複行の削除、並べ替え、空行・前後の空白・行番号の削除、空白のまとめを個別に切り替えできます。
命名規則の変換
テキスト14 の命名規則の間で識別子を変換します。fooBarBaz や FOO_BAR のような混在も語に分解し、連続する大文字も語ごとに切ります。