ホリデープログラミング入門

ホリデーにプログラミングを楽しむための入門 by 船木信宏

API

[ リスト | 詳細 ]

記事検索
検索

全3ページ

[1] [2] [3]

[ 次のページ ]

http://farm1.static.flickr.com/48/161243417_5d708b0fe5.jpg

exir.jp のPDFデータから人名を抽出する


抽出という単語は日常、あまり使いませんがここではたくさんあるデータの中から特定のデータを抜き出す、という意味で使っています。

大量のデータ(人間が一生かかっても読みきれないぐらい、あるいはそもそも目で見てもわからないようなデータ)から特定のデータを抽出するのは、ルールさえ決まっていればコンピュータの得意とするところです。

今回は上場企業のプレスリリースを集めているexir.jpのデータから人名を抽出してみることにします。

MeCabを使って形態素解析する


exir.jpのデータはオトモダチ特権でSQLで取得させてもらえました。
全データではありませんでしたが、それでもテキストで700MB程度。

で、ここから人名を抽出するわけですがそれにはまずMeCabを使います。MeCabがやってくれる形態素解析という処理は「私の名前は船木です」という文章から
私 名詞,代名詞,一般,*,*,*,私,ワタシ,ワタシ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
名前 名詞,一般,*,*,*,*,名前,ナマエ,ナマエ
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
船木 名詞,固有名詞,人名,姓,*,*,船木,フナキ,フナキ
です 助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
と品詞ごとに分解してくれます。精度は100%ではないのと、元のテキストデータも若干おかしなところがあるのですが、今回は抽出してみるだけなので問題ないでしょう。

MeCabをコマンドラインから使える状態にしたら、
% nohup mecab /tmp/exir.txt -o /tmp/exir.analyzed -b 819200 >/tmp/results.log &
といった感じに実行します。exir.txtが元データ。MeCabは十分高速なのでさほど時間はかかりません。結果を保存したexir.analyzedは8GBを超えました。

分割する


このままだとファイルサイズが大き過ぎてPHPのfopenで開けず困るので(32bitなOSのとき:こちら参照)ファイルを分割します。
% split -C 1000m exir3.analyzed exir3.analyzed.split.
1GBずつのファイルが9つできました。これには結構時間がかかりました。

姓名だけ列挙


品詞があれこれありますが「名詞,固有名詞,人名」を取得するようにしました。
<?php
// exir_mecab.php
$fp = fopen($argv[1], 'r');
if (!$fp) {
die("cannot open file.\n");
}
$key = '名詞,固有名詞,人名,';
$keyLen = mb_strlen($key);
$lastName = null;
while (1) {
$buf = fgets($fp);
if ($buf == '') {
break;
}
if (($idx = mb_strpos($buf, $key)) !== false) {
$type = mb_substr($buf, $idx+$keyLen, 1);
if ($type === '姓') {
if (!empty($lastName)) { // 直前が人名のときはダメ
continue;
}
$lastName = mb_substr($buf, 0, $idx-1);
} else if ($type === '名' && !empty($lastName)) {
echo $lastName, " ", mb_substr($buf, 0, $idx-1), "\n";
$lastName = null;
}
} else {
$lastName = null;
}
}
fclose($fp);

これで姓名が列挙されたファイルが生成できます。
% php exir_mecab.php exir.analyzed >names.txt

数を数えてみる


<?php
$fp = fopen($argv[1], 'r');
$data = array();
while (1) {
$buf = fgets($fp);
if ($buf == '') {
break;
}
$name = trim($buf);
if (!isset($data[$name])) {
$data[$name] = 1;
} else {
$data[$name]++;
}
}
fclose($fp);
arsort($data);
foreach ($data as $name => $num) {
echo "$num\t$name\n";
}

こんな感じ。

結果


出力結果を見ると上位5位が
7899 銭 円
585 藤田 晋
564 オーク ション
410 高品 質
393 京 進
になっていました。。うーん。585回登場した藤田晋氏はサイバーエージェントの社長ですね。他はどうも形態素解析が間違ってしまったようです。

続く下位を見ていくと
322 植田 修平
314 井上 高志
283 銭 通
276 折口 雅博
227 伊藤 忠
218 南部 靖之
200 加藤 博敏
189 杉野 文則
188 大谷 省三
169 渡辺 博文
ところどころ人名でないものも含まれていますが、おおむね社長の名前が列挙されているようです。

一応何かに使えそうなデータになった?のでexirさんにお渡ししてみることにします。

開く コメント(0)


Y!のAPIのドメインがyahoo.co.jpからyahooapis.jpに変更


忙しさにかまけて記事の更新がすっかり滞ってしまいました。
exirの解析はちょっと時間がかかるので手軽なところから。

Yahoo!デベロッパーネットワークで告知されているとおりY!APIのドメインが変更されるようです。移行期間の終了日は未定、という何とも忘れそうな話なのでさっさと片付けることにしました。

自分はいろいろなところでY!APIは使っているはずですが、どこで使っているのかよく覚えていません。というわけでまず探すスクリプトから作ることにします。

Linuxコマンドの実行


<?php
echo find . -type d;
こんなコードをロリポップにアップして実行してみましたが何も表示されず。(Y!のブログにはバッククォートが表示されない模様、@マークのキーをShift押しながら表示されるやつです、PHP: 実行演算子 - Manual
残念ながら別の方法でやるしかないようです。

なお、zshなら
grep yahoo.co.jp **/*.php
と簡単にカレントディレクトリ以下の全.phpファイルに対して検索がかけられて簡単にわかります。カレントディレクトリ、というのはWindowsで言うなら今開いているフォルダ、です。

findとgrepを使うなら
find . -name "*.php" -print|xargs grep yahoo.co.jp
こんな感じでしょうか。

dirで再帰的にファイルを探す


自分の借りているロリポップには16845ファイルしかないようなので(管理画面のディスク使用量で見た限り)安直に.phpファイルを探して、中身をreadして文字列一致を取ることにしました。桁違いにファイル数が多い場合は、あるディレクトリは走査しない、といった工夫をした方がいいでしょう。

<?php
ini_set('max_execution_time', 0);
define('SEARCH_QUERY', 'yahoo.co.jp/');

recursivesearch(dirname(__FILE__)); // dirname(__FILE__)で当該ファイルのカレントディレクトリが得られる

function recursivesearch($path)
{
$d = dir($path);
while (false !== ($entry = $d->read())) {
if ($entry == '.' || $entry == '..') { // カレントディレクトリを表す"."と親ディレクトリを表す".."は無視
continue;
}
$next = "$path/$entry";
if (is_dir($next)) {
recursivesearch($next); // 再帰的に呼び出す
} else if (strpos($entry, '.php') !== false) { // ファイル名に.phpが含まれているか、厳しくいくならsubstr($entry, -4) === '.php'
if (strpos(file_get_contents($next), SEARCH_QUERY) !== false) {
echo $next, "<br />\n";
}
}
}
$d->close();
}
思ったより速く、数秒で結果が出ました。
SEARCH_QUERYで指定した文字列(yahoo.co.jp/)が含まれたファイル名の一覧です。あとは手動で見ていきましょう。

凝るなら、strposでマッチした近辺の文字列を取ってくるとかすればより検索エンジンらしい結果を出せます。

置換


不用意に自動で置換すると動作しなくなりそうなので、今回は1つずつ見ました。
vimでファイル内の文字列を置換するときは、
:%s/api.search.yahoo.co.jp/search.yahooapis.jp/g
です。

使っていた箇所



だいぶ古いものばかりですが、気になるのがあったらご覧ください。

開く コメント(0)

グラフを描画するPHPのライブラリ 2008年版


PHPでグラフを描画するライブラリはいくつかありますが、最近使っていなかったので調べ直してみました。

はてなブックマーク - タグ グラフ
はてブで検索。これは、と思ったものを取り上げています。PHPから動かせるもの前提。


URLのGETパラメータだけで表現できる手軽さ。ただ、グラフの縦横が1000pxまでなので大量のデータをプロットするようなグラフだと収まりきらないかもしれません。

PHP5用のライブラリもあります。
Charts with PHP and Google Charts API // Notebook // Ludwig P.


Flashで描画するグラフ。やはりきれい。インタラクティブ性も抜群。


PHP4用に組まれたライブラリ。gdで動く。静的に画像を生成できる点で、大規模なデータのプロットには向いています。データはCSVからの読み込みなど。


まとめ


何年か経つと、使いたくなるライブラリも様変わりするものです。グラフもアンチエイリアスが効いてきれいになりました。

さて、今回EXIRでグラフを描く際はpChartを使おうかと思います。

開く コメント(3)

開く トラックバック(1)

2007年6月現在開催中のAPIコンテストを紹介



ホリデープログラミングの成果発表の場としては最適なマッシュアップコンテストが現在いくつか開催されています。ネタを考えつつご紹介。

今までに開催されたコンテスト


APIを使って、という条件のコンテストは5つ知っています。(追記:4つと書いていましたが5つでした(^^;)


2年前とだいぶ前ですが開催されていました。記事によると最優秀賞の100万円は該当なしだったらしい。


APIが徐々に登場し出した頃、サンとリクルートの協賛で開催されました。僕もこれ以降のコンテストには応募しています。
このときはじゃらんAPIを使ってこんなのを。
気まま宿探し powered by じゃらん


カカクコムとMozillaJapanの協賛で開かれたコンテスト。
4travelの画像を使ったフォントを生成するBookmarkletをつくりました。
zuzara : 4travelの写真でフォント(?)をつくるAPI: “phont”


サンとリクルートのコンテスト第2弾。Sagoolの派生APIでWacaalを使って「HANAABI!!」なる一発ネタで受賞させていただきました。
HANAABI!!

第3弾以降も計画されているようです。


こちらは現在審査中のコンテスト。今月末に結果が出る予定です。



TAGGY Mash Up Contest 2007


さてここから現在募集中のコンテスト。


TAGGY主催。期限は今月末まで。グランプリに30万円、準グランプリに10万円。今月末締切です。
TAGGYのAPIはJSONP形式なので、JavaScriptからの利用が自然です。


TAGGY自体がマッシュアップなので、それをさらにマッシュアップしましょう、というコンテスト。ちょっと知恵を絞る必要あり、です。

タグで検索できるわけですが、タグ=キーワードを別のAPIから引っ張ってくるのがいいでしょうか。



もごもごAPI、Timelogのコンテスト



Twitter風サービスが揃ってコンテスト開催。思わず同じものを応募したくなります。優勝賞金も同じ5万円。募集期間はもごもごが8月15日、Timelogは今月末まで。

情報を開放するタイプのAPIではなく、投稿タイプなので「もごもご」を便利にするもの、を作ることになりそうです。

一番シンプルなのは、先ほどのYWitterのような投稿できるクライアントソフト。
個人的には人工無脳のような自動的に投稿するソフトも好きです。


Twitter用に公開されているソフトは参考になるかもしれません。
Twitter Fan Wiki - This is the unofficial place where Tw...
英語ですが、Mashups辺りは参考になりそう。

投稿されたひとり言をビジュアライズするのもコンテスト的には楽しい作品になりそうです。
例えばdiggのコンテストで優勝した記事の人気度に応じて建物がにょきにょき高くなる作品みたいに。
digg api contest finalists - DiggCity


まとめ


自分の場合、「コンテストだから」と省エネな一発ネタに走りがちなのですが可能な限り2度目以降も使いたくなるようなサービスを作りたいものです。

締切が近いのはTAGGYとTimelogのコンテスト。あと3週間ばかりです。友人とわいわいアイディアを出し合うのが好きで、1つこれはいけそう!というのを閃きましたが果たして完成するかどうか。。

開く コメント(1)

Yahoo!APIコンテスト〆切まであと36時間!

http://farm1.static.flickr.com/24/53127137_fe4a5e6f04.jpg
photo by bunchofpants
Yahoo! JAPAN - WEB API コンテストの締め切りまであと36時間と迫りました。まだ全く手をつけていません!

とはいえ、何を作るかはだいたい決めてありまして今流行の「twitter」のYahoo!ウィジェットを作ってみようかと思います。

今までPHPばかりでしたが今回はだいぶ趣が変わりそうです。個人的にウィジェット系は一度も作ったことがないのと、twitter APIをまだいじっていないので楽しみ。

36時間しかないので、ライブ感重視でさくさくつくっていくつもりです。実況はもちろんtwitterで。
Twitter / zuzara

まずはなんとなくカウントダウンしてくれるものを作ってみました。
<?php
$limit = mktime(0, 0, 0, 5, 1, 2007);
$time = $limit - time();
$hour = floor($time / 3600);
$min = floor($time % 3600 / 60);
header("Content-Type: text/html; charset=UTF-8");
echo sprintf("〆切まであと%d時間%d分!", $hour, $min);
http://www.zuzara.com/pub/timelimit.php

〆切まであと35時間50分!

開く コメント(1)

全3ページ

[1] [2] [3]

[ 次のページ ]


.


プライバシー -  利用規約 -  メディアステートメント -  ガイドライン -  順守事項 -  ご意見・ご要望 -  ヘルプ・お問い合わせ

Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.

みんなの更新記事