≫はじめに
Webページのテキストに連動した広告を配信する Google AdSense に代表されるようなサービスを、コンテクストサービスと言う。
コンテクストというのは、「Webページの内容(主にテキスト内容)と連動した」という意味。
この、Webページの内容と連動する something of context service を実現するための技術についてメモしておきます。
UNIX や Perl にある程度熟練していて、わかち書き や 形態素解析 と聞いてピンと来る人向けのドキュメントです。
コンテクストというのは、「Webページの内容(主にテキスト内容)と連動した」という意味。
この、Webページの内容と連動する something of context service を実現するための技術についてメモしておきます。
UNIX や Perl にある程度熟練していて、わかち書き や 形態素解析 と聞いてピンと来る人向けのドキュメントです。
≫文字コードについて
日本語のドキュメントを扱おうと思うと、文字コード変換の知識がないとはじまりません。
ちょっと古い記述ですが、当サイト内の 文字コードと改行コードについて や、HTML, CGIでの文字コード指定について あたりを軽く参考にどうぞ。
しかし、いまやPerlライブラリやモジュールの力を借りれば、それほど知恵も労力もかけずに文字コード変換が可能です。 モジュールじゃなくて、ライブラリだけで、とか、本当に文字コード変換だけならライブラリの方が軽いこともあってお好みな方へ。
Unicodeデコーダ「simaguni.pl」
ちょっと古い記述ですが、当サイト内の 文字コードと改行コードについて や、HTML, CGIでの文字コード指定について あたりを軽く参考にどうぞ。
しかし、いまやPerlライブラリやモジュールの力を借りれば、それほど知恵も労力もかけずに文字コード変換が可能です。 モジュールじゃなくて、ライブラリだけで、とか、本当に文字コード変換だけならライブラリの方が軽いこともあってお好みな方へ。
- jcode.pl
EUC/Shift_JIS/JISだけならこれで十分。国民の車輪。
- unicode.pl(←対象をファイルに保存でダウンロード)
EUC と unicode を相互に変換するUNIX用ライブラリ。
Unicodeデコーダ「simaguni.pl」
≫わかち書き
「わかち書き」とは、日本語の文章を単語ごとに空白で区切る処理の名称です。
「わかち書き」 とは、 日本語 の 文章 を 単語 ごと に 空白 で 区切る 処理 の 名称 です。
日本語は、通常、単語の区切りに空白がないので、この「わかち書き」処理が必須となります。
この、日本語の文章を簡単に「わかち書き」する専用の道具は、誰でも自由に利用できる形で配布されています。
しかも、「わかち書き」にとどまらず、品詞まで判定してくれたりします(いわゆる「形態素解析」)。
代表的なものは以下の2つ。 今回は、kakasi を使用します。
ちなみに、kakasi が kakashi という風に、ヘボン式表記でないのは、
さて、では実際に kakasi のわかち書き処理を体験してみましょう。
コマンドラインで kakasi -w と打つと、kakasi が入力受付待ちになるので、好きな文章を入力してエンターしてみましょう。
つづいて、この kakasi を Perl で扱うためのモジュールも必要になります。 Text::Kakasi がインストールされているか確認するには以下を実行して、何も出力されなければインストールされています。
CPAN だと、以下。
「わかち書き」 とは、 日本語 の 文章 を 単語 ごと に 空白 で 区切る 処理 の 名称 です。
日本語は、通常、単語の区切りに空白がないので、この「わかち書き」処理が必須となります。
この、日本語の文章を簡単に「わかち書き」する専用の道具は、誰でも自由に利用できる形で配布されています。
しかも、「わかち書き」にとどまらず、品詞まで判定してくれたりします(いわゆる「形態素解析」)。
代表的なものは以下の2つ。 今回は、kakasi を使用します。
ちなみに、kakasi が kakashi という風に、ヘボン式表記でないのは、
kakasi = kanji kana simple inverterだからだそうです。
さて、では実際に kakasi のわかち書き処理を体験してみましょう。
コマンドラインで kakasi -w と打つと、kakasi が入力受付待ちになるので、好きな文章を入力してエンターしてみましょう。
% kakasi -wてな感じで、空白で分けらると思います。
今日はとても良い天気だ。
今日は とても 良い 天気 だ 。
つづいて、この kakasi を Perl で扱うためのモジュールも必要になります。 Text::Kakasi がインストールされているか確認するには以下を実行して、何も出力されなければインストールされています。
% perl -MText::Kakasi -e ''Text::Kakasi をソースからインストールする方法は、こちらにやさしく書いてあるようです。
CPAN だと、以下。
% perl -MCPAN -e 'install Text::Kakasi'
≫Perlでわかち書き
kakasi と Text::Kakasi がそろったら、Perlスクリプトでわかち書きしてみます。
わかりやすいように、改行するようにしてみました。
いろんな文章で試してみると、精度がそれほど高くないことに気づくと思うが、まあ、その辺はあまり気にしない。
だって、日本語って難しいんだぜ(´ー`)
Text::Kakasi についてはCPANのドキュメントに詳しい。
#!/usr/bin/perl実行すると、
use Text::Kakasi;
my $res = Text::Kakasi::getopt_argv('kakasi', '-ieuc', '-w');
my $str = "わかち書きは、決して簡単ではない。";
my $kakasi_str = Text::Kakasi::do_kakasi($str);
$kakasi_str =~ s/ /\n/g;
print "$kakasi_str";
exit;
わかちってな感じ。
書き
は
、
決して
簡単
ではない
。
わかりやすいように、改行するようにしてみました。
いろんな文章で試してみると、精度がそれほど高くないことに気づくと思うが、まあ、その辺はあまり気にしない。
だって、日本語って難しいんだぜ(´ー`)
Text::Kakasi についてはCPANのドキュメントに詳しい。
≫API
インターネットサービスで、API(Application Program Interface)が次々に公開されている。
インターネットサービスのAPIとしては、Google、Yahoo!、AmazonのAPIが有名。
APIを利用する際は、たいてい公開元に開発者としての登録が必要。
APIの呼び出し回数の制限など利用規約をよく読んでから利用しましょう。
主なAPIについては以下。
たいてい英語です。
他にも公開されてるAPIはたくさんあります。
ブログ検索大手の Technorati とか、マイクロソフトの msn とか。
APIとはAPI公開の真意は、新たなサービスを作ってくれ、ってこと。
あるプラットフォーム(OSやミドルウェア)向けのソフトウェアを開発する際に使用できる命令や関数の集合のこと。また、それらを利用するためのプログラム上の手続きを定めた規約の集合。個々の開発者は規約に従ってその機能を「呼び出す」だけで、自分でプログラミングすることなくその機能を利用したソフトウェアを作成することができる。[IT用語辞典e-Wordsより]
インターネットサービスのAPIとしては、Google、Yahoo!、AmazonのAPIが有名。
APIを利用する際は、たいてい公開元に開発者としての登録が必要。
APIの呼び出し回数の制限など利用規約をよく読んでから利用しましょう。
主なAPIについては以下。
たいてい英語です。
- Google Web APIs Create a Google Account Doc
1,000クエリー/日まで。
- Yahoo! Search Developer Network Get Yahoo! ID Doc
IPごとに 50,00クエリー/日まで。Yahoo!ID以外にアプリケーションIDっつーのも、のちのち取らされます。
- Amazon Web サービス Get Subscription ID Doc
クエリーは1秒に1回まで。キャッシュ機構推奨らしいです。
他にも公開されてるAPIはたくさんあります。
ブログ検索大手の Technorati とか、マイクロソフトの msn とか。
≫キーワードの抽出
Webページのテキストに連動するということは、テキストの内容を何らかの方法で認識、評価しなければなりません。
やり方は色々と考えられますが、今回はこちらの形態素解析と検索APIとTF-IDFでキーワード抽出を参考に、テキストの中で重要なキーワードを求める方法を採用します。
・TF-IDF という指標を用いてキーワードを評価。
・TF-IDF は値が大きいほどキーワードとしての評価が高い。
TF-IDF を求めるには、以下のような数値が必要です。
TF-IDF = TF * log ( N / DF )
あるテキストの中に 5 回登場する「 Ajax 」というキーワードのTF-IDFを Google を用いて算出すると、
TF = 5
DF = 2050000
N = 8000000000
TF-IDF of "Ajax" = 5 * log( 8000000000 / 2050000 ) = 41.3467851375583
重要度は およそ 41 だとわかります。
同じ、テキストの中に同じく 5 回登場する「 JavaScript 」というキーワードのTF-IDFを求めると、
TF = 5
DF = 7770000
N = 8000000000
TF-IDF of "JavaScript" = 5 * log( 8000000000 / 7770000 ) = 34.6846332814121
重要度は およそ 35 だとわかります。
したがって、テキスト内で「 Ajax 」と「 JavaScript 」を比較すると、「 Ajax 」の方が重要であると判断できます。
キーワードごとに、TF-IDF の値を求めると、値の高い順にテキストを代表する度合いの強いキーワードを抽出することができます。
やり方は色々と考えられますが、今回はこちらの形態素解析と検索APIとTF-IDFでキーワード抽出を参考に、テキストの中で重要なキーワードを求める方法を採用します。
・TF-IDF という指標を用いてキーワードを評価。
・TF-IDF は値が大きいほどキーワードとしての評価が高い。
TF-IDF を求めるには、以下のような数値が必要です。
- テキスト中のキーワード出現回数(TF)
テキストに含まれるキーワードが、そのテキストの中に何回出現するかという数字
- 全てのドキュメント数(N)
この場合の全ドキュメントとは、例えば Googleで検索できるWebページ数全体(Google は 80 億以上もの URL を検索)。
- キーワードが含まれるドキュメントの数(DF)
Nの中で、キーワードを含むドキュメントの数
TF-IDF = TF * log ( N / DF )
あるテキストの中に 5 回登場する「 Ajax 」というキーワードのTF-IDFを Google を用いて算出すると、
TF = 5
DF = 2050000
N = 8000000000
TF-IDF of "Ajax" = 5 * log( 8000000000 / 2050000 ) = 41.3467851375583
重要度は およそ 41 だとわかります。
同じ、テキストの中に同じく 5 回登場する「 JavaScript 」というキーワードのTF-IDFを求めると、
TF = 5
DF = 7770000
N = 8000000000
TF-IDF of "JavaScript" = 5 * log( 8000000000 / 7770000 ) = 34.6846332814121
重要度は およそ 35 だとわかります。
したがって、テキスト内で「 Ajax 」と「 JavaScript 」を比較すると、「 Ajax 」の方が重要であると判断できます。
キーワードごとに、TF-IDF の値を求めると、値の高い順にテキストを代表する度合いの強いキーワードを抽出することができます。
TOP > スクリプト制作メモ > コンテクストサービスの基礎知識