WordNet、ずっと知ってはいたけど、ちゃんと触ったことなかった。最近WordNetを少し触る機会があったので、メモ。
インストール
WordNetのサイトからダウンロードしてきてインストール
- http://wordnet.princeton.edu/wordnet/download/current-version/
- http://wordnetcode.princeton.edu/3.0/WordNet-3.0.tar.gz
ダウンロードして解凍して、インストールすると /usr/local/WordNet-3.0 にインストールされる
tar -xzf WordNet-3.0.tar.gz cd WordNet-3.0 ./configure make sudo make install
これでパスを通せば、wn(/usr/loca/WordNet-3.0/bin/wn)コマンドが使えるようになる。
wn コマンド
使い方は http://wordnet.princeton.edu/man/wn.1WN.html
例えば、blogという単語を調べるときは wn blog とかしてみる
$ wn blog Information available for noun blog -hypen Hypernyms -synsn Synonyms (ordered by estimated frequency) -famln Familiarity & Polysemy Count -coorn Coordinate Terms (sisters) -grepn List of Compound Words -over Overview of Senses Information available for verb blog -hypev Hypernyms -synsv Synonyms (ordered by estimated frequency) -famlv Familiarity & Polysemy Count -framv Verb Frames -coorv Coordinate Terms (sisters) -simsv Synonyms (grouped by similarity of meaning) -grepv List of Compound Words -over Overview of Senses No information available for adj blog No information available for adv blog
それで、wn blog -synsn とすると類義語(web log)と下位語(diary, journal)が調べられる
$ wn blog -synsn Synonyms/Hypernyms (Ordered by Estimated Frequency) of noun blog 1 sense of blog Sense 1 web log, blog => diary, journal
調べられるけど、機械が可読な感じではないのが少しつらい(なにかオプションがあるのかもしれないけど、見つからなかった)
WordNet::QueryData
wnコマンドはプログラムで扱うのはちょっと大変そうなので、別のを探したらWordNet::QueryDataというcpanモジュールがあった。
https://metacpan.org/pod/WordNet::QueryData
WordNet::QueryDataの場合、blog#n#1のように、単語とその品詞、意味(WordNet上で何番目の意味か)が必要になるので、品詞と意味などを調べる。
blogには名詞と動詞があって、名詞のblogは1種類
my $wn = WordNet::QueryData->new; [ $wn->queryWord('blog') ]; # -> blog#n, blog#v [ $wn->queryWord('blog#n') ]; # -> blog#n#1
類義語や下位語はquerySenseメソッドを利用すると取れる
my $wn = WordNet::QueryData->new; [ $wn->querySense('blog#n#1', 'syns') ]; # -> web_blog#n#1, blog#n#1 [ $wn->querySense('blog#n#1', 'hype') ]; # -> diary#n#1 [ $wn->querySense('diary#n#1', 'syns') ]; # -> diary#n#1, journal#n#1
他にも上位語(hypo),定義(glos)などwnコマンド同様に取れる
日本語WordNet
WordNetの日本語版。sqlite版があるので、それを使ってみる。英語版も含まれてる(全部かどうかはわからない)。
- http://nlpwww.nict.go.jp/wn-ja/jpn/downloads.html
- http://nlpwww.nict.go.jp/wn-ja/data/1.1/wnjpn.db.gz
synset, sense, word テーブルあたりを使うと類義語が取れる。
synlinkテーブルを使えば、上位下位語が取れる。
$ sqlite3 wnjpn.db sqlite> select * from synset where name = 'web_log'; 06402202-n|n|web_log|eng30 sqlite> select * from sense where synset = '06402202-n'; 06402202-n|27320|eng|0|1|0|eng-30 06402202-n|96297|eng|0|1|0|eng-30 06402202-n|222321|jpn||||mono sqlite> select * from word where wordid in (27320,96297,222321); 27320|eng|web_log||n 96297|eng|blog||n 222321|jpn|ブログ||n
昔軽く触ったときはwnコマンドなんてなかった気がするから、だいぶ使いやすくなってる気がする。
あと、WordNetのバージョンによってsynsetが違うのは知らなかった。