Предыдущие решения ограничены короткой длиной reg_patterns. Приведенная ниже реализация хорошо масштабируется, когда шаблон нормализации имеет много записей (например, исправление орфографии с использованием пользовательского словаря).
Начните с отображения списка reg_patterns в словарь:
from pyspark.sql.functions import col, udf
def parse_string(s, or_delim, target_delim):
keys,value = s.rstrip(target_delim).rsplit(target_delim)
return {key:value for key in keys.split(or_delim)}
reg_patterns=["ADVANCED|ADVANCE/ADV/","ASSOCS|AS|ASSOCIATES/ASSOC/"]
normalization_dict = {}
for item in reg_patterns:
normalization_dict.update(parse_string(item, "|", "/"))
Завершите нормализацию столбца DataFrame «Примечания» с помощью функции карри следующим образом:
def my_norm_func(s, ngram_dict, pattern):
return pattern.sub(lambda x: ngram_dict[x.group()], s)
norm_pattern = re.compile(r'\b(' + '|'.join([re.escape(item)\
for item in normalization_dict.keys()]) + r')\b')
my_norm_udf = udf(lambda s: my_norm_func(s, normalization_dict, norm_pattern))
df = df.withColumn("NotesUPD", my_norm_udf(col("Notes")))
дает следующий желаемый результат:
+----+--------------------+--------------------+
| ID| Notes| NotesUPD|
+----+--------------------+--------------------+
|2345| ADVANCED by John| ADV by John|
|2398| ADVANCED by ADVANCE| ADV by ADV|
|2328|Verified by somer...|Verified by somer...|
|3983|Double Checked by...|Double Checked by...|
+----+--------------------+--------------------+