Инструментарий для естественного языка - замена слов

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

Но зачем нам нужна была замена слов? Предположим, что если мы говорим о токенизации, то у нее есть проблемы со сжатием (например, не могу, не буду и т. Д.). Итак, чтобы справиться с такими проблемами, нам нужна замена слов. Например, мы можем заменить сокращения их развернутыми формами.

Замена слова с помощью регулярного выражения

Во-первых, мы собираемся заменить слова, соответствующие регулярному выражению. Но для этого мы должны иметь базовое представление о регулярных выражениях, а также о модуле python re. В приведенном ниже примере мы заменим сокращение их развернутыми формами (например, «не могу» будет заменено на «не могу»), и все это с помощью регулярных выражений.

пример

Сначала импортируйте необходимый пакет re для работы с регулярными выражениями.

import re
from nltk.corpus import wordnet

Затем определите шаблоны замены по вашему выбору следующим образом:

R_patterns = [
   (r'won\'t', 'will not'),
   (r'can\'t', 'cannot'),
   (r'i\'m', 'i am'),
   r'(\w+)\'ll', '\g<1> will'),
   (r'(\w+)n\'t', '\g<1> not'),
   (r'(\w+)\'ve', '\g<1> have'),
   (r'(\w+)\'s', '\g<1> is'),
   (r'(\w+)\'re', '\g<1> are'),
]

Теперь создайте класс, который можно использовать для замены слов -

class REReplacer(object):
   def __init__(self, pattern = R_patterns):
      self.pattern = [(re.compile(regex), repl) for (regex, repl) in patterns]
   def replace(self, text):
      s = text
      for (pattern, repl) in self.pattern:
         s = re.sub(pattern, repl, s)
      return s

Сохраните эту программу python (скажем, repRE.py) и запустите ее из командной строки python. После его запуска импортируйте класс REReplacer, если хотите заменить слова. Посмотрим, как это сделать.

from repRE import REReplacer
rep_word = REReplacer()
rep_word.replace("I won't do it")
Output:
'I will not do it'
rep_word.replace("I can’t do it")
Output:
'I cannot do it'

Полный пример реализации

import re
from nltk.corpus import wordnet
R_patterns = [
   (r'won\'t', 'will not'),
   (r'can\'t', 'cannot'),
   (r'i\'m', 'i am'),
   r'(\w+)\'ll', '\g<1> will'),
   (r'(\w+)n\'t', '\g<1> not'),
   (r'(\w+)\'ve', '\g<1> have'),
   (r'(\w+)\'s', '\g<1> is'),
   (r'(\w+)\'re', '\g<1> are'),
]
class REReplacer(object):
def __init__(self, patterns=R_patterns):
   self.patterns = [(re.compile(regex), repl) for (regex, repl) in patterns]
def replace(self, text):
   s = text
   for (pattern, repl) in self.patterns:
      s = re.sub(pattern, repl, s)
   return s

Теперь, когда вы сохранили вышеуказанную программу и запустили ее, вы можете импортировать класс и использовать его следующим образом:

from replacerRE import REReplacer
rep_word = REReplacer()
rep_word.replace("I won't do it")

Вывод

'I will not do it'

Замена перед обработкой текста

Одна из распространенных практик при работе с обработкой естественного языка (NLP) - очистка текста перед обработкой текста. В этом отношении мы также можем использовать нашREReplacer класс, созданный выше в предыдущем примере, в качестве предварительного шага перед обработкой текста, то есть токенизацией.

пример

from nltk.tokenize import word_tokenize
from replacerRE import REReplacer
rep_word = REReplacer()
word_tokenize("I won't be able to do this now")
Output:
['I', 'wo', "n't", 'be', 'able', 'to', 'do', 'this', 'now']
word_tokenize(rep_word.replace("I won't be able to do this now"))
Output:
['I', 'will', 'not', 'be', 'able', 'to', 'do', 'this', 'now']

В приведенном выше рецепте Python мы можем легко понять разницу между выводом токенизатора слов без и с использованием замены регулярного выражения.

Удаление повторяющихся символов

Соблюдаем ли мы грамматику в нашем повседневном языке? Нет, мы не. Например, иногда мы пишем «Hiiiiiiiiiiii Mohan», чтобы подчеркнуть слово «Hi». Но компьютерная система не знает, что «Hiiiiiiiiiiii» - это вариант слова «Hi». В приведенном ниже примере мы создадим класс с именемrep_word_removal который можно использовать для удаления повторяющихся слов.

пример

Сначала импортируйте необходимый пакет re для работы с регулярными выражениями

import re
from nltk.corpus import wordnet

Теперь создайте класс, который можно использовать для удаления повторяющихся слов -

class Rep_word_removal(object):
   def __init__(self):
      self.repeat_regexp = re.compile(r'(\w*)(\w)\2(\w*)')
      self.repl = r'\1\2\3'
   def replace(self, word):
      if wordnet.synsets(word):
      return word
   repl_word = self.repeat_regexp.sub(self.repl, word)
   if repl_word != word:
      return self.replace(repl_word)
   else:
      return repl_word

Сохраните эту программу Python (скажем, removerepeat.py) и запустите ее из командной строки python. После его запуска импортируйтеRep_word_removalкласс, когда вы хотите удалить повторяющиеся слова. Посмотрим, как?

from removalrepeat import Rep_word_removal
rep_word = Rep_word_removal()
rep_word.replace ("Hiiiiiiiiiiiiiiiiiiiii")
Output:
'Hi'
rep_word.replace("Hellooooooooooooooo")
Output:
'Hello'

Полный пример реализации

import re
from nltk.corpus import wordnet
class Rep_word_removal(object):
   def __init__(self):
      self.repeat_regexp = re.compile(r'(\w*)(\w)\2(\w*)')
      self.repl = r'\1\2\3'
   def replace(self, word):
      if wordnet.synsets(word):
         return word
   replace_word = self.repeat_regexp.sub(self.repl, word)
   if replace_word != word:
      return self.replace(replace_word)
   else:
      return replace_word

Теперь, когда вы сохранили вышеуказанную программу и запустили ее, вы можете импортировать класс и использовать его следующим образом:

from removalrepeat import Rep_word_removal
rep_word = Rep_word_removal()
rep_word.replace ("Hiiiiiiiiiiiiiiiiiiiii")

Вывод

'Hi'