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()による単語間の意味的類似度の計算
これらの機能は、検索クエリの拡張、チャットボットの応答生成、テキストマイニングなど、さまざまな自然言語処理タスクの基盤として幅広く活用できます。
-
Python Tkinterでチェックボックスの入力値を取得する方法
チェックボックスウィジェットは、「オン(True)」と「オフ(False)」の2つの状態を持つ入力ウィジェットです。設定の有効・無効の切り替えや、利用規約への同意確認など、特定の値を検証したい場面で幅広く活用されています。ここでは、チェックボックスが選択されたときに、その選択状態(入力値)を取得して出力する方法を紹介します。Tkinterでチェックボックスの値を取得するには、get()メソッドを使用します。このメソッドは、チェックボックスに関連付けられた変数の現在の値を返します。サンプルコード# Tkinterライブラリをインポート from tkinter import * # tkint
-
【Python】Tkinterでラベルのテキストを削除する方法をわかりやすく解説
Tkinterは、PythonでGUIベースのアプリケーションを作成・開発するための標準ライブラリです。この記事では、何らかのテキストが表示されているラベルから、そのテキストを削除する方法を解説します。 ラベルからテキストを削除するには、ラベルの表示を切り替えるトリガーとして機能するボタンを作成します。具体的には、config()メソッドを使ってラベルのtext属性を空の文字列に書き換えます。 サンプルコード # Tkinterライブラリをインポート from tkinter import * # tkinterフレームのインスタンスを作成 win = Tk() # ウィンドウのサイズを