|
|
「Tree Dictionary」は、作者(クロノス・クラウン 柳井 政和)が、実験のために作成したWebアプリケーションです。
このWebアプリケーションは、辞書の文章データを元にして、関連語を自動で作成する実験の結果を利用しています。
とはいえ、ただ関連語を表示するだけでは寂しいので、関連語を元に辞書をツリー状に次々と引けるインターフェースにしました。
このページでは、今回の実験の経緯と、関連語算出のアルゴリズムについて解説します。
以下、関連語の例です。「Relation Words」というところが関連語になります。
それなりの精度ですが、関連語っぽいものが出力されるのが分かると思います。
(単語によっては、あまり関連しない単語が表示されますが、そこらへんは緩い実験ということで、ご理解いただければと思います)
本Webアプリケーションへのお問い合わせは、下記によろしくお願いします。
「はじめに」にも書きましたが、このWebアプリケーションは、辞書の文章データを元にして、関連語を自動で作成する実験の産物です。
ここでは、関連語抽出のアルゴリズムを簡単に説明します。
関連語を抽出する元データは「WordNet 3.0」を利用しました。
以下、アルゴリズムです。
辞書は、一般の文章とは違って、ある程度正規化されています。似たような表現で、似たような構造で、文章を記述しています。また、「単語」と「解説」という2つの情報がセットになっています。
これらの特性を利用して、本Webアプリケーションでは、事前にローカルで関連語を計算しています。
辞書を2つの部分に分けます。「単語」と「解説」です。
次に「解説」の中の各単語を、それぞれの「単語」へのリンクと見なします。
これで、Webページの「ページ」と「リンク」のような、リンク構造が作成できます。
実際には、辞書の記号や言い回しがあるので、それらをトリミングしてからリンク構造を作っています。
有効と見なしたリンクのインデックス数は、5万8000ほどです。元のデータのインデックス数は10万を超えていますが、重複などを削除していって刈り込んでいます。
以下、このデータを「辞書リンク・データ」と呼びます。
被リンクと言った方が一般的かもしれません。1で作成した「単語」と「リンク」を裏返したデータを作成します。
具体的には、以下のようなことを行っています。
例)
「単語A:解説内(単語リンクB、単語リンクC、単語リンクD)」
「単語B:解説内(単語リンクC、単語リンクF、単語リンクG)」
「単語C:解説内(単語リンクC、単語リンクD、単語リンクB)」
の場合の逆リンク
「単語リンクB:逆リンク(単語A、単語C)」
「単語リンクC:逆リンク(単語A、単語B、単語C)」
「単語リンクD:逆リンク(単語A、単語C)」
「単語リンクF:逆リンク(単語B)」
「単語リンクG:逆リンク(単語B)」
つまり、リンクされている各単語について、どの単語からリンクされているかのリストを作っているわけです。
逆リンクのデータは、被リンク数が多い順にソートしておきます。
この逆リンクを作ることによって、辞書でよく使われている単語が何なのかが分かります。
具体的には「a」とか「the」とか「or」とか「in」といった単語が圧倒的に多いです。他には「small」や「large」なども多いです。英英辞書だなと思うとろは「united」「states」が多いところでした。
以下、このデータを「逆リンク・データ」と呼びます。
ここからは、「えいやっ」と重い計算をします。
計算の手順は以下の通りです。
- 単語リストの頭から順番に、単語を1つ抜き出す。これを「キー単語」と呼ぶ。
- 以下、各「キー単語」に対する処理。
- 「キー単語」の説明文に当たるインデックス一覧を、「辞書リンク・データ」から取得する。これを「リンク単語」と呼ぶ。
- 以下、各「リンク単語」に対する処理。
- 「リンク単語」を「関連語候補リスト」に追加する。点数として、「リンク単語の総数」の逆数の3乗を足す(1/「リンク単語の総数」^3)。
- 「リンク単語」に逆リンクしている単語のインデックス一覧を、「逆リンク・データ」から取得する。これを「逆リンク単語」と呼ぶ。
- 以下、「逆リンク単語」に対する処理。
- 「逆リンク単語」を「関連語候補リスト」に追加する。点数として、「逆リンク単語の総数」の逆数の3乗を足す(1/「逆リンク単語の総数」^3)。
- 点数を持った、「関連語候補リスト」が完成する。
- 「関連語候補リスト」を、点数の大きい順でソートする。
- 「関連語候補リスト」を、上位50までで切り捨てる。
- 全ての単語に対して、この処理を実行する。
これで、関連語はある程度の精度で抽出できます(あくまで、「それなりの」ですが)。
考え方としては、「ある単語の説明文は、その単語に関連する単語の説明文に似ている」というのが基本になっています。
本当はこの計算を何回かネストさせた方が精度は高くなるのですが、計算時間が掛かりすぎるのでネストは行いませんでした。
「リンク単語」を加えているのは、「リンク単語」も関連語の可能性が高いからです。
計算中、逆数を取っているのは、Googlenoのページランクと同じ考え方です。あるページからのリンクの点数は、そのページのリンク数で割るという手法です。今回のアルゴリズムでも、同じ考え方を採用しています。
計算中、逆数の3乗を取っているのは、一般的な単語(被リンク数の多い単語)の点数を下げるためです。
3乗しない場合は、2つの単語からリンクされている単語の点数は1/2点、100の単語からリンクされている単語は1/100点になります。でも、100の単語からリンクされるような単語は、やたらといろんなところ出てくるので、1/100が何度も足されて1/2を上回ったりします。
そこで3乗を行い、ふるいを掛けています。
3乗した場合は、2つの単語からリンクされている単語の点数は1/8点、100の単語からリンクされている単語は1/1000000点になります。これぐらいの数になると、何度も登場しても点数は低いままになります。
この部分は2乗でも4乗でも構わなかったのですが、3乗が成績がよかったので、この値を採用しました。
現状、この計算方法では「データ数の2乗」の計算量になっているので、あまり大きなデータに対して適用できないのが難点です。
ただし、メリットもあります。データ・セットを複数のパソコンに置けば、分散して計算させることもできます。計算後の結果だけをマージすれば大丈夫なようになっています。
実際に大規模データに適用する際は、「逆リンク・データ」からのデータ抽出数に制限を加えて、ランダムにしなければならないと思います。ある程度ランダムにしても、それほど精度は変わらないと思います。そうすれば「データ数のn倍」の計算量になります。
もう1つの問題は、ネストを取っていないので、関連語にたどり着いていないケースが多いことです。これは、デスクトップ・パソコンの限界なのかもしれません。
完全な関連語を求めるのが目的ではないですので、現状はこの程度でよいかと思います。
3の時点で、それなりの精度で関連語が抽出されているのですが、ノイズも結構多いです。
「全自動4コマ」などのデータとして利用するには、もう少し整理をしたいところです。
そこで、以下のような補正を行い、上位の単語を絞り込みました。
- キー単語と、関連語の「辞書リンク・データ」を調べて、同じ単語が多く使われていれば、近い言葉だと判断して補正値を加える。
- 複合語(スペースで区切られている単語)は、重要な単語ではないと見なして点数を大きく下げる。
- 規定の長さから離れている(長すぎる、短すぎる)単語は、重要度が低いと見なして点数を下げる
最初の2つは問題ないと思いますが、最後の「規定の長さ」については説明を加えておきます。
各言語で、単語の長さと、その単語の役割には、ある程度の相関性があります。
基本的な単語は短くて、後の時代に出てきた単語は長くなる傾向があります。
そこで、取り出したい単語の特性がある程度分かっていれば、その単語の長さを「規定の長さ」として、その長さに対して「長すぎる」もしくは「短すぎる」単語の点数を下げれば、かなりの精度で目的の単語が取り出せます。
非常に機械的な手段ですが、辞書も何も使わなくても、それなりの成績が出るので便利な手法です。
このような計算を行うことで、それなりの精度で関連語を取り出すことができます。
とは言っても、あくまでも「それなり」の精度になります。上手く取り出せていない単語の方が多いです。
というわけで、今回、英英辞書を元にして、関連語の抽出実験をしましたので、その結果を利用したWebアプリケーションを公開しておきます。
私は以前から、「言語」や「物事の自動化」に興味を持っていました。そして、その興味から、辞書やWeb検索にも関心を抱いていました。また、それらの知識を積極的に吸収するようにしていました。
それらの興味を元に、ここ数年、私は言語と自動化をテーマにしたアプリケーションの実験と開発を行っています。
ここでは、それらの実験の変遷を簡単に紹介します。
秀丸エディタ用の「単語数カウント&グラフ化マクロ」です。初期の頃の実験になります。
文書ファイルから、複数の単語をまとめてカウントしてリスト化します。
その他、ちょっとした文字列処理や解析に、いくつかの秀丸マクロを書いていました。
JavaScriptを利用して、複数の検索エンジンで一括検索するプログラムです。
いちおうソースは公開していますが、さすがには古過ぎるので利用することはないでしょう。
JavaScriptを利用して、文章を読み上げるプログラムです。
切り換え可能なフィルター機能もあるので、文章に合わせた読み上げ設定ができます。
長文の校正用に使ったりしています。技術背景については、CodeZineにも記事を書きました。
文章の表記を自動でチェックして、問題点を指摘してくれるソフトです。編集社ごとに表記ルールが違うので、その自動校正用に作成しました。
未公開のソフトになります。一部、私が編集に関わった仕事先などには配布しています。
表記チェック・エンジンは、「ちょこっとVoice」のフィルター機能を改良したものになっています。
パーソナル・リアルタイム検索エンジン。起点ページからリンクを自動でたどり、リアルタイム検索を行うプログラムです。
検索エンジンのクローラー的動作の実験として作りました。
公開版には搭載されていませんが、ページランクの仕組みを応用した「発散ページでの擬似ページランク計算」など、いくつかのアルゴリズムの実験をこのソフトで行っていました。
i-appli開発時に作成したプリプロセッサです。JavaScriptでできています。
基本的にはプログラム用のツールなのですが、同じルーチンを利用して、その後多くの言語処理を行ったので、ここに掲載しておきます。
長文校正用の自動校正ツールです。以下のような機能があります。
文末の間違いの指摘、表記ぶれの指摘、同音異義語の指摘、表現のかぶりの指摘、文末表現の連続の指摘、文頭表現の連続の指摘、日本語にありえない平仮名の組み合わせの指摘、表現洗練のための単語隣接の検出、他。
「シンプル・プリプロセッサ」から派生していったツールの1つになります。
「Yahoo!辞書」をランダムに引くソフトです。出先で歩きながら辞書を楽しむのに利用していました。
「Yahoo!辞書」の仕様が変わったので終了しました。
WebページのURL(携帯版ページのURL)のQRコードを自動で作成するソフト&Webアプリ。
このWebアプリのページには、そのWebページの関連語を自動で計算するプログラムが入っています。
この頃、文章中から単語を抽出して自動で点数を付けるプログラムをいくつか書いていたので、その中の1つを採用しています。
前身は「ふにゃふにゃ検索」という連想検索エンジンになります。
同様のプログラムは、ニュース・コレクターのページでも利用しています。JavaScriptを使って、文章から自動で単語をリストアップして一覧表示させています。
辞書を一切持たないので、精度はそこそこです。
単語を元に、自動で4コママンガを作成するWebアプリケーション。
これは、かなりの人が驚いたようです。また、仕組みが分からない人が多くいたのが印象的でした。
技術的には、それほど高度なことをしていません。非常にベタな実装です。これまでの「言語」+「検索」の興味を、そのまま応用した内容になっています。
「全自動4コマ」が、これまで私が開発した「言語系プログラム」と大きく違うのは、「代数的概念」を導入したことです。
文章をそのまま書くのではなく、代数を利用して書くというのが、このプログラムの基本概念になります。
一例を挙げます。
この文章は、代数を使って以下のように書けます。
このように、文章を代数で書けば、辞書やWeb検索から適切な単語や文章を抜き出して自動で文章を作れるようになります。
適切な単語や文章を抜き出す技術は、これまでにノウハウがあります。そこで、それらを応用しながら、「全自動4コマ」に合わせてカスタマイズしました。
この、代数を利用したプログラムを作ったことで、言語に対する興味が次の段階に行きました。
「全自動4コマ」でノウハウを得た、「代数表現によるコンテンツ作成」を、さらに大規模にしたものです。
いくつかの企画候補があったのですが、現在の精度ともっとも親和性が高いコンテンツとして「捏造事典サイト」という企画を採用しました。
世間の評判的には大成功だったのですが、いくつか課題も残りました。それは、実行速度と負荷の大きさです。リアルタイム生成なので、どうしても計算量が大きくなってしまいます。
また、データを外部から検索して引いてくるので、どうしても動作は自己内で完結しません。キャッシュを取るにしても限界があります。そこが今後の課題だなと思いました。
ネット上のニュースを自動で音声化して読み上げるソフトです。
「全自動4コマ」からの一連の流れからは外れますが、こちらも「言語」と「自動」に対する興味の流れでできています。
単語の自動抽出など、過去のプログラムが流用されています。
ある単語を起点にして、検索エンジン(Yahoo!)の検索データから、自動で類語を算出するプログラムです。
「ある検索単語と一緒に検索されている単語」からリンクをたどり、同じような文脈で検索されている単語を探し、そのリストを点数化してソートしています。
アルゴリズムの検証のために作成しました。飾りっけのほとんどない実験サイトです。
アルゴリズムは、「動的シソーラス」のトップ・ページに掲載していますので、興味のある人は参照してください。
単語の評価手段の一つとして、その単語のビジネス価値を知りたいという意図で作成されたWebアプリケーションです。
ネット上に流通している単語を収集してきて、毎日自動で単価を調べて情報を蓄積しています。過去にさかのぼって、その単語の値段の上下動も調べられるようになっています。
まだ実験途中ですが、数年分のデータがたまれば、季節ごとの話題を自動で生成して提供したりといった応用ができるようになります。
単語の評価手段の一つとして、関心度の高い単語を知りたいという意図で作成されたWebアプリケーションです。
ネットとオタク文化の相性は非常によいです。そして、ネットで流通している単語の多くはオタク系の単語です。そこで、そのオタク系の商品の流通データを蓄積すれば、有用な単語リストが作成できるはずだと考えました。
また、年月日付きのデータを蓄積しているので、年月日に対する話題を自動で生成するようにも応用できます。
といった感じで、「言語」や「物事の自動化」への興味を推し進めたプログラムを色々と作成しています。
他の人にはあまり興味がないところかもしれませんが、まとめの意味で文章化しておきました。