superi

主にキャリアと金融を嗜むメディア

表記揺れの対策


スポンサーリンク

マーケティングではアンケートによって市場調査を行うことがあるかと思いますが、このときに悩まされるのがユーザーの自由回答欄での表記揺れではないでしょうか。

表記揺れの例

例えば、 Q. あなたが、「 カテゴリ 」と聞いて思い浮かぶブランド(サービス)をお答えください。 といった質問に対して、

SK-2
SK-II
SK-II アルビオン RMK
SK-Ⅱ
SK2
SKII
SKⅡ
SKツー
SK-2
SK-Ⅱ
SK2
えすけーとぅー
エスケーツー

数字がアラビア数字だったりローマ数字だったり。カタカナだったりひらがなだったり。サブブランドを答えたりするかと。

アイデア

辞書を用意して、その単語との類似度を計算することで、解決します。 Pythonのライブラリとしてdiflib使います。diflibの類似度の計算は、gestalt pattern matchingによります。gestalt pattern matchingは簡単にいうと、比較する2つの文字列に対して、共通部分がすべての文字列の長さのうちどの程度含まれているかを計算しており、0~1の間の値を取り、1だと完全一致で0だと全く似ていないことになります。

実装

Pythonでやってみましょう。

import difflib
import unicodedata

ここで、辞書を定義している。カタカナ、ひらがな、英数字のバリエーション。

#master words.
master =['sk2','sk-II','えすけーつー','エスケーツー']

前処理として、全角半角の正規化と大文字を小文字に変換している。 

#ETL
comp = 'SK-2'
comp_norm = unicodedata.normalize('NFKC', comp)
comp_lower = comp_norm.lower()

'SK-2'と辞書内の文字列のマッチングを計算している。

#Match and score
for i in master:
    s = difflib.SequenceMatcher(None, i, comp_lower).ratio()
    print(i,s)
sk2 0.8571428571428571
sk-II 0.6666666666666666
えすけーつー 0.0
エスケーツー 0.0

'SK-2'と辞書内の文字列との類似度は上記の通りです。公式リファレンスによると、0.6を越えてれば類似しているといってよいみたいです。 ということは、今回のような表記揺れだとうまく対応できますね。

参考

https://docs.python.jp/3/library/difflib.html

http://blog.mudatobunka.org/entry/2016/05/08/154934