テキストからキーワードを抽出しようとするとき、形態素解析して単語の頻度を数えるくらいのことではうまくいかないという話をしました。(テキストからキーワードを抽出する方法(非推奨))
自然言語処理の複雑なアルゴリズムを試すのも勉強にはなるのですが、「今すぐ答えがほしい」という状況を想定して、Yahoo!のキーフレーズ抽出APIを使ってみましょう。
お約束ですが、APIの使い方の基本的なところから学びたいという場合は、拙著『Webアプリケーション構築入門』を参照してください。
準備
Yahoo!のAPIを使うために、アプリケーションIDを登録します。表現は「登録」ですが、実際には「取得」です(参考)。
アプリケーションIDを取得したら、「appid=アプリケーションID
」という内容(右辺は適当に置き換える)のファイルyahoo.appidを作っておきます。
練習(APIの使い方の確認)
適当な文章をUTF-8で記述したファイルsentence.txtを用意し、以下のコマンドでAPIを呼び出します。
curl -d @yahoo.appid -d output=json --data-urlencode sentence@sentence.txt\ http://jlp.yahooapis.jp/KeyphraseService/V1/extract
結果はJSON形式で返ってくるので、それを処理する簡単なスクリプトyahookeywords.pyを用意します。
import sys, json for line in sys.stdin: keywords = json.loads(line) for keyword, score in sorted(keywords.items(), key=lambda x:x[1], reverse=True): print score, keyword.encode('utf-8')
先のコマンドとパイプでつなげば完成です。
curl -d @yahoo.appid -d output=json --data-urlencode sentence@sentence.txt\ http://jlp.yahooapis.jp/KeyphraseService/V1/extract |\ python yahookeywords.py
日本国憲法の前文をsentence.txtに書いておいた場合の結果は以下の通りです。
100 われら 71 諸国民 52 代表者 51 憲法 47 主権 43 自国 43 他国 42 日本国民 41 わが国全土にわ 41 原理 41 恵沢 38 法則 38 隷従 37 詔勅 34 国家 34 惨禍 34 専制 33 いづれ 33 協和 33 理想
本番
日本語の文章がtweets.txtに書かれていると仮定します。ここでは例によって、Streaming APIで取得したつぶやきの処理方法で紹介したもの、つまり「#iwakamiyasumi」というハッシュタグで検索し保存したつぶやきのうち、「年末特番 ジャーナリスト休業直前!上杉隆氏ラストインタビュー」の配信時間中(2011年12月30日15:00から17:45)のもの(本文のみ)を使います。
Yahoo! キーフレーズ抽出APIは、1回のリクエストのサイズが100KBまで(URLエンコードした状態で?)に制限されているので、テキストから「( #iwakamiyasumi live at http:…)」と「http…」という文字列を削除しましょう。
cat tweets.txt | sed -e "s/(.*live.at.*)//g" | sed -e "s/http.*[:space]//g" > tmp
補足:Ustream上でつぶやかれたものだけをとりだすなら、「( #iwakamiyasumi live at http:…)」が含まれるものだけを残してください。
方針1:ランダムサンプリング
ここで利用するテキストは、上述の準備をした後でもサイズ制限を超えているので、小さくなるようにランダムサンプリングをしてからAPIを呼び出してみましょう(「3/13」がサンプリングレートです。この値は適当に調整してください)。
cat tmp | awk '{ if (rand() < 3/13) print $0; }' |\ curl -d @yahoo.appid -d output=json --data-urlencode sentence@-\ http://jlp.yahooapis.jp/KeyphraseService/V1/extract |\ python yahookeywords.py
結果は以下のようになり、以前の結果と比べればずいぶんよくなっています(ランダムサンプリングなので、結果は実行ごとに変わります)。
100 上杉隆 99 岩上 66 uesugitakashi 61 iwakamiyasumi 46 IWJ・UST 46 上杉隆氏ファイナルインタビュー 43 ジャーナリスト休業直前 41 IWJ_UESUGI 38 ジャーナリズム 38 kfuruta777 36 ch1 35 T7OSEDyz 35 インターン 34 journalist 33 岩上安身 32 ホロスコープネイタル 32 自由報道協会 31 Toraji Tachiki 31 プレゼンテーター 31 佐々木俊尚
方針2:テキストの分割
テキストを分割し、APIを複数回呼び出すことも考えられます(実行前にresult.txtやx*を削除してください)。
split --line-bytes 30k tmp for file in x* do curl -d @yahoo.appid -d output=json --data-urlencode sentence@$file\ http://jlp.yahooapis.jp/KeyphraseService/V1/extract |\ python yahookeywords.py >> result.txt done cut -d ' ' -f 2 result.txt | sort | uniq
これによって得られるキーフレーズは以下のようになります(APIが変わらなければ、結果はいつも同じになります)。
DEMA, GGB9500, IWJ, IWJ1ch, IWJ_UESUGI, IWJ・UST, Journalist, NHKスペシャル, P8B88dXY, T7OSEDyz, Toraji, U-st, Ust, Web, asd59, ch1, genpatsu, higahayato, iwakamiyasumi, iwakamiyasumi", iwakamiyasumi2, iwakamiyasumi3, iwj_uesugi, kfuruta777, kinoryuichi, komatsunotsuma, ky00950, kyokonoguchi, pkashima, uesugitakashi, w, おしどりマコ, つねつぐ氏, アクセス権, アワード, インターン, インタビュー, ウギリークス, ガサ入れ, ガンバッテ, グリニッジ, ゴルフジャーナリスト, ジャーナリスト, ジャーナリスト休業直前, ジャーナリズム, デマYAROU, デマYallo, デマYaroo, デマyallo, デマ野郎, ニューヨークタイムズ, ハイパーメディアキュリエーター, ヒマナイヌ川井, ピューリッツアー賞, ピューリッツア賞もの, ピュリッツァー, プチ鹿島, プルト君, プレゼンテーター, ホロスコープネイタル, マイク, メディア, メルマガハ, 安川@shinfonic, 炎上ビジネス, 可視化, 岩上, 岩上さん上杉, 岩上安身, 記者クラブ, 恒次, 黒い池上彰, 今西, 佐々木俊尚, 佐藤栄作久, 自由報道協会, 社団法人, 小沢, 小渕, 上杉, 上杉リークス, 上杉隆, 上杉隆ファイナルインタビュー, 上杉隆氏ファイナルインタビュー, 上杉隆氏ラストインタビュー, 神々しい岩神, 世川行介, 孫崎, 孫碕, 大批判, 池田信夫, 朝生, 田中真紀子, 読売ツネツグ, 読売新聞, 日隅, 畠山, 鳩山, 鳩山ゆきよ, 鳩山由紀夫, 福島県民, 立花隆, 鈴木宗男
先の結果よりは冗長ですが、もともとの映像がどういうものだったのか、だいたいわかるようなものになっています。