df_cam
cli id と originを持つ DataFrame A ( ) があります。
cli id | origin
------------------------------------
123 | 1234 M-MKT XYZklm 05/2016
そして DataFrame B ( df_dict
) とショートカットとキャンペーン
shortcut | campaign
------------------------------------
M-MKT | Mobile Marketing Outbound
たとえば、起源を持つクライアントは、キーワードが含まれているため、1234 M-MKT XYZklm 05/2016
実際にはキャンペーンからのものであることがわかっています。Mobile Marketing Outbound
M-MKT
ショートカットは、アルゴリズムが何を決定するかに基づく一般的なキーワードであることに注意してください。原点はM-Marketing
、MMKT
またはのいずれでもかまいませんMob-MKT
。最初にすべてのオリジンを分析して、手動でショートカットのリストを作成しました。また、正規表現を使用origin
して、プログラムにフェッチされる前にクリーンアップしています。
ショートカットで顧客の出所とキャンペーンを一致させ、スコアを付けて違いを確認したいと思います。以下に示すように:
cli id | shortcut | origin | campaign | Score
---------------------------------------------------------------------------------
123 | M-MKT | 1234 M-MKT XYZklm 05/2016 | Mobile Marketing Outbound | 0.93
以下は動作する私のプログラムですが、本当に遅いです。DataFrame A には ~400.000 行があり、別の DataFrame B には ~40 行があります。
速くする方法はありますか?
from fuzzywuzzy import fuzz
list_values = df_dict['Shortcut'].values.tolist()
def TopFuzzMatch(tokenA, dict_, position, value):
"""
Calculates similarity between two tokens and returns TOP match and score
-----------------------------------------------------------------------
tokenA: similarity to this token will be calculated
dict_a: list with shortcuts
position: whether I want first, second, third...TOP position
value: 0=similarity score, 1=associated shortcut
-----------------------------------------------------------------------
"""
sim = [(fuzz.token_sort_ratio(x, tokenA),x) for x in dict_]
sim.sort(key=lambda tup: tup[0], reverse=True)
return sim[position][value]
df_cam['1st_choice_short'] = df_cam.apply(lambda x: TopFuzzMatch(x['cli_origin'],list_values,0,1), axis=1 )
df_cam['1st_choice_sim'] = df_cam.apply(lambda x: TopFuzzMatch(x['cli_origin'],list_values,0,0), axis=1 )
精度を評価するために、2番目と3番目のベストマッチも計算したいことに注意してください。
編集
メソッドを見つけましprocess.ExtractOne
たが、速度は変わりません。したがって、私のコードは次のようになります。
def TopFuzzMatch(token, dict_, value):
score = process.extractOne(token, dict_, scorer=fuzz.token_sort_ratio)
return score[value]