「単語の出現頻度」「(Web上での)単語の珍しさ」「文書長」「単語の網羅性」

「単語の出現頻度」「(Web上での)単語の珍しさ」「文書長」「単語の網羅性」ぱわふる複数文書からキーワードを抽出する鍵となる4要素を考えました。
(ちなみに今は卒研とかでやっているわけではありません)

「単語の出現頻度」「(Web上での)単語の珍しさ」「文書長」の3要素を考慮する式は既にあるけど、「単語の網羅性」まで考慮した式は知りません。

そんなわけで「網羅性」を「 「対象文書内で出現しない」がどれほど起こりにくいか 」という情報量(エントロピー)で表すことにして、
「Web上で出現する」ことと「対象文書群で出現する」ことを独立と仮定して(実際には独立ではないが)情報量の加法性に従ってIDFに加算することにしました。

一番の問題はWebDF(検索エンジンで検索したときのヒット数)をどうやってWeb APIを使わずに取るか。

まず浮かんだのは「Wikipedia」のデータベース(ダウンロードできるやつ)を使う方法。Wikipediaならいろんなジャンルの文書が偏りなく入っていると考えられるのでWebDFを取るならこれが一番正確なような気がします。
ただし、全文検索エンジンを新たに導入しないと恐らく速度面で厳しい。加えて、そこまでキッカリ正確でなくてもそれなりの結果出してくれるのに全文検索エンジンとかインストールするのは大げさと思わなくもないこともないこともない・・・。

そこで、文字の長さで適当にWebDFを推測することにしました。文字種まで考慮したらさらにそれらしくなるけど、10万単語程度ではサンプルが足りないので文字種はもっとWebDFがたまってから考えることにしました。
文字列長を考慮せずに平均を使う Lingua::JA::TFIDF (作:ダウンロードたけし様)よりパワーアップした結果が得られています。

これらを取り入れてCPANモジュールの「Lingua::JA::WebIDF」「Lingua::JA::TFWebIDF」「Lingua::JA::TermExtractor」をアップデートしました。「Lingua::JA::TFWebIDF」は concat_max のテストが甘いってレベルじゃねーぞ!ってぐらいテストが甘かったのでかなり修正を要しました。(汗)
例えばサ変フィルターで「情報統合思念体」をフィルタリングしないように変更しました。
(「統合」はサ変接続ですが「情報統合思念体」という複合名詞自体はサ変ではないので)

あとはWebDFは上述の通り単純な推測値を用いることにしてデフォルト設定をできるだけWeb APIを使わない設定に変更しておきました。

前の記事(https://pawafuru.com/pg/perl/158.html)と同じコードを書くと、前回と違い、1文書でしか言及されていない「野球」より「音声」のほうが高い順位になりました!
(WebDFは全部取得済み)

空のDFファイル(つまりWeb APIへ一切アクセスせず、全ての単語のWebDFを文字列長から推測する)で「カードキャプターさくら」「魔法少女リリカルなのは」「魔法少女まどかマギカ」の3つのWikipediaのページからキーワードの抽出もやってみた↓

df_max オプションは一般語フィルタとして働きます。
(つまり珍しい単語だけ残る)
このオプションを使ってWebDF取得済みのDFファイルを用いた結果は↓の通り。
(ちなみに空のDFファイルを使うと文字列の長いものだけ残る)

WebDFファイルは http://misc.pawafuru.com/webidf/ で配布しています。


コメントを残す

メールアドレスが公開されることはありません。