Python
 Computer >> コンピューター >  >> プログラミング >> Python

PythonのNLTK WordNetで同義語・反意語を取得する方法

WordNetとは

WordNetは、Pythonの自然言語処理ツールキット「NLTK(Natural Language Toolkit)」に含まれる大規模な英語辞書データベースです。名詞・形容詞・副詞・動詞が収録されており、意味の近い単語同士はsynset(シネット)と呼ばれる認知的同義語のグループにまとめられています。

事前準備:NLTKとWordNetのインストール

WordNetを利用するには、まずNLTKモジュールをインストールし、その後WordNetパッケージをダウンロードします。

$ sudo pip3 install nltk
$ python3
>>> import nltk
>>> nltk.download('wordnet')

WordNetの中では、同じような意味を持つ単語がいくつかのグループに分けて登録されています。

単語の意味や詳細情報を取得する

最初の例では、指定した単語についてWordNetが返す意味やその他の詳細情報を確認します。用例(examples)が登録されている場合は、それも併せて表示されます。

サンプルコード

from nltk.corpus import wordnet   # NLTKからwordnetをインポート
synset = wordnet.synsets("Travel")
print('Word and Type : ' + synset[0].name())
print('Synonym of Travel is: ' + synset[0].lemmas()[0].name())
print('The meaning of the word : ' + synset[0].definition())
print('Example of Travel : ' + str(synset[0].examples()))

実行結果

$ python3 322a.word_info.py
Word and Type : travel.n.01
Synonym of Travel is: travel
The meaning of the word : the act of going from one place to another
Example of Travel : ['he enjoyed selling but he hated the travel']
$

このようにsynsets()メソッドを使えば、単語の品詞情報(travel.n.01の「n」は名詞を表す)や定義文、実際の用例を簡単に取得できます。

同義語と反意語を取得する

次に、特定の単語に対してWordNetから同義語と反意語を取得する方法を見ていきましょう。lemmas()で各synsetの見出し語を取り出し、antonyms()メソッドで反意語の有無を判定します。

サンプルコード

import nltk
from nltk.corpus import wordnet   # NLTKからwordnetをインポート
syn = list()
ant = list()
for synset in wordnet.synsets("Worse"):
   for lemma in synset.lemmas():
      syn.append(lemma.name())    # 同義語をリストに追加
      if lemma.antonyms():    # 反意語が存在する場合はリストに追加
         ant.append(lemma.antonyms()[0].name())
print('Synonyms: ' + str(syn))
print('Antonyms: ' + str(ant))

実行結果

$ python3 322b.syn_ant.py
Synonyms: ['worse', 'worse', 'worse', 'worsened', 'bad', 'bad', 'big', 'bad', 'tough', 'bad', 'spoiled', 'spoilt', 'regretful', 'sorry', 'bad', 'bad', 'uncollectible', 'bad', 'bad', 'bad', 'risky', 'high-risk', 'speculative', 'bad', 'unfit', 'unsound', 'bad', 'bad', 'bad', 'forged', 'bad', 'defective', 'worse']
Antonyms: ['better', 'better', 'good', 'unregretful']
$

出力を見ると、「Worse」には多数の同義語(bad、tough、spoiledなど)が登録されており、反意語としては「better」「good」などが取得できています。同じ単語が複数回現れるのは、異なるsynsetに同じ語形が登録されているためです。重複を避けたい場合は、set(syn)のようにリストを集合に変換するとよいでしょう。

2つの単語の類似度を調べる

NLTKのWordNetには、もう一つ便利な機能があります。それは、2つの単語がどれほど意味的に近いかを数値で判定できる機能です。wup_similarity()メソッド(Wu-Palmer類似度)を使うと、単語ペアの類似度を0〜1の比率で返します。

サンプルコード

import nltk
from nltk.corpus import wordnet     # NLTKからwordnetをインポート
first_word = wordnet.synset("Travel.v.01")
second_word = wordnet.synset("Walk.v.01")
print('Similarity: ' + str(first_word.wup_similarity(second_word)))
first_word = wordnet.synset("Good.n.01")
second_word = wordnet.synset("zebra.n.01")
print('Similarity: ' + str(first_word.wup_similarity(second_word)))

実行結果

$ python3 322c.compare.py
Similarity: 0.6666666666666666
Similarity: 0.09090909090909091
$

「Travel(移動する)」と「Walk(歩く)」はどちらも移動に関連する動詞のため類似度が約0.67と高く、一方「Good(良い)」と「zebra(シマウマ)」のように意味が遠い単語同士では約0.09と低い値になっています。このようにwup_similarity()を活用すれば、単語同士の意味的な近さを客観的に評価できます。

まとめ

NLTKのWordNetを使えば、次のようなことが簡単に実現できます。

  • synsets()による単語の定義・品詞・用例の取得
  • lemmas()antonyms()による同義語・反意語の抽出
  • wup_similarity()による単語間の意味的類似度の計算

これらの機能は、検索クエリの拡張、チャットボットの応答生成、テキストマイニングなど、さまざまな自然言語処理タスクの基盤として幅広く活用できます。

  1. Python Tkinterでチェックボックスの入力値を取得する方法

    チェックボックスウィジェットは、「オン(True)」と「オフ(False)」の2つの状態を持つ入力ウィジェットです。設定の有効・無効の切り替えや、利用規約への同意確認など、特定の値を検証したい場面で幅広く活用されています。ここでは、チェックボックスが選択されたときに、その選択状態(入力値)を取得して出力する方法を紹介します。Tkinterでチェックボックスの値を取得するには、get()メソッドを使用します。このメソッドは、チェックボックスに関連付けられた変数の現在の値を返します。サンプルコード# Tkinterライブラリをインポート from tkinter import * # tkint

  2. 【Python】Tkinterでラベルのテキストを削除する方法をわかりやすく解説

    Tkinterは、PythonでGUIベースのアプリケーションを作成・開発するための標準ライブラリです。この記事では、何らかのテキストが表示されているラベルから、そのテキストを削除する方法を解説します。 ラベルからテキストを削除するには、ラベルの表示を切り替えるトリガーとして機能するボタンを作成します。具体的には、config()メソッドを使ってラベルのtext属性を空の文字列に書き換えます。 サンプルコード # Tkinterライブラリをインポート from tkinter import * # tkinterフレームのインスタンスを作成 win = Tk() # ウィンドウのサイズを