Замена текстовых данных с помощью словаря

#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. Я также считаю, что словарь — это более быстрый метод, однако список генерируется, чтобы избежать скользящего эффекта регулярного выражения.