見出し画像

【Python】無料で類語辞典を作る。

 先日、Pythonを使って青空文庫から用例辞典を作るという記事を書きました。

 今回はPythonを使って、無料で類語辞典を作成したいと思います。
 無料の類語辞典といえば、Weblioが有名ですね。私もよく使います。

 しかし、このWeblioには大きな欠点があります
 それはネットに繋がないと使えないということです
 意志の弱い我々にとってこれは由々しき事態です。
 ネットに繋がった途端に、TwitterやYou Tubeなどの誘惑に負けてしまいます
 ですので、ネットに繋がずに使える類語辞典がほしいところですが、辞典とは高価な商品です。

 そこで無料で作成してみようと思いました。

 ここからが本題です。

 辞書のデータは国立研究開発法人情報通信研究機構が公開しているWordnetを使用します。

 こちらの「リリースとダウンロード」から「Japanese Wordnet and English WordNet in an sqlite3 database」をダウンロードします。
 wnjpn.dbというファイルを手に入れることができます。
 中身を簡単に説明しますと、単語と単語の概念(=単語の意味)が収録されています。
 単語と概念は1対1対応をしているわけではありません。

 例えば、「楽しい」という単語に対しては、

概念1:満足または喜びを与えるさま
概念2:嬉しさや喜びを楽しむこと、見せること、あるいは特徴とするさま
概念3:あなたの趣味または好みと調和してあること
概念4:好きなことができる
概念5:楽しみと陽気さを提供する
概念6:愛想が良く面白い
概念7:大いに喜ばせるかまたは楽しませるさま

という概念が結びついています。
 逆に、「満足または喜びを与えるさま」という概念には、

 愉快
 満足
 痛快
 面白い など

という単語が結びついています。
 「同じ概念を持つ単語を類語と呼ぶ」ことにします。
 模式化すると下の図のようなイメージです。オレンジ色四角が単語、青色丸が概念を表します。

画像1

 これらの単語を拾い上げるプログラムを組みます。

 今回、プログラムの作成に当たり以下2つのサイトを参考にしました。
 (参考にしたというより、ほぼほぼ丸パクリです)

import sqlite3
conn = sqlite3.connect("wnjpn.db")

# 入力された単語(lemma)のWordIDを取得する
def getWordID(lemma):
   cur = conn.execute("select wordid from word where lemma='%s'" % lemma)
   for row in cur:
       wordid = row[0]
   return wordid


# WordIDから概念ID(synset)の一覧synsetsを作成する。
def getSynsetIDs(wordid):
   synsets = []
   cur = conn.execute("select synset from sense where wordid='%s'" % wordid)
   for row in cur:
       synsets.append(row[0])
   return synsets

# 概念ID(synset)の意味(def)を取得する。
def getDefFromSynset(synset):
   cur = conn.execute("select def from synset_def where (synset='%s' and lang='jpn')" % synset)
   for row in cur:
       synset_def = row[0]
   return synset_def


# 概念ID(synset)を含む単語一覧(lemmasets)を取得する。つまり,類義語を取得する。

def getWordsFromSynset(synset,wordid):
   lemmasets = []
   cur1 = conn.execute("select wordid from sense where (synset='%s' and wordid!='%s' and lang='jpn')" % (synset,wordid))
   for row1 in cur1:
       tg_wordid = row1[0]
       cur2 = conn.execute("select lemma from word where wordid=%s" % tg_wordid)
       for row2 in cur2:
           lemmasets.append(row2[0])
   return lemmasets

def main():
   print("検索する単語を入力しエンターを押してください。\n終了する場合は×ボタンを押してください。")
   lemma = input()
   # 入力された単語が存在しない場合はスキップする。
   try:
       wordid = getWordID(lemma)
   except:
       print("\nこの単語は登録されていませんでした。\n")
       main()
   synsets = getSynsetIDs(wordid)
   counter1 = 1
   for synset in synsets:
       print("概念" + str(counter1) + ":" +getDefFromSynset(synset))
       counter1 += 1 
       lemmasets = getWordsFromSynset(synset,wordid)
       counter2 = 1
       for lemma in lemmasets:
           print(" 類"+str(counter2)+":"+lemma)
           counter2 += 1
   print("\n検索結果は以上です。\n")
   main()

main()

 このプログラムをwnjpn.dbと同じ場所に置き実行すると、検索する単語を入力するように求められます。
 「楽しい」と入力した場合、結果はこんな感じになります。

検索する単語を入力しエンターを押してください。
終了する場合は×ボタンを押してください。
楽しい
概念1:満足または喜びを与えるさま
 類1:愉快
 類2:おもしろい
 類3:悦ばしい
 類4:満足
 類5:心嬉しい
 類6:痛快
 類7:愉しい
 類8:心うれしい
 類9:面白い
概念2:嬉しさや喜びを楽しむこと、見せること、あるいは特徴とするさま
 類1:うれしい
 類2:愉しげ
 類3:明るい
 類4:仕合わせ
 類5:ご機嫌
 類6:楽しげ
 類7:悦ばしい
 類8:御機嫌
 類9:ハッピー
 類10:心嬉しい
 類11:大喜び
 類12:幸福
 類13:幸せ
 類14:喜ばしい
 類15:仕合せ
 類16:嬉しい
 類17:心うれしい
 類18:嬉々たる
概念3:あなたの趣味または好みと調和してあること
 類1:愉しげ
 類2:心地良い
 類3:よい
 類4:好い
 類5:快然たる
 類6:愉快
 類7:気持ち良い
 類8:楽しげ
 類9:快い
 類10:麗しい
 類11:快適
 類12:いい
 類13:好いたらしい
 類14:良い
 類15:心地よい
 類16:善い
 類17:愉しい
 類18:嬉しい
 類19:心地好い
概念4:好きなことができる
概念5:楽しみと陽気さを提供する
 類1:楽しげ
 類2:賑やか
 類3:面白い
概念6:愛想が良く面白い
 類1:可笑しい
 類2:面白い
概念7:大いに喜ばせるかまたは楽しませるさま
 類1:おもろい
 類2:愉快
 類3:おもしろい
 類4:悦ばしい
 類5:小気味好い
 類6:心嬉しい
 類7:愉しい
 類8:喜ばしい
 類9:心うれしい
 類10:小気味よい
 類11:面白い

 簡単な単語なら検索可能ですが、例えば、歩き方の表現を知りたいと思い「忍び足」と検索してもヒットしませんでした。
 weblioなら「忍び足・抜き足・差し足・すり足・摺り足・盗み足」と教えてくれます。
 このプログラム→Web→紙の辞書の順に調べるといいかもしれません。

 今回作成したプログラムです。


最後までお読みいただきありがとうございます。「スキ」をしていただけるととても励みになります。