5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

類義語検索ツール

Posted at

文章書いているときに、ちょいと趣向を凝らすために、類義語に置き換えて言い回しを工夫することがあります。そんなときのために、以前作ったコンソールで日英翻訳するツールの類義語版を作りました。

できあがり

syno(github)

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 不明

コード

  1. 検索したい単語をwordテーブルから取得します。
  2. そのwordidに対応するsynsetをsenseテーブルから取得します。
  3. 最後にその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という素晴らしいデータセットのお陰様で、簡単に作ることができてしまいました。単語のデータベースというのは他にもいろいろ応用が効きそうです。活動いただいている方々に感謝です。

5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?