Замена синонима и антонима
Замена слов на общие синонимы
При работе с НЛП, особенно в случае частотного анализа и индексации текста, всегда полезно сжать словарный запас, не теряя смысла, потому что это экономит много памяти. Чтобы добиться этого, мы должны определить отображение слова на его синонимы. В приведенном ниже примере мы создадим класс с именем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']