#python #dictionary #nlp #lookup
#python #словарь #nlp #поиск
Вопрос:
Фрейм данных со структурой ниже —
ID text
0 Language processing in python th is great
1 Relace the string
Словарь с именем пользовательского исправления
{'Relace': 'Replace', 'th' : 'three'}
Попробовал код, и результат выглядит следующим образом —
Текущий вывод —
ID text
0 Language processing in pythirdon three is great
1 Replace threee string
Код:
def multiple_replace(dict, text):
# Create a regular expression from the dictionary keys
regex = re.compile("(%s)" % "|".join(map(re.escape, dict.keys())))
# For each match, look-up corresponding value in dictionary
return regex.sub(lambda mo: dict[mo.string[mo.start():mo.end()]], text)
df['col1'] = df.apply(lambda row: multiple_replace(custom_fix, row['text']), axis=1)
Ожидаемый результат —
ID text
0 Language processing in python three is great
1 Replace the string
Ответ №1:
Я не эксперт по регулярным выражениям, и, возможно, это не лучшее решение, но использование границ слов b
в вашем регулярном выражении должно решить проблему, здесь исправлена функция:
def multiple_replace(d, text):
# Create a regular expression from the dictionary keys
regex = re.compile("(%s)" % "|".join(["\b" x "\b" for x in d.keys()]))
# For each match, look-up corresponding value in dictionary
return regex.sub(lambda mo: d[mo.string[mo.start():mo.end()]], text)
Ответ №2:
Вы также можете разделить строку, чтобы получить все слова и выполнить итерацию по списку.
def multiple_replace(d, text):
splitText=text.split()
disc=len(set(splitText).intersection(set(d.keys())))
if disc==0:
return ' '.join(splitText)
else:
for k in range(len(splitText)):
try:
splitText[k]=d[splitText[k]]
except KeyError:
pass
return ' '.join(splitText)
Надеюсь, это поможет.
Комментарии:
1. С точки зрения эффективности, я считаю, что замена словаря будет быстрее. Что вы думаете?
2. Я также считаю, что словарь — это более быстрый метод, однако список генерируется, чтобы избежать скользящего эффекта регулярного выражения.