[PHP] リストの名寄せマッチング処理

2018/10/28

PHP テクノロジー プログラミング

t f B! P L
データベースでリストを運用する時に、データ整理で行う作業に「名寄せ」というのがあります。 名寄せ作業は、たくさん登録された文字列で、同じものを同一と判断して、データをまとめていく作業ですが、エクセルで作った顧客リストや、自身で管理する名刺リスト、取引先企業一覧などで、定期的に登録されたデータリストを見直す時に行うことが多いようです。 余談ですが、「名寄せ」を英語翻訳すると「Massachusetts」という風にマサチューセッツ州と変換されるのですが、これって合っているのでしょうか? https://translate.google.co.jp/?hl=ja#ja/en/名寄せ (2022年に確認してみたところ、Google翻訳は修正されていました・・・) ちなみに、この現象はGoogle翻訳で起きているようで、他の翻訳サイトでは、この結果にはならないようです。 そして、「名寄せ」の直訳は英語にはなさそうですね・・・「NAME COLLECTING」が近いのかな???

名寄せの実態

具体的には、「株式会社あいうえお」と「(株)あいうえお」は、文字列検索すると同じではないのですが、実際は同じ会社ということで、こういうものをマッチングさせることが多いようです。 また、カタカナで多いパターンは、「株式会社アイウエオ」と「株式会社アイウエオ」のように半角と全角というのもあります。 似たような物では、英数字の半角全角も、人の目で判断しずらいですが、コンピュータでは、通常には別物判定されてしまいます。「株式会社ABC」、「株式会社ABC」 登録者が1名ではない場合に、こういうルールが明確になっていない場合などは、後ほどの名寄せ作業が非常に重要になってきます。

PHPでの操作サンプル

それでは、実際にプログラムでの対応を考えてみましょう。 まず、名前一覧を用意して、それの類似を「名寄せ作業」してみたいと思います。 リストデータは以下のものを使用します。 株式会社あいうえお 株式会社あいうえお 株式会社 アイウエオ 株式会社AIUEO 株式会社 aiueo 株式会社12345 株式会社 12345 これをこのまま表示させると、以下のようになります。 <?php $lists = explode(PHP_EOL , file_get_contents("lists.txt")); print_r($lists); Array ( [0] => 株式会社あいうえお [1] => 株式会社 アイウエオ [2] => 株式会社AIUEO [3] => 株式会社 aiueo [4] => 株式会社12345 [5] => 株式会社 12345 [6] => ) 名寄せ作業は、このリストデータを、一定のルールでコンバートして、その一覧をユニーク処理することで実現できます。 一定のルールとは以下になります。
1. ひらがな → カタカナ 2. 全角英数字を → 半角英数字 3. 大文字英字 → 小文字英字 4. スペースを削除
コンバートする関数を書いて、実行 <?php $lists = explode(PHP_EOL , file_get_contents("lists.txt")); for($i=0; $i<count($lists); $i++){ if(!$lists[$i]){continue;} echo $lists[$i] ." → ". nayose($lists[$i]) .PHP_EOL; } function nayose($string){ $string = mb_convert_kana($string , "KVCas"); $string = trim($string); $string = str_replace(" ","",$string); $string = strtoupper($string); return $string; } 株式会社あいうえお → 株式会社アイウエオ 株式会社 アイウエオ → 株式会社アイウエオ 株式会社AIUEO → 株式会社AIUEO 株式会社 aiueo → 株式会社AIUEO 株式会社12345 → 株式会社12345 株式会社 12345 → 株式会社12345 変換が成功していることが分かるでしょうか? そして、これらを配列に入れて、同じ文字列のみを残すようにユニーク処理をすれば、名寄せが完了したリストが完成します。 <?php $lists = explode(PHP_EOL , file_get_contents("lists.txt")); $newArray = array(); for($i=0; $i<count($lists); $i++){ if(!$lists[$i]){continue;} $str = nayose($lists[$i]); if(!in_array($str , $newArray)){ array_push($newArray , $str); } } print_r($newArray); function nayose($string){ $string = mb_convert_kana($string , "KVCas"); $string = trim($string); $string = str_replace(" ","",$string); $string = strtoupper($string); return $string; } Array ( [0] => 株式会社アイウエオ [1] => 株式会社AIUEO [2] => 株式会社12345 ) いかがでしょう?想定通りの結果が出ました。 実際にIDが割り振られているデータベースなどの場合は、返還前の文字列と返還後の文字列を保持したり、名寄せ後に親とするIDを追加登録したりすることで、グルーピングするような処理にしてもいいかもしれません。

システムで名寄せ

EFOの概念として、WEBサイトなどでユーザーが登録する情報がデータベースの文字タイプと違っていたり、データ登録ルールとずれている時に、WEBサイトの表示で、「入力禁止」という風に処理することが多いのですが、実はこれは登録時に名寄せ処理を施して、文字列変換してあげるだけでいいのですが、そうしたシステムにできるエンジニアがどうやら少ないという実態もあるようですね。 もちろん、ユーザーが登録するデータは1言一句、1文字たりとも、変換せずに残しておくというポリシーは、サイト主の保険になるという考え方もあり、うかつに変換できないという思考もわかりますが、ECサイトなどで、実際によく聞く問題点として、住所の表記がバラバラで、配達員の人が非常に困惑して配送作業効率が極めて無駄なこともあるようなので、登録時にこうした名寄せ処理をしてみるだけで、世の中の問題が結構解決することもあるかもしれませんね。 そして、何より、名寄せ作業って、手作業で行うと、モレ、ミス、間違いなどが起きがちで、それによる二重チェック、三重チェックなどをやる時間を考えると、こうしたアルゴリズムを作ってしまって、手軽に自動名寄せ作業を行えた方が便利じゃないですか? こうした作業、エクセルの式でもある程度できると思うので、有志の方はトライしてみてはいかがでしょう? PHPは、"mb_convert_kana"という便利関数があったのですが、他のプログラム言語でも作って自分ライブラリにしておきたいですね。

人気の投稿

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。

ブログ アーカイブ