唯物是真 @Scaled_Wurm

プログラミング(主にPython2.7)とか機械学習とか

Wordnetの中をのぞいてみた

Wordnetって何?

WordNet - Wikipedia
日本語 Wordnet
簡単に言うと同義語などの情報が載った辞書.

中身をのぞいてみよう

データベースの構造の説明が見つからなかったので,まずはwnjpn.db.gzを解凍してsqlite3.exeでwnjpn.dbの中身を覗いてみます.

ファイルを開く
>sqlite3 wnjpn.db
データベースの構造を確認
sqlite>.schema
CREATE TABLE ancestor (synset1 text,
                          synset2 text,
                          hops int);
CREATE TABLE link_def (link text,
                          lang text,
                          def text);
CREATE TABLE pos_def (pos text,
                          lang text,
                          def text);
CREATE TABLE sense (synset text,
                          wordid integer,
                          lang text,
                          rank text,
                          lexid integer,
                          freq integer,
                          src text);
CREATE TABLE synlink (synset1 text,
                          synset2 text,
                          link text,
                          src text);
CREATE TABLE synset (synset text,
                          pos text,
                          name text,
                          src text);
CREATE TABLE synset_def (synset text,
                          lang text,
                          def text,
                          sid text);
CREATE TABLE synset_ex (synset text,
                          lang text,
                          def text,
                          sid text);
CREATE TABLE variant (varid integer primary key,
                          wordid integer,
                          lang text,
                          lemma text,
                          vartype text);
CREATE TABLE word (wordid integer primary key,
                          lang text,
                          lemma text,
                          pron text,
                          pos text);
CREATE TABLE xlink (synset text,
                        resource text,
                        xref  text,
                        misc text,
                        confidence text);
CREATE INDEX ancestor_synset1_idx ON ancestor (synset1);
CREATE INDEX ancestor_synset2_idx ON ancestor (synset2);
CREATE INDEX sense_synset_idx ON sense (synset);
CREATE INDEX sense_wordid_idx ON sense (wordid);
CREATE INDEX synlink_idx ON synlink (synset1, link);
CREATE INDEX synset_def_id_idx ON synset_def (synset);
CREATE INDEX synset_ex_id_idx ON synset_def (synset);
CREATE INDEX synset_id_idx ON synset (synset);
CREATE INDEX word_id_idx ON word (wordid);
CREATE INDEX word_lemma_idx ON word (lemma);
CREATE INDEX xlink_synset_resource_idx ON xlink (synset,resource);
単語を探す

単語はwordテーブルに含まれています.
文字列"dog"を探してみます

sqlite>select * from word where lemma = "dog";
85237|eng|dog||n
152987|eng|dog||v

動詞と名詞の"dog"があるので,二つの項目が出てきました.

同義語を探す

Wordnetでは同義語はsynsetという単語の集まりでまとめられています.
注意点は,ひとつの単語が複数のsynsetに属することです.
senseテーブルから名詞の"dog"が属するsynsetを取り出します.

sqlite>select * from sense where wordid = 85237;
02084071-n|85237|eng|0|1|42|eng-30
10114209-n|85237|eng|0|2|0|eng-30
10023039-n|85237|eng|0|3|0|eng-30
09886220-n|85237|eng|0|4|0|eng-30
07676602-n|85237|eng|0|5|0|eng-30
03901548-n|85237|eng|0|6|0|eng-30
02710044-n|85237|eng|0|7|0|eng-30

synset"02084071-n"内の単語をwordテーブルから探す.

sqlite>select lemma from sense, word where synset = "02084071-n" and word.lang = "eng" and sense.wordid = word.wordid;
canis_familiaris
domestic_dog
dog

以上のように同義語が得られます.

上位語,下位語を探す

synlinkテーブルにsynset同士の関係(リンク)が書かれています.
リンクの種類はlink_defを参照.
例えばsynset"02084071-n"の下位(hypo)のグループに含まれるsynsetは以下のようになります.

sqlite>select lemma from synlink, sense, word where link ="hypo" and synset1 = "02084071-n" and synset2 = synset and sense.wordid = word.wordid and word.lang="eng";
puppy
pooch
doggy
doggie
barker
bow-wow
mutt
mongrel
cur
lapdog
toy_dog
toy
hunting_dog
working_dog
carriage_dog
coach_dog
dalmatian
basenji
pug
pug-dog
leonberg
newfoundland
newfoundland_dog
great_pyrenees
spitz
belgian_griffon
brussels_griffon
griffon
welsh_corgi
corgi
poodle_dog
poodle
mexican_hairless

スピッツやプードル,コーギーなどの犬の下位語が得られました.