Использование регулярных выражений для охвата группы ключей в словаре и сопоставления их внутри списка строк

#python #text #nlp #data-cleaning #regexp-replace

#python #текст #nlp #очистка данных #регулярное выражение-замена

Вопрос:

Я новичок в очистке текста на python, но в настоящее время я создал словарь с различными жаргонными словами / сокращениями / сокращениями, который выглядит примерно так:

fulltext = {‘BYOB’: ‘принеси свое пиво’, ‘не смог’: ‘не смог’, ‘finna’: ‘собираюсь’} … и т.д.

и у меня есть еще один большой массив текстовых данных:

uncleaned_text = [‘Это точно безумие’, ‘Я не знаю, почему мы не могли быть там’, ‘Я должен был знать, когда событие было BYOB, что это будет ужасно’]

Для чего я пытаюсь «очистить», заменив те слова внутри списка строк, которые соответствуют ключам словаря, их соответствующими значениями. Итак, мой идеальный результат был бы:

очищенный текст = [«Это будет безумие», «Я не знаю, почему мы не могли быть там», «Я должен был знать, когда мероприятие было bring your own beer, что это будет ужасно»]

Я знаю, что должен каким-то образом использовать регулярные выражения, и я знаю, что должен использовать циклы, но я определенно даже не близок к тому, что я должен делать, я думаю, потому что ошибка, которую я получаю, — это встроенная функция, не подлежащая повторению…

Есть предложения?

для предложения в uncleaned_text: для слова в предложении: если слово в fulltext.keys: word.replace(word, fulltext.key)

Ответ №1:

Ошибка, которую вы получаете, заключается в том, что dictionary.keys это функция, а не список. Итак, чтобы получить все ключи, вы хотели бы использовать fulltext.keys() not fulltext.keys . Член keys класса dictionary — это функция, которая возвращает список ключей. Более питонический способ проверки наличия определенного слова в ключах словаря: if key in dictionary . in Оператор проверяет, является ли левый операнд ключом в словаре, поэтому вам не нужно использовать .keys функцию.

Для остальной части функции я бы сделал следующее:

 clean_text = []
for sentence in uncleaned_text:
  for word in sentence.split():
    if word in fulltext: 
      sentence = sentence.replace(word, fulltext[word])
  clean_text.append(sentence)

  

Внесенные мной изменения объясняли:

  1. вам нужно будет разбить предложение на слова. Предложение — это просто длинная строка, поэтому, если вы выполните итерацию по ней, вы получите каждый символ предложения по отдельности. Метод .split по умолчанию разбивает его на все пробелы.
  2. Метод replace не изменяет строку на месте, поэтому вам нужно перехватить ее в какой-либо другой переменной.
  3. Чтобы получить значение из словаря, вам нужно использовать ключ. В данном случае Word является нашим ключом, поэтому я изменил fulltext.key его на be fulltext[word] . Это возвращает значение, связанное с word из полнотекстового словаря.
  4. Добавлен массив для добавления измененных предложений.

При этом исходный list ( uncleaned_text ) останется неизменным.

Комментарии:

1. Спасибо, это имеет большой смысл!! Я не понимал, что могу использовать «in» и для строк (по какой-то причине думал, что это целые числа), поэтому я обязательно добавлю это в свой набор инструментов.

2. Да! Это очень полезно. Если вы нашли один из ответов полезным, не могли бы вы принять его? Это помогает всем, потому что пользователи не будут рассматривать этот вопрос как вопрос без ответа.

Ответ №2:

Это может быть полезно:

 import re

fulltext = {"BYOB": "bring your own beer", "couldn't": "could not", "finna": "going to"}
uncleaned_text = ["This is finna be crazy", "I don't know why we couldn't be there", "I should have known when the event was BYOB that it would be terrible"]
cleaned_text = []
keys = fulltext.keys()
for text in uncleaned_text:
    for key in keys:
        if key in text:
            cleaned_text.append(re.sub(key,fulltext[key],text))
print("cleaned_text => ",cleaned_text)
  

Однако выполнение этого кода займет много времени, если у вас много данных из-за вложенного цикла for.

Комментарии:

1. Спасибо! Это абсолютно полезно.