同義語と反意語の置換

単語を一般的な同義語に置き換える

NLPを使用している間、特に頻度分析とテキストインデックス作成の場合は、多くのメモリを節約できるため、意味を失うことなく語彙を圧縮することが常に有益です。これを実現するには、単語の同義語へのマッピングを定義する必要があります。以下の例では、という名前のクラスを作成します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ファイルの形式で2つのより良い選択肢があります。同義語の語彙を上記のファイルのいずれかに保存して、構築することができますword_mapそれらからの辞書。例を使って概念を理解しましょう。

CSVファイルを使用する

この目的でCSVファイルを使用するには、ファイルに2つの列が必要です。最初の列は単語で構成され、2番目の列はそれを置き換えるための同義語で構成されます。このファイルを次のように保存しましょうsyn.csv. 以下の例では、という名前のクラスを作成します CSVword_syn_replacer 伸びる word_syn_replacerreplacesyn.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_replacerreplacesyn.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 単語を置き換える方法と否定を削除する方法の2つの方法があります。

まず、必要なパッケージをインポートします。

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']