Параллелизировать строку заменить в пандах - PullRequest
0 голосов
/ 10 мая 2018

У меня есть два кадра данных панд. Один содержит текст, другой набор терминов, которые я хотел бы найти и заменить в тексте. Существует много вариантов текста, в которых одно и то же слово может встречаться в тексте несколько раз и иметь несколько терминов.

Я создал цикл, который может заменить каждое слово в тексте термином, однако он очень медленный, особенно если учесть, что он работает над большим корпусом.

Мой вопрос: Есть ли способ запустить нижеприведенную функцию в распараллеленном для скорости? Или же функция могла бы использовать Numba или какой-либо другой тип оптимизации, чтобы ускорить ее? Обратите внимание, что в тексте может быть много перестановок, которые необходимо заменить.

Пример текстового фрейма данных:

d = {'ID': [1, 2, 3], 'Text': ['here is some random text', 'random text here', 'more random text']}
text_df = pd.DataFrame(data=d)

Пример условия dataframe:

d = {'Replace_item': ['<RANDOM_REPLACED>', '<HERE_REPLACED>', '<SOME_REPLACED>'], 'Text': ['random', 'here', 'some']}
replace_terms_df = pd.DataFrame(data=d)

Пример текущего решения:

def find_replace(text, terms):
for _, row in terms.iterrows():
    term = row['Text']
    item = row['Replace_item']
    text.Text = text.Text.str.replace(term, item)
    return text
find_replace(text_df, replace_terms_df)

Пожалуйста, дайте мне знать, если что-то выше требует уточнения. Спасибо,

1 Ответ

0 голосов
/ 10 мая 2018

Вы можете использовать векторизованный метод: Series.replace (lst1, lst2, regex = True)

In [90]: (text_df.Text
                 .replace(replace_terms_df.Text.tolist(), 
                          replace_terms_df.Replace_item.tolist(),
                          regex=True))
Out[90]:
0    <HERE_REPLACED> is <SOME_REPLACED> <RANDOM_REP...
1               <RANDOM_REPLACED> text <HERE_REPLACED>
2                          more <RANDOM_REPLACED> text
Name: Text, dtype: object
...