2つの文字列のJaro類似度を計算
MARTHAとMARHTAは2文字が入れ替わっていても0.9444444444444445となり、1にかなり近い値です。編集回数ではなく、共通の文字とその順序を評価するので、名前や短いコードの比較に向いています。ブラウザで無料で使えます。
- 無料
- ブラウザで動作
- 登録不要
- データは端末の外に出ません
無料で実行
計算例
- 最初
- MARTHA
- 2番目
- MARHTA
- 類似度
- 0.9444444444
Jaro類似度は、限られた距離内にある一致文字を探し、それらが対応する順序を保っているか確認することで、2つの文字列がどの程度似ているかを測ります。有効な一致がない場合は0、文字列が同一の場合は1になります。小さな置換や文字順の入れ替わりだけで候補を除外したくない、短い氏名、ラベル、識別子などの比較に特に適しています。
Jaroスコアが示す内容をご理解ください
Jaro類似度は、文字に基づくあいまい比較の指標です。一方の値をもう一方へ変換するために必要な挿入、削除、置換の回数を数える方式ではありません。長い方の文字列から決まる照合範囲内で同じ文字を見つけ、第一の文字列で一致した割合、第二の文字列で一致した割合、一致文字が対応する順序を保った割合の3要素を組み合わせます。
この手順で1は同一の文字列を表し、0は条件を満たす一致文字がなかったことを表します。中間値は類似の程度を示しますが、本機能は特定の値を一致または不一致と判定しません。偽陽性と偽陰性が業務に及ぼす影響を踏まえ、利用者側でしきい値をご設定ください。
氏名、短いコード、簡潔な商品ラベルでは、共有文字と順序を評価し、小さな位置のずれをすべて別々の編集操作として扱わないJaro方式が有効です。結果は候補の順位付けに利用し、確定判断には追加情報もお使いください。
文字列を統一した方針で準備してください
比較は厳密で、大文字と小文字を区別します。文字種が異なれば別の文字として扱われ、空白や句読点も計算に含まれます。実装はUnicodeコードポイント単位で比較するため、多くの補助文字の絵文字は2つのUTF-16コード単位ではなく1つの比較要素として扱われます。
ただし、Unicode正規化は行いません。見た目が同じでも、合成済み文字と基底文字に結合文字を加えた表現は異なる場合があります。大文字小文字、空白、アクセント、Unicode形式を統一する必要がある場合は、呼び出し前に両方の入力へ同じ前処理を適用してください。
前処理を計算機の外に置くことで挙動が明確になり、文字どおり保持すべき識別子が暗黙に変更されるのを防げます。空文字列同士は同一なので1となり、一方だけが空の場合は0となります。多数のレコードを比較する際は、コレクション全体に同じ前処理方針を適用し、採用したしきい値とともに記録してください。
あいまい照合の中で安全にお使いください
Jaroスコアは照合処理における判断材料であり、2つのレコードが同一の対象を示す証明ではありません。まず、ご自身のデータから代表的なペアを用意して正解ラベルを付け、スコアを計算し、真の一致と誤った一致がどの範囲で重なるかをご確認ください。その結果に基づき、誤判定の影響に合うしきい値や人手確認の範囲を設定できます。
顧客や取引先のレコードでは、安定した内部識別子、確認済み住所の一部、日付など、独立した項目と文字列スコアを組み合わせてください。この方式は対称であり、第一と第二の文字列を入れ替えても結果は同じなので、候補の順位付けや重複排除に便利です。一方、文字の近さと順序だけを扱い、意味、同義語、翻字、発音は理解しません。
長文や意味的類似性には別の手法が適切です。
活用例
重複候補の氏名を順位付け
顧客、取引先、連絡先の氏名ペアを採点し、判断が難しい候補を人手確認へ回せます。
短いカタログラベルを比較
小さな入力ミスや局所的な文字順の入れ替わりだけが異なる商品やカテゴリを見つけられます。
あいまい照合ルールを検証
正解ラベル付きの例に決定的なスコアを付け、用途に合うしきい値を選定できます。
よくある質問
結果の範囲はどのようになりますか?
類似度は0から1です。 1は同一の文字列を表し、0は条件を満たす一致文字がないことを表します。
大文字と小文字は区別されますか?
はい。 区別しない照合方針の場合は、送信前に両方の文字列を同じ文字種へ変換してください。
アクセントや句読点は削除されますか?
いいえ。 空白、句読点、アクセント付き文字を含め、指定されたUnicodeコードポイントをそのまま処理します。
Jaro類似度とJaro-Winkler類似度は同じですか?
いいえ。 Jaro-Winklerは接頭辞に基づく補正を加えます。本機能は補正のないJaro類似度だけを返します。
どのスコアを一致と判断すべきですか?
普遍的なしきい値はありません。代表的な正解ラベル付きデータで選び、不確かなペアには確認範囲を設けてください。
関連ツール
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/str/jaro-similarity \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"first":"MARTHA","second":"MARHTA"}'const res = await fetch("https://api.kit.forhosting.com/str/jaro-similarity", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"first": "MARTHA",
"second": "MARHTA"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/str/jaro-similarity",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"first": "MARTHA",
"second": "MARHTA"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/str/jaro-similarity", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"first":"MARTHA","second":"MARHTA"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"first":"MARTHA","second":"MARHTA"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/str/jaro-similarity", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"first": "MARTHA",
"second": "MARHTA"
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "str.jaro_similarity",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |
技術的な注記
あいまい照合の中で安全にお使いください
APIリクエストでも同じ決定的な計算を使用し、料金は$0.002です。
技術的な質問
APIでの比較料金はいくらですか?
APIリクエスト1回の料金は$0.002です。