Долгая работа цикла для поиска подстрок в строках
Вопрос скорости цикла для анализа текста. Есть код, который отлично работает на небольших объемах данных:
for code_column, result_column, text_column in [('bad_code_5', 'Код_5', 'text_5'),
('bad_code_4', 'Код_4', 'text_4'),
('bad_code_3', 'Код_3', 'text_3'),
('bad_code_2', 'Код_2', 'text_2')]:
unique_groups = result_check_data[code_column].unique()
for group in unique_groups:
group_sentences_df2 = result_check_data[result_check_data[code_column] == group]
group_keywords_df1 = check_df[
(check_df['code_5'] == group) | (check_df['code_4'] == group) | (check_df['code_3'] == group) | (
check_df['code_2'] == group)]
for i, row in group_sentences_df2.iterrows():
sentence_lower = row['Адрес_clean']
for kw_index, keyword_row in group_keywords_df1.iterrows():
keywords = keyword_row['Наименование_clean']
keyword_set = set(keywords)
if all(" " + keyword.lower() + " " in sentence_lower for keyword in keyword_set):
result_check_data.at[i, result_column] = keyword_row['Код']
result_check_data.at[i, text_column] = " ".join(keywords)
number += 1
print(f"{keyword_row['Код']} цикл №{number}")
Как можно его максимально ускорить?
Я пытался использовать лямбду, но программа отказывается искать вообще любые значения. В какую сторону копать?
for code_column, result_column, text_column in [('bad_code_5', 'Код_5', 'text_5'),
('bad_code_4', 'Код_4', 'text_4'),
('bad_code_3', 'Код_3', 'text_3'),
('bad_code_2', 'Код_2', 'text_2')]:
unique_groups = result_check_data[code_column].unique()
for group in unique_groups:
group_sentences_df2 = result_check_data[result_check_data[code_column] == group]
group_keywords_df1 = check_df[
(check_df['code_5'] == group) | (check_df['code_4'] == group) | (check_df['code_3'] == group) | (
check_df['code_2'] == group)]
for i, row in group_sentences_df2.iterrows():
sentence_lower = row['Адрес_clean']
keywords = group_keywords_df1['Наименование_clean']
keywords = keywords.dropna().astype(str).str.split().apply(set)
mask = keywords.apply(lambda x: all(f" {word.lower()} " in sentence_lower for word in x))
keyword_row = group_keywords_df1[mask]
if not keyword_row.empty:
result_check_data.at[i, result_column] = keyword_row['Код'].values[0]
result_check_data.at[i, text_column] = " ".join(keyword_row['Наименование_clean'].values[0])
number += 1
print(f"{keyword_row['Код']} цикл №{number}")