Natural-language-toolkit-synonym-antonym-replacement

提供:Dev Guides
移動先:案内検索

同義語と反意語の置換

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

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 という名前のクラスを作成します。これは、 replacesyn.py ファイルの word_syn_replacer を拡張し、 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 という名前のクラスを作成します。これは、 replacesyn.py ファイルの word_syn_replacer を拡張し、 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つのメソッドがあり、1つは単語を置き換えるためのもので、もう1つは否定を削除するためのものです。

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

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