Используйте регулярные выражения в элементах списка, чтобы заменить целое слово - PullRequest
0 голосов
/ 14 июня 2019

У меня большой набор данных all_transcripts с разговорами, и у меня есть небольшой список gemeentes, содержащий названия разных городов.В all_transcripts я хочу заменить каждый экземпляр, в котором дано название города, на «woonplaats» (нидерландский для города).

Для этого у меня есть следующий код:

all_transcripts['filtered'] = all_transcripts['no_punc'].str.replace('|'.join(gemeentes),' woonplaats ')

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

ЧтоЯ ищу что-то вроде:

all_transcripts['filtered'] = all_transcripts['no_punc'].re.sub('|'r"\b{}\b".format(join(gemeentes)),' woonplaats ')

Но это не работает.

Например, у меня есть:

all_transcripts['no_punc'] = ['i live in amsterdam', 'i come from haarlem', 'groningen is her favourite city']

gemeentes = ['amsterdam', 'rotterdam', 'den haag', 'haarlem', 'groningen']

Вывод, который я хочу получить после запуска кода, выглядит следующим образом:

>>> ['i live in woonplaats', 'i come from woonplaats', 'woonplaats is her favourite city']

До того, как яМы работали с опцией '\ b' регулярных выражений.Однако я не знаю, как применить это здесь.Я мог бы запустить цикл for для каждого слова в gemeentes и применить его ко всему набору данных.Но учитывая его размер (gemeentes имеет более 300 переменных и all_transcripts более 2,5 миллионов строк), это будет очень затратно для вычислений и, следовательно, я хотел бы использовать такой же подход, как и выше, в котором я заменяю строку, используя оператор OR.

Ответы [ 2 ]

2 голосов
/ 14 июня 2019

Похоже, вы близко, но вы захотите немного изменить свой re.sub звонок.Примерно так должно работать:

gemeentes = ['amsterdam', 'rotterdam', 'den haag', 'haarlem', 'groningen']
all_transcripts['filtered'] = [re.sub(r"\b({})\b".format("|".join(gemeentes)), "woonplaats", s) for s in all_transcripts['no_punc']]

Вывод

all_transcripts ['отфильтровано'] = ['я живу в woonplaats', 'я из woonplaats', 'woonplaats isее любимый город ']

Что касается производительности, я не уверен, что вы получите более высокие скорости из этого по сравнению с традиционным циклом for, поскольку вам все еще придется повторять цикл25 миллионов записей и применить регулярное выражение.

0 голосов
/ 14 июня 2019

Если вы используете pandas dataframe, вы можете использовать следующее:

import pandas as pd

all_transcripts['filtered']= all_transcripts.replace([amsterdam', 'rotterdam', 'den haag', 'haarlem', 'groningen'], "woonplaats", regex=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...