У меня нет лямбда-функции для вас, но функция, которую вы можете применить к dframe.Email
:
import pandas as pd
from fuzzywuzzy import fuzz
Сначала создайте тот же пример данных, что и вы:
dframe = pd.DataFrame({ 'Email' : ['this is a first very long e-mail about fraud and money',
'this is a second e-mail about money',
'this would be a next message where people talk about secret information',
'this is a sentence where someone misspelled word frad',
'this sentence has no keyword']})
keywords = ['fraud','money','secret']
Эта функция применяется:
def fct(sntnc, kwds):
mtch = []
for kwd in kwds:
fuz_part = [fuzz.partial_ratio(kwd.lower(), w.lower()) > 90 for w in sntnc.split()]
fuz_set = [fuzz.token_set_ratio(kwd, w) > 85 for w in sntnc.split()]
bL = [len(w) > 3 for w in sntnc.split()]
mtch.append(any([(p | s) & l for p, s, l in zip(fuz_part, fuz_set, bL)]))
return mtch
Для каждого ключевого слова
он вычисляет fuz_part > 90
для всех слов в предложении,
то же самое с fuz_set > 85
и то же самое с wordlength > 3
.
И, наконец, для каждого ключевого слова оно сохраняется в списке, если во всех словах предложения есть ((fuz_part > 90) | (fuz_set > 85)) & (wordlength > 3)
.
И как это применяется и как создается результат:
s = dframe.Email.apply(fct, kwds=keywords)
s = s.apply(pd.Series).set_axis(keywords, axis=1, inplace=False)
dframe = pd.concat([dframe, s], axis=1)
Результат:
result = dframe.drop('Email', 1)
# fraud money secret
# 0 True True False
# 1 False True False
# 2 False False True
# 3 True False False
# 4 False False False
result.sum()
# fraud 2
# money 2
# secret 1
# dtype: int64