Zastępowanie synonimów i antonimów

Zamiana słów na popularne synonimy

Podczas pracy z NLP, szczególnie w przypadku analizy częstotliwości i indeksowania tekstu, zawsze warto skompresować słownictwo bez utraty znaczenia, ponieważ oszczędza to dużo pamięci. Aby to osiągnąć, musimy zdefiniować przypisanie słowa do jego synonimów. W poniższym przykładzie utworzymy klasę o nazwieword_syn_replacer których można użyć do zastąpienia słów ich popularnymi synonimami.

Przykład

Najpierw zaimportuj niezbędny pakiet re pracować z wyrażeniami regularnymi.

import re
from nltk.corpus import wordnet

Następnie utwórz klasę, która przyjmuje odwzorowanie zamiany słów -

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)

Zapisz ten program w Pythonie (powiedzmy Replacesyn.py) i uruchom go z wiersza poleceń Pythona. Po uruchomieniu zaimportujword_syn_replacerclass, gdy chcesz zamienić słowa na popularne synonimy. Zobaczmy, jak to zrobić.

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

Wynik

'birthday'

Kompletny przykład wdrożenia

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)

Teraz, po zapisaniu powyższego programu i uruchomieniu go, możesz zaimportować klasę i używać jej w następujący sposób -

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

Wynik

'birthday'

Wadą powyższej metody jest to, że powinniśmy zakodować synonimy na stałe w słowniku Pythona. Mamy dwie lepsze alternatywy w postaci pliku CSV i YAML. Możemy zapisać nasze słownictwo synonimów w każdym z wyżej wymienionych plików i konstruowaćword_mapsłownik z nich. Zrozummy koncepcję za pomocą przykładów.

Korzystanie z pliku CSV

Aby użyć w tym celu pliku CSV, plik powinien mieć dwie kolumny, pierwsza kolumna zawiera słowo, a druga zawiera synonimy, które mają je zastąpić. Zapiszmy ten plik jakosyn.csv. W poniższym przykładzie utworzymy klasę o nazwie CSVword_syn_replacer który się rozszerzy word_syn_replacer w replacesyn.py plik i będzie używany do konstruowania pliku word_map słownik z syn.csv plik.

Przykład

Najpierw zaimportuj niezbędne pakiety.

import csv

Następnie utwórz klasę, która przyjmuje odwzorowanie zamiany słów -

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)

Po uruchomieniu zaimportuj CSVword_syn_replacerclass, gdy chcesz zamienić słowa na popularne synonimy. Zobaczmy jak?

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

Wynik

'birthday'

Kompletny przykład wdrożenia

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)

Teraz, po zapisaniu powyższego programu i uruchomieniu go, możesz zaimportować klasę i używać jej w następujący sposób -

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

Wynik

'birthday'

Korzystanie z pliku YAML

Ponieważ użyliśmy pliku CSV, możemy również użyć do tego pliku YAML (musimy mieć zainstalowany PyYAML). Zapiszmy plik jakosyn.yaml. W poniższym przykładzie utworzymy klasę o nazwie YAMLword_syn_replacer który się rozszerzy word_syn_replacer w replacesyn.py plik i będzie używany do konstruowania pliku word_map słownik z syn.yaml plik.

Przykład

Najpierw zaimportuj niezbędne pakiety.

import yaml

Następnie utwórz klasę, która przyjmuje odwzorowanie zamiany słów -

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

Po uruchomieniu zaimportuj YAMLword_syn_replacerclass, gdy chcesz zamienić słowa na popularne synonimy. Zobaczmy jak?

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

Wynik

'birthday'

Kompletny przykład wdrożenia

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)

Teraz, po zapisaniu powyższego programu i uruchomieniu go, możesz zaimportować klasę i używać jej w następujący sposób -

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

Wynik

'birthday'

Zastąpienie antonimu

Jak wiemy, antonim to słowo o znaczeniu przeciwstawnym do innego słowa, a przeciwieństwo zamiany synonimu nazywa się zamianą antonimu. W tej sekcji zajmiemy się zastępowaniem antonimów, czyli zamianą słów na jednoznaczne antonimy za pomocą WordNet. W poniższym przykładzie utworzymy klasę o nazwieword_antonym_replacer które mają dwie metody, jedną do zastępowania słowa, a drugą do usuwania negacji.

Przykład

Najpierw zaimportuj niezbędne pakiety.

from nltk.corpus import wordnet

Następnie utwórz klasę o nazwie 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

Zapisz ten program w języku Python (powiedzmy replaceantonym.py) i uruchom go z wiersza poleceń Pythona. Po uruchomieniu zaimportujword_antonym_replacerclass, gdy chcesz zamienić słowa na ich jednoznaczne antonimy. Zobaczmy, jak to zrobić.

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

Wynik

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

Wynik

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

Kompletny przykład wdrożenia

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

Teraz, po zapisaniu powyższego programu i uruchomieniu go, możesz zaimportować klasę i używać jej w następujący sposób -

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)

Wynik

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