文章書いているときに、ちょいと趣向を凝らすために、類義語に置き換えて言い回しを工夫することがあります。そんなときのために、以前作ったコンソールで日英翻訳するツールの類義語版を作りました。
できあがり
Node.js製です。
日本語 WordNet
英単語のときはGoogleの翻訳サービスにつなぎました。類義語を引っ張ってくるというAPIは…あるかもしれないですが、今回は日本語 WordNetというところが公開しているデータを利用します。
http://compling.hss.ntu.edu.sg/wnja/
単語と、その類義語に関する情報がまとまっており、今回の目的にぴったりです。
つまり今回は日本語 WordNetの賑やかし記事です。
「リリース・ダウンロード」の中から「Japanese Wordnet and English WordNet in an sqlite3 database」を使わせてもらいます。
日本語 WordNetから類義語を取得する
WordNetでは"概念"という情報が単語に付与されていて、その概念が同じものであれば類義語、と判断します。データベース中にはいくつかテーブルがあるんですが、単語を管理する「word」と、単語と概念を関連付ける「sense」のテーブルを使います。ざっと探したところでは、カラムの説明を見つけられなかったので、あくまで自分の認識です。
wordテーブル
カラム | 説明 |
---|---|
wordid | 主キー |
lang | 言語の種類。日本語 or 英語 |
lemma | 単語そのもの |
pron | 読み方らしいですが、中身は空でした |
pos | 品詞 |
senseテーブル
カラム | 説明 |
---|---|
synset | 概念の主キー |
wordid | 単語の主キー |
lang | 言語の種類。日本語 or 英語 |
rank | 不明 |
lexid | 不明 |
freq | 不明 |
src | 不明 |
コード
- 検索したい単語をwordテーブルから取得します。
- そのwordidに対応するsynsetをsenseテーブルから取得します。
- 最後にそのsynsetが同じ単語が類義語になります。
データベースの形式がsqlite3なのでsqlite3
を使います。
const sqlite3 = require("sqlite3").verbose();
const db = new sqlite3.Database(__dirname + "/wnjpn.db");
// コマンドライン引数に指定された単語を取得します。
const word = process.argv[2];
// 手順1,2に該当します。
// wordテーブルにsenseテーブルをjoinして対応するsynsetを取得します。
const wordsql = `SELECT sense.synset AS synset FROM word JOIN sense ON sense.wordid=word.wordid WHERE lemma = '${word}'`;
db.all((wordsql), (worderr, wordrows) => {
// 単語が登録されていない場合があるので分岐。
if (wordrows && wordrows.length > 0) {
// 見つかった単語のsenseを条件にしてデータを検索します。
const wordrow = wordrows[0];
const sql = `SELECT word.lemma AS lemma FROM sense JOIN word ON word.wordid = sense.wordid WHERE sense.synset = '${wordrow.synset}'`;
db.all(sql, (synoerr, synorows) => {
// 見つかった類義語を出力します。
for(let synorow of synorows) {
console.log(synorow.lemma);
}
});
} else {
console.warn("no word");
}
});
db.close();
書いてみれば数行。
おわりに
日本語 WordNetという素晴らしいデータセットのお陰様で、簡単に作ることができてしまいました。単語のデータベースというのは他にもいろいろ応用が効きそうです。活動いただいている方々に感謝です。