こんにちは、18日目の投稿になります
はじめに
今日は、リアクティブな分散システムを構築するためのライブラリ群であるCroを紹介したいと思います。
例題として、Cro::HTTP::Client
を使ってWikipedia記事の最初の段落を取得していきます。
この最初の段落は、簡潔にそのページのサブジェクトについての概要が記述されています。
そのため、自然言語処理において言語資源としてとてもよく使われています。
例えば、有名なシステムだとIBMのWatsonでの使用例があります [0]
私の知る限り代表的な取得方法は2種類あります:
-
- ダンプ(pages-articles.xml.bz2 [1])もしくはAPI [2] でのデータ取得後、Wiki記法で書かれたページを自分でパースして抽出する
-
- CirrusSearch [3] のダンプ [4] もしくはAPI [5] でのデータ取得後、JSONから該当要素を取り出す
ここで、CirrusSearchの方のデータの特徴はWiki記法が展開された状態になっていて、自分でパースする必要がない点です。
今回の例では、CirrusSearchのAPIを使って、最初の段落を取得していきます。
インストール
- zefで入れます
$ zef install --/test cro
$ zef install URI::Encode
ソースコード
use v6;
use URI::Encode;
use Cro::HTTP::Client;
my $url = uri_encode('https://ja.wikipedia.org/wiki/イチロー?action=cirrusdump'); # (#1)
my $client = Cro::HTTP::Client.new:
body-parsers => [
Cro::HTTP::BodyParser::JSON # (#2)
];
my $resp = await $client.get($url); # (#3)
CATCH { # (#4)
when X::Cro::HTTP::Error {
if .response.status == 404 {
say "Product not found!";
}
else {
say "Unexpected error: $_";
}
}
}
my $body = await $resp.body; # (#5)
$body.shift<_source><opening_text>.say; # (#6)
- Croにはパーセントエンコードのためのメソッドが用意されていないようなので、
URI::Encode
を使って、日本語文字列の含まれるURLをまずエンコードします。また、パラメータに?action=cirrusdump
を指定して、CirrusSearchのJSONダンプを取得できるようにします。(#1) - JSON処理のためのパーザーを指定して、クライアントを初期化します。(#2)
- getを実行します。 (#3)
- エラー処理方法を記述します。 (#4)
-
$resp.body
でパーザーの処理後のオブジェクトを取得します (#5) -
<_source><opening_text>
が最初の段落のテキストが格納されている要素の位置です (#6)
実行結果
きれいに取れました!
イチロー(本名:鈴木 一朗〈すずき いちろう〉、1973年10月22日 - )は、愛知県西春日井郡豊山町出身のプロ野球選手(外野手)。右投左打。現在はフリーエージェン
ト。血液型はB型。MLBシーズン最多安打記録保持者(262安打)であり、プロ野球における通算安打世界記録保持者(NPB/MLB通算4257安打でギネス世界記録に認定)、最多試合出場記録保持者(NPB/MLB通算3563試合出場)である。2017年現在、オリックス・ブルーウェーブに所属していた唯一の現役選手である。
以上、18日目の投稿でした。
出典
- [0] Murdock, J. William, et al. "Typing candidate answers using type coercion." IBM Journal of Research and Development 56.3.4 (2012): 7-1.
- [1] https://ja.wikipedia.org/wiki/Wikipedia:データベースダウンロード
- [2] https://www.mediawiki.org/wiki/Extension:TextExtracts/ja
- [3] https://wikimania2014.wikimedia.org/wiki/Submissions/CirrusSearch:_How_we%27ve_replaced_a_great_search_engine_with_an_awesome_search_engine
- [4] https://dumps.wikimedia.org/other/cirrussearch/
- [5] https://www.mediawiki.org/wiki/API:Search_and_discovery#CirrusSearch
ライセンス
All of the materials from Wikipedia are licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.