Dataframe из всех возможных сочетаний синонимов в строках
Есть небольшой датафрейм из предложений. Есть небольшой словарь, где некоторым (в примере, всем) словам из предложений поставлены в соответствие по несколько синонимов. Нужно составить датафрейм из оригинальных запросов и запросов со всеми возможными сочетаниями синонимов.
У меня пока получилось сделать набор из запросов, где на синонимы заменено по одному слову, то есть нигде не используется больше одного синонима какого-либо слова.
Пример кода ниже:
# Пример запросов
df_requests = pd.DataFrame([['word1 word2 word3'],['word4 word5, word6']], columns=['requests_original'])
print(df_requests,'\n\n')
# Пример словаря синонимов.
df_synonyms = pd.DataFrame([['word1','synonym1_1'],
['word1','syninym1_2'],
['word1','syninym1_3'],
['word2','syninym2_1'],
['word2','syninym2_2'],
['word2','syninym2_3'],
['word2','syninym2_4'],
['word3','syninym3_1'],
['word3','syninym3_2'],
['word4','syninym4_1'],
['word4','syninym4_2'],
['word4','syninym4_3'],
['word4','syninym4_4'],
['word5','syninym5_1'],
['word5','syninym5_2'],
['word5','syninym5_3'],
['word6','syninym6_1'],
['word6','syninym6_2'],], columns=['word_original','synonyms'])
print(df_synonyms)
# Заготовка результирующего датафрейма
df_new_reqs = pd.DataFrame(columns=['Запрос оригинальный','Запрос с синонимами'])
# Для каждого предложения из списка оригинальных предложений
for req in range(len(df_requests)):
# Для обобщенного термина из списка обощенных терминов
for term in list(set(df_synonyms.word_original)):
# Создаем список синонимов обобщенных терминов
syns_group = list(df_synonyms[df_synonyms['word_original']==term]['synonyms'])
# Для каждого синонима из группы синонимов обощенного термина заменяем термин синонимом.
for syno in syns_group:
if term in df_requests.iloc[req,0]:
temp_df = pd.DataFrame([[df_requests.iloc[req,0], df_requests.iloc[req,0].replace(term,syno)]],
columns=['Запрос оригинальный',
'Запрос с синонимами'])
df_new_reqs = pd.concat([df_new_reqs,temp_df],axis=0,)
print(df_new_reqs.reset_index(drop=True))
Результат:
requests_original
0 word1 word2 word3
1 word4 word5, word6
word_original synonyms
0 word1 synonym1_1
1 word1 syninym1_2
2 word1 syninym1_3
3 word2 syninym2_1
4 word2 syninym2_2
5 word2 syninym2_3
6 word2 syninym2_4
7 word3 syninym3_1
8 word3 syninym3_2
9 word4 syninym4_1
10 word4 syninym4_2
11 word4 syninym4_3
12 word4 syninym4_4
13 word5 syninym5_1
14 word5 syninym5_2
15 word5 syninym5_3
16 word6 syninym6_1
17 word6 syninym6_2
Запрос оригинальный Запрос с синонимами
0 word1 word2 word3 word1 syninym2_1 word3
1 word1 word2 word3 word1 syninym2_2 word3
2 word1 word2 word3 word1 syninym2_3 word3
3 word1 word2 word3 word1 syninym2_4 word3
4 word1 word2 word3 synonym1_1 word2 word3
5 word1 word2 word3 syninym1_2 word2 word3
6 word1 word2 word3 syninym1_3 word2 word3
7 word1 word2 word3 word1 word2 syninym3_1
8 word1 word2 word3 word1 word2 syninym3_2
9 word4 word5, word6 word4 word5, syninym6_1
10 word4 word5, word6 word4 word5, syninym6_2
11 word4 word5, word6 word4 syninym5_1, word6
12 word4 word5, word6 word4 syninym5_2, word6
13 word4 word5, word6 word4 syninym5_3, word6
14 word4 word5, word6 syninym4_1 word5, word6
15 word4 word5, word6 syninym4_2 word5, word6
16 word4 word5, word6 syninym4_3 word5, word6
17 word4 word5, word6 syninym4_4 word5, word6