こんにちは。エクサウィザーズAIエンジニアの須藤です。
類語辞典って便利ですよね。 書いた文章がしっくりこないときに、ニュアンスの違う単語に置き換えたり、和語と漢語と外来語を入れ替えたりできます。
しかし、適当な表現が出てこなくて、もっと漠然と言葉を探したい時はどうしましょう。 辞書を繰り返し引いて、類語の類語の類語を見て回るのはちょっと面倒ですね。 かと言って項目あたりの類語数が増えたとしても、その中で探す手間が増えて、やはり使いづらそうです。
そこで、こういうものを作ってみました。 https://base.exawizards.com/view/modelDetail?id=44
詳細を以下で解説します。
概要
類語を平面に分散して表示するプログラムです。 JavaScriptで書かれていますので、最近のブラウザがあれば動きます。 類語は見出し語に似ているものほど中央に、かつ類語同士でも似たものほど近くに表示されるようになっています。 つまり、よりしっくりくる単語の周りを優先して探せば、素早く目的の単語を見つけられることになります。 ...ということを期待して作りました。
単語の位置は、Word2vecという手法で得られた意味ベクトルから計算して求めています。 ここで意味ベクトル*1とは、単語の意味を数値化したものです。 関連の深い単語同士はベクトルの値も近くなります。 実際のテキストから、後述する機械学習によって得られます。
学習
- 前処理
- テキストを形態素解析エンジンであるMeCabで分解します。
- 単語ごとに登場頻度を調べ、高い順に番号をつけます。
- テキストを単語番号の列に変換します。
- 学習
- 単語数とベクトルの次元数を決めておきます。
- 前後の単語が与えられたときに真ん中の単語がどれかを選択肢の中から予測する、以下の学習モデル*2を構築します。
- 予測自体に有用性は特にありません。欲しいのは副産物である重みパラメータの値です。
- 下記の設定でソースごとに学習を行いました。
ソース | ウィキペディア | 青空文庫 | 小説家になろう*3 |
---|---|---|---|
MeCab辞書 | NEologd | デフォルト | NEologd |
テキスト量 | 約6億語 | 約5000万語 | 約2億5000万語 |
全ての単語の種類 | 182,669 | 108,676 | 227,685 |
学習した単語の種類 | 100,000 | 100,000 | 100,000 |
ベクトル次元 | 300 | 300 | 300 |
学習回数*4 | 5億 | 2.8億 | 6.3億 |
- 後処理
- 重みは単語数×ベクトルの次元を持った行列です。これがそのまま各単語の意味ベクトルを表します。
- 単語とベクトルの関係をオブジェクトリテラル形式に書き出し、可視化プログラムで使えるようにします。
可視化
以下の方針で単語の表示位置を決定します。
- 見出し語を画面の中心に配置する。
- 見出し語に似た単語ほど、中央近くに配置する。
- 似ていない単語同士が、できるだけ離れるようにする。
具体的には以下のような計算を行います。
- 全ての見出し語の意味ベクトルを調べとし、その平均を求めます。これが画面の中心にあたります。
- に近いベクトルを30個選びとし、その平均も求めます。これらが分布している主な方向を以下で求めます。
- と直交し分散を最大にする方向ベクトルを求めます。これがX方向になります。
- およびと直交し分散を最大にする別の方向ベクトルを求めます。これがY方向になります。
- 意味ベクトルがになる単語の画面中心からの距離をとします。式の形および指数に深い意味はありません。色々試した中で表示結果が見やすかったものを選びました。はスケールで、に対応する単語が画面にちょうど収まるように調節します。
- 画面中心からの方向ベクトルをで求めます。
- 最後に座標を、で求めます。は画面の中心の座標です。
使い方
- ソースの選択
- ポップアップボタンで学習ソースを選択してください。
- 選択すると、データの読み込みが始まります。データファイルは10〜20MBあるので、読み込みには時間がかかります。
- 見出し語の入力
- 画面の操作
- 画面をドラッグするとスクロールできます。
- 右下のスライダーを操作すると、ズームできます。
- 単語をダブルクリックすると、その単語を新たな見出し語として再描画します。
- その他
- 学習ソースと見出し語はアドレスバーに逐次反映されます。URLをコピーして別のブラウザで開くと、状態が再現されます。
使用例
ソースの違い
学習ソースを変えると、異なる観点で類語を検索することができます。
ウィキペディア | 青空文庫 | 小説家になろう | |
---|---|---|---|
猫 | |||
妙に偏った選別になりました。題名などで繰り返し使われると影響を受けやすいようです。 | 犬と猫は使われる文脈が似ているため、類語あつかいになってしまいます。 | 様々な猫の呼び方が出てきます。 | |
タンク | |||
水槽関連、燃料関連に分かれました。 | 燃料関連、戦車関連です。 | タンク職関連が大勢を占めます。 | |
四天王 | |||
比喩的な使われ方のほか、元祖四天王もカバーします。 | 仏教関連のほか、称号の例として頼光四天王が出てきました。 | 魔王の部下として倒される存在です。 |
興味深い例
制作の過程で気がついた、興味深い例を紹介します。 学習結果は随時アップデートしているので、現在のデータで試してもこの通りにならないことをご了承ください。
東京 | 京都 | ローマ |
東京が付く言葉、東京都の下部組織、東京の地名などに分かれます。 | 京都府の地名、京都市の地名、観光地に分かれます。 | イタリアの各都市、古代ローマの詳細、他の文明などが出てきます。 |
家康 | 正義 | しかし |
戦国時代の家康、江戸時代の家康、安土桃山時代の家康に別れました。 | 正しい行いという意味の言葉と、名前が正義の人の苗字が出てきます。 | 接続詞なども入っています。 |
最後に
Word2vecの二次元可視化によって、言葉探しが楽しく便利に行えるようになる可能性を示しました。 こちらですぐ試せます。
尚、エクサウィザーズは優秀なエンジニア、社会課題を一緒に解決してくれる魔法使い”ウィザーズ”を募集しています。ご興味を持たれた方はぜひご応募ください。 採用情報|株式会社エクサウィザーズ
ExaWizards Engineer Blogでは、定期的にAIなどの技術情報を発信していきます。Twitter (https://twitter.com/BlogExawizards) で更新情報を配信していきますので、ぜひフォローをよろしくお願いします!