![見出し画像](https://assets.st-note.com/production/uploads/images/46469872/rectangle_large_type_2_18137db7c3557d7159dace7cd0814d3c.png?width=1200)
【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:大いに喜ばせるかまたは楽しませるさま
という概念が結びついています。
逆に、「満足または喜びを与えるさま」という概念には、
愉快
満足
痛快
面白い など
という単語が結びついています。
「同じ概念を持つ単語を類語と呼ぶ」ことにします。
模式化すると下の図のようなイメージです。オレンジ色四角が単語、青色丸が概念を表します。
これらの単語を拾い上げるプログラムを組みます。
今回、プログラムの作成に当たり以下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→紙の辞書の順に調べるといいかもしれません。
今回作成したプログラムです。
いいなと思ったら応援しよう!
![mei](https://assets.st-note.com/production/uploads/images/73164065/profile_f6bc069ae60f14555fe603dc73174adb.jpg?width=600&crop=1:1,smart)