Замена синонима и антонима

Замена слов на общие синонимы

При работе с НЛП, особенно в случае частотного анализа и индексации текста, всегда полезно сжать словарный запас, не теряя смысла, потому что это экономит много памяти. Чтобы добиться этого, мы должны определить отображение слова на его синонимы. В приведенном ниже примере мы создадим класс с именемword_syn_replacer которые можно использовать для замены слов их общими синонимами.

пример

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

import re
from nltk.corpus import wordnet

Затем создайте класс, который принимает сопоставление замены слов -

class word_syn_replacer(object):
   def __init__(self, word_map):
   self.word_map = word_map
def replace(self, word):
   return self.word_map.get(word, word)

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

from replacesyn import word_syn_replacer
rep_syn = word_syn_replacer ({‘bday’: ‘birthday’)
rep_syn.replace(‘bday’)

Вывод

'birthday'

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

import re
from nltk.corpus import wordnet
class word_syn_replacer(object):
   def __init__(self, word_map):
   self.word_map = word_map
def replace(self, word):
   return self.word_map.get(word, word)

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

from replacesyn import word_syn_replacer
rep_syn = word_syn_replacer ({‘bday’: ‘birthday’)
rep_syn.replace(‘bday’)

Вывод

'birthday'

Недостаток описанного выше метода заключается в том, что нам придется жестко кодировать синонимы в словаре Python. У нас есть две лучшие альтернативы в виде файлов CSV и YAML. Мы можем сохранить наш словарь синонимов в любом из вышеупомянутых файлов и можем построитьword_mapсловарь от них. Разберемся с концепцией на примерах.

Использование файла CSV

Чтобы использовать файл CSV для этой цели, файл должен иметь два столбца, первый столбец состоит из слова, а второй столбец состоит из синонимов, предназначенных для его замены. Сохраним этот файл какsyn.csv. В приведенном ниже примере мы создадим класс с именем CSVword_syn_replacer который будет расширять word_syn_replacer в replacesyn.py файл и будет использоваться для создания word_map словарь из syn.csv файл.

пример

Сначала импортируйте необходимые пакеты.

import csv

Затем создайте класс, который принимает сопоставление замены слов -

class CSVword_syn_replacer(word_syn_replacer):
   def __init__(self, fname):
      word_map = {}
      for line in csv.reader(open(fname)):
         word, syn = line
         word_map[word] = syn
      super(Csvword_syn_replacer, self).__init__(word_map)

После его запуска импортируйте CSVword_syn_replacerкласс, когда вы хотите заменить слова обычными синонимами. Посмотрим, как?

from replacesyn import CSVword_syn_replacer
rep_syn = CSVword_syn_replacer (‘syn.csv’)
rep_syn.replace(‘bday’)

Вывод

'birthday'

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

import csv
class CSVword_syn_replacer(word_syn_replacer):
def __init__(self, fname):
word_map = {}
for line in csv.reader(open(fname)):
   word, syn = line
   word_map[word] = syn
super(Csvword_syn_replacer, self).__init__(word_map)

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

from replacesyn import CSVword_syn_replacer
rep_syn = CSVword_syn_replacer (‘syn.csv’)
rep_syn.replace(‘bday’)

Вывод

'birthday'

Использование файла YAML

Поскольку мы использовали файл CSV, мы также можем использовать для этой цели файл YAML (у нас должен быть установлен PyYAML). Сохраним файл какsyn.yaml. В приведенном ниже примере мы создадим класс с именем YAMLword_syn_replacer который будет расширять word_syn_replacer в replacesyn.py файл и будет использоваться для создания word_map словарь из syn.yaml файл.

пример

Сначала импортируйте необходимые пакеты.

import yaml

Затем создайте класс, который принимает сопоставление замены слов -

class YAMLword_syn_replacer(word_syn_replacer):
   def __init__(self, fname):
   word_map = yaml.load(open(fname))
   super(YamlWordReplacer, self).__init__(word_map)

После его запуска импортируйте YAMLword_syn_replacerкласс, когда вы хотите заменить слова обычными синонимами. Посмотрим, как?

from replacesyn import YAMLword_syn_replacer
rep_syn = YAMLword_syn_replacer (‘syn.yaml’)
rep_syn.replace(‘bday’)

Вывод

'birthday'

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

import yaml
class YAMLword_syn_replacer(word_syn_replacer):
def __init__(self, fname):
   word_map = yaml.load(open(fname))
   super(YamlWordReplacer, self).__init__(word_map)

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

from replacesyn import YAMLword_syn_replacer
rep_syn = YAMLword_syn_replacer (‘syn.yaml’)
rep_syn.replace(‘bday’)

Вывод

'birthday'

Замена антонима

Как мы знаем, антоним - это слово, имеющее противоположное значение другому слову, а противоположность замены синонима называется заменой антонима. В этом разделе мы будем иметь дело с заменой антонимов, т. Е. Заменой слов однозначными антонимами с помощью WordNet. В приведенном ниже примере мы создадим класс с именемword_antonym_replacer которые имеют два метода: один для замены слова, а другой для удаления отрицаний.

пример

Сначала импортируйте необходимые пакеты.

from nltk.corpus import wordnet

Затем создайте класс с именем word_antonym_replacer -

class word_antonym_replacer(object):
   def replace(self, word, pos=None):
      antonyms = set()
      for syn in wordnet.synsets(word, pos=pos):
         for lemma in syn.lemmas():
            for antonym in lemma.antonyms():
               antonyms.add(antonym.name())
      if len(antonyms) == 1:
         return antonyms.pop()
      else:
         return None
   def replace_negations(self, sent):
      i, l = 0, len(sent)
      words = []
      while i < l:
         word = sent[i]
         if word == 'not' and i+1 < l:
            ant = self.replace(sent[i+1])
            if ant:
               words.append(ant)
               i += 2
               continue
         words.append(word)
         i += 1
      return words

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

from replacerantonym import word_antonym_replacer
rep_antonym = word_antonym_replacer ()
rep_antonym.replace(‘uglify’)

Вывод

['beautify'']
sentence = ["Let us", 'not', 'uglify', 'our', 'country']
rep_antonym.replace _negations(sentence)

Вывод

["Let us", 'beautify', 'our', 'country']

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

nltk.corpus import wordnet
class word_antonym_replacer(object):
def replace(self, word, pos=None):
   antonyms = set()
   for syn in wordnet.synsets(word, pos=pos):
      for lemma in syn.lemmas():
      for antonym in lemma.antonyms():
         antonyms.add(antonym.name())
   if len(antonyms) == 1:
      return antonyms.pop()
   else:
      return None
def replace_negations(self, sent):
   i, l = 0, len(sent)
   words = []
   while i < l:
      word = sent[i]
      if word == 'not' and i+1 < l:
         ant = self.replace(sent[i+1])
         if ant:
            words.append(ant)
            i += 2
            continue
      words.append(word)
      i += 1
   return words

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

from replacerantonym import word_antonym_replacer
rep_antonym = word_antonym_replacer ()
rep_antonym.replace(‘uglify’)
sentence = ["Let us", 'not', 'uglify', 'our', 'country']
rep_antonym.replace _negations(sentence)

Вывод

["Let us", 'beautify', 'our', 'country']