日本語版 WordNet から辞書を作成する

前からフリーの英和辞書のデータが欲しいと思っていて、探していたのだが、WordNetというのがあるらしい。
wordnetは「ライセンスを保持していただければ、基本的に日本語ワードネットは無償で使用、複写、改変、頒布していただけます」らしい。
うれしい情報であるのだが、データ形式がsqlite3のデータベース形式なのである。しかも単純な形式じゃなく、いろいろと構造がややこしい。

出力結果はこんな感じ。
179 abase 凹ます,凹ませる,卑しめる
180 abasement 屈辱,恥,恥辱,汚辱
181 abash まごつかせる,困らせる
182 abashment 内気,羞恥
183 abate 和らぐ,弛む,弱まる,消和,緩む,衰える,鎮まる,静まる
184 abatement 中断,中止,軽減
185 abatis 逆茂木

ちなみにSQLを逆にすれば和英も作れることに気づいた
4464 ほどなく before long,presently,shortly,soon
4465 ほど近い nearby
4466 ほのか dim,faint,shadowy,vague,weak,wispy
4467 ほのぼの darkly,faintly
4468 ほのめかし glimmer,glimmering,inkling,intimation
4469 ほのめかす adumbrate,insinuate,intimate
4470 ほの暗い dim,subdued

Python3.2で動作確認。 2.x だとエンコードの問題があるっぽく、面倒なので3で動かした。
動かすには日本語WordNetのサイトにあるダウンロードから「Japanese Wordnet and English WordNet in an sqlite3 database」を入手する必要がある。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# coding: UTF-8
import sqlite3,pprint
mode = 0; #モード指定 0:英和 1:和英
#ダウンロードした wnjpn.dbのパスを指定
conn = sqlite3.connect("./wnjpn.db")
cur = conn.cursor()
print("running")
if mode == 0: #英和用SQL
cur.execute( "\
SELECT DISTINCT word_en.wordid, word_en.lemma, word_ja.lemma\
FROM sense sense_A, sense sense_B , word word_en , word word_ja \
WHERE word_en.wordid = sense_A.wordid\
and sense_A.lang = 'eng'\
and sense_B.lang = 'jpn'\
and sense_A.synset = sense_B.synset\
and sense_B.wordid = word_ja.wordid\
ORDER BY word_en.lemma"\
)
else : #和英用SQL
cur.execute( "\
SELECT DISTINCT word_ja.wordid, word_ja.lemma, word_en.lemma\
FROM sense sense_A, sense sense_B , word word_en , word word_ja \
WHERE word_ja.wordid = sense_A.wordid\
and sense_A.lang = 'jpn'\
and sense_B.lang = 'eng'\
and sense_A.synset = sense_B.synset\
and sense_B.wordid = word_en.wordid\
ORDER BY word_ja.lemma ASC"\
)
#ワードIDを整理しつつ、結果を一度配列に詰める。
#英単語に含まれるアンダーバーはスペースであるべきなので置換する(ハイフンはハイフンのままで良い)。
before = -1
word_list = []
i = -1
for row in cur:
if before != row[0]:
i = i + 1
word_list.append( [row[1].replace("_"," "),row[2].replace("_"," ")])
before = row[0]
else :
word_list[i][1] += ',' + row[2].replace("_"," ")
#タブ区切りでファイルに出力
f = open('./output.txt', 'w')
i = 1
for word in word_list:
f.write(str(i) + "\t" + word[0] +"\t" + word[1] +"\n")
i += 1
f.close()
print("done")
cur.close()
conn.close()