1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Perl 6Advent Calendar 2017

Day 18

Wikipedia記事の最初の段落を取得する

Last updated at Posted at 2017-12-18

こんにちは、18日目の投稿になります

はじめに

今日は、リアクティブな分散システムを構築するためのライブラリ群であるCroを紹介したいと思います。

例題として、Cro::HTTP::Clientを使ってWikipedia記事の最初の段落を取得していきます。

この最初の段落は、簡潔にそのページのサブジェクトについての概要が記述されています。
そのため、自然言語処理において言語資源としてとてもよく使われています。
例えば、有名なシステムだとIBMのWatsonでの使用例があります [0]

私の知る限り代表的な取得方法は2種類あります:

    1. ダンプ(pages-articles.xml.bz2 [1])もしくはAPI [2] でのデータ取得後、Wiki記法で書かれたページを自分でパースして抽出する
    1. 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日目の投稿でした。

出典

ライセンス

All of the materials from Wikipedia are licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?