この「動的シソーラス」は、Yahoo! JAPAN Webサービスの「関連検索ワードWebサービス」を利用して、シソーラスっぽい物を類推するWebアプリです。思考実験の確認のために作成しました。
入力フォームに単語を入力して検索すると、類語や関連語と想定される単語を、評価点付きで表示します。
どういった考えを元にしたアルゴリズムかを説明します。
- 「関連検索ワードWebサービス」は、その単語と一緒に検索された単語を、その検索回数順で返してくる。
- 同じような検索語とともに検索されている単語は、同じような意味を持つ単語と推定される。
以下、アルゴリズムについてもう少し詳しく書きます。
- 「入力された単語」と一緒に検索された単語を、「トリガー単語」と呼ぶことにする。
- 各「トリガー単語」について、「トリガー単語」と一緒に検索された単語を調べる。その中に「入力された単語」がある場合は、2つの単語(「入力された単語」と「トリガー単語」)は同じ文脈でよく使われる単語と想定される。
- その場合、「トリガー単語」と一緒に検索された単語は、「入力された単語」の言い換え語である可能性がある。
- 「トリガー単語」と一緒に検索された単語を「シソーラス候補単語」と仮定する。
- 「シソーラス候補単語」と一緒に検索された単語のリストが、最初の「入力された単語」と一緒に検索された単語のリストと一致していれば、2つの単語は極めて類似していると考えられる。
- 「シソーラス候補単語」と「入力された単語」の検索結果が近ければ、それは類語や関連語である可能性が高いと想定できる。
上記のような考えを元に、動的にシソーラスを作成しています。
ただし、精度や利用に関して、以下の問題があります。
- 「関連検索ワードWebサービス」は、1日に5万回までなので、あまり多くの検索を行うことができない。
- そのために、1回平均50回程度の検索数に抑えている(1回平均50回ということは、1日辺り1000回までということになる。実際は結果のキャッシュを持っているので、もう少し多くなる)。
- この制約があるために、精度はどうしても低いものとなる。
- また、一般名詞はそれなりの結果が出るが、固有名詞(人名や作品名)は、その性質上、近いジャンルの固有名詞しか取得できない。
上記のような問題がありますが、数時間で作れるプログラムの割には、それなりの精度を出すことができています。
仕組み的には、ある程度正しいアプローチだと思うので、これを大規模にやれば、ある程度の精度のシソーラスが作れるのではないかと考えています。
以下、評価点を計算するアルゴリズムの詳細を書きます。
- 「入力された単語」を元に、「関連検索ワードWebサービス」で検索して100件の結果を取得(例:「バイク」で検索して、「中古 バイク / ホンダ バイク / goo バイク / バイクブロス / バイク王 / ロードバイク / ……」といったリストを取得)。
- 結果のリストから、入力された単語(「中古 バイク」の「バイク」の部分)や、入力された単語を含む単語(例:「バイク」に対して「ロードバイク」など)を除去。
- 結果リストから抽出した有効な単語を「トリガー単語」とする。
- 「トリガー単語」に対して、以下の条件を満たすまで、処理を10回繰り返す。
- 「関連検索ワードWebサービス」で100件の結果を取得。
- その中に、「入力された単語」(一番最初の入力語)がなければ無視。
- その中に「入力された単語」があれば、その結果から得られる単語を「シソーラス候補単語」として登録。
- 「シソーラス候補単語」から、「入力された単語」や「トリガー単語」を除去する。
- 「シソーラス候補単語」を出現回数順にソートして、1回しか出てこなかった単語を除去する。
- 「シソーラス候補単語」が40を超える場合は、出現回数が少ない単語を削る。
- 「シソーラス候補単語」に対して、以下の処理を行い、評価点を計算する。
- 「関連検索ワードWebサービス」で100件の結果を取得。
- その中に「トリガー単語」(一番最初の入力語の検索結果)が含まれている場合は、その出現回数の総和を評価基準点とする(例:5回出現した場合は、「1+2+3+4+5=15点」となる)(総和については、Wikipedia:「総和」を参照)。
- 「シソーラス候補単語」としての出現回数に、評価基準点を掛けた値を、最終的な評価点とする(例:出現回数2回で、評価基準点が15点なら、最終的な評価点は30点となる)。
- 評価点が0点だった単語は除去する。
- 「シソーラス候補単語」を、評価点でソートして出力する。
このアルゴリズムで、ある程度の精度で類語や関連語らしきものを取得できます。
以下、今回のプログラムを作成する上で、利用したサービスや参考にした文献です。
「言い換え語」を取得できる、有効そうで利用制限が緩い適切なWebAPIが見付からなかったため。
精度が高い必要はなかったので、「それなりの結果が出ればいいや」ということで、理論的にはそれほど間違っていないだろうアプローチを考えて実験として一晩で作成しました。