コンテンツにスキップ

文字列の類似度グルーピング

似た文字列を同じグループにまとめ、グループ番号の列を足します。 書き方が少し違う会社名や商品名を 1 つにまとめたいときに使います(名寄せ)。

完全に一致するものをまとめるだけなら重複行の処理で足ります。

入出力

ポート内容
入力データデータ
出力データグループ番号の列を足したデータ

Spark エンジンでは動きません。 行の数は変わりません。

設定項目

結果の挿入先を設定必須
グループ番号を入れる新しい列の名前。
処理対象列を選択必須
見比べる列。文字列の列だけ選べます。1 列だけです。
類似度計算方法を選択
共通文字数を用いた類似度(既定)/ 編集距離を用いた類似度 / 共通文字出現順序を用いた類似度。
類似度の閾値
オプションの中にあります。どれくらい似ていれば同じグループにするか。既定は 0.5。
先頭n文字でグルーピングして処理を高速化する
オプションの中にあります。整数を入れると、先頭の n 文字が同じものどうしだけを比べます。空のままなら全部の組み合わせを比べます。

結果の列に入るもの

同じグループになった行には同じ番号(1 から始まる整数)が入ります。

行結果
ほかの行とまとまったグループ番号(1 2 3 …)
どの行ともまとまらなかった空欄(番号は振られません)
値が空欄、またはスペースだけ比べる対象から外れるので空欄のまま

1 行だけのグループには番号が付きません。 「番号が付いている = ほかに似た行がある」と読めます。

まとめた単位で集計したいときは、番号が空欄の行を 1 件ずつの扱いにするか、欠損値処理で埋めてから使ってください。

3 つの計算方法

方法見るもの向いている場面
共通文字数を用いた類似度(既定)隣り合う 2 文字の組をどれだけ共有しているかいちばん速い。まずこれで試す
編集距離を用いた類似度何文字直せば一致するか打ち間違い・1 文字違い
共通文字出現順序を用いた類似度共通する文字が同じ順に出てくるか略称と正式名称

まず既定のまま試し、結果を見て変えてください。 どれが合うかはデータによります。

閾値の決め方

計算した類似度が閾値以上なら同じグループになります。0 に近いほど緩く、1 に近いほど厳しくなります。

実際の値を見てから決めてください。 よくある書きゆれの類似度は次のとおりです。

2 つの文字列共通文字数
(既定)
編集距離出現順序
日本商事 と 日本商亊(1 文字の打ち間違い)0.670.750.75
東京都渋谷区 と 東京都渋区(1 文字抜け)0.670.830.83
日本商事 と 日本商事株式会社(法人格が付く)0.600.500.50
ABC商会 と ABC商会株式会社(法人格が付く)0.670.560.56
日本商事 と ニホン商事(漢字とカタカナ)0.290.400.40

「共通文字数」という名前ですが、見ているのは隣り合う 2 文字の組です。 1 文字ずつでは比べません。

法人格が付くゆれは、既定の「共通文字数」がいちばん強い(0.60〜0.67)。逆に 1 文字の打ち間違いは「編集距離」が強い(0.75〜0.83)。何を揃えたいかで方法を選んでください。

一度実行して結果を見て、まとまりすぎなら上げ、まとまらなければ下げます。

行数が多いと時間がかかる

すべての組み合わせを比べるので、行数が増えると急に重くなります。1,000 行なら約 50 万通り、1 万行なら約 5,000 万通りです。

「先頭n文字でグルーピングして処理を高速化する」に値を入れると、先頭が同じものどうしだけを比べるので速くなります。前後の空白を落とし、大文字と小文字を同じものとして扱ってから先頭を見ます。n 文字より短い値は、その値全体がひとまとまりの目印になります。

ただし先頭が違う書きゆれはまとまらなくなります。 日本商事 と 株式会社日本商事 は、先頭 2 文字で区切ると別のかたまりに入ります。

前処理をしてから使う

ゆれを先に減らしておくほど精度が上がります。

  1. 特殊な文字列のクレンジングで法人格の表記を外す
  2. 文字列のクレンジングで字の形・大文字小文字・空白を揃える
  3. 漢字とカタカナのゆれがあるなら、同じ文字列のクレンジングの「ローマ字へ変換する」で読みに直す(「特殊な数字表記を半角数字に統一」は OFF にする)
  4. このノードに渡す

エラーと対処

列を選ばずに実行した

「処理対象列を選択」が空のまま実行したときに出ます。前の処理で列名が変わり、選んでいた列が入力データからなくなったときにも同じメッセージです。

対象の列が選択されていません。

直し方 — 見比べたい列を選び直してください。

よく使う例

1. 会社名をまとめる

お題 — 同じ会社が書き方違いで何件にも分かれている

入力 — 会社名 に 日本商事、日本商事株式会社、ニホン商事

設定 — 結果の挿入先 名寄せ番号、計算方法は既定、閾値 0.5

出力 — 日本商事 と 日本商事株式会社 に同じ番号 1。ニホン商事 は空欄のまま

行名寄せ番号
日本商事1
日本商事株式会社1
ニホン商事(空欄)

カタカナ表記は既定ではまとまりません。 日本商事 との類似度が 0.29 で、閾値 0.5 に届かないためです。まとめたいときは、このノードの前に文字列のクレンジングの「ローマ字へ変換する」を掛けてください(上の注意を参照)。

2. 打ち間違いをまとめる

お題 — 1 文字違いの入力ミスを同じものとして扱いたい

入力 — 地名 に 東京都渋谷区 と 東京都渋区

設定 — 計算方法「編集距離を用いた類似度」、閾値 0.8

出力 — 2 行に同じ番号

3. 件数が多くて終わらない

お題 — 10 万行あって実行が終わらない

入力 — 会社名 が 10 万行

設定 — 「先頭n文字でグルーピングして処理を高速化する」に 2 を入れる

出力 — 先頭 2 文字が同じものどうしだけが比べられ、短時間で終わる

注意 — 先頭 2 文字が違うゆれはまとまりません

4. まとめすぎたとき

お題 — 関係のない会社が同じグループに入った

入力 — 例 1 と同じ

設定 — 閾値を 0.7 に上げて実行し直す

出力 — 例 1 でまとまっていた 日本商事 と 日本商事株式会社(類似度 0.60)も届かなくなり、3 行とも空欄になります

上げすぎると 1 つもまとまりません。 上の表の値を見て、残したい組の類似度より少し下に置いてください。

5. グループごとに集計する

お題 — まとめた単位で売上を見たい

入力 — 例 1 の出力に 売上 が付いたもの

設定 — このノードで付けた番号の列をキーにしてデータ集計

出力 — グループごとの売上合計(番号が空欄の行は空欄どうしで 1 つにまとまるので、必要なら先に条件で行をフィルタで分けてください)

関連