• 検索結果がありません。

Microsoft PowerPoint Perl講習会.ppt [互換モード]

N/A
N/A
Protected

Academic year: 2021

シェア "Microsoft PowerPoint Perl講習会.ppt [互換モード]"

Copied!
80
0
0

読み込み中.... (全文を見る)

全文

(1)

先端メディアサイエンス学科 中村研究室

1

Perl 講習会

(2)

先端メディアサイエンス学科 中村研究室

Perlとは

• プログラミング言語の1つ

• 文字列を処理するのに適している言語

• 長時間処理するようなものに適した言語

• 整形などをするのに適した言語

(3)

先端メディアサイエンス学科 中村研究室

Perl開発環境のインストール

• Padreをインストール

– PadreはPerlの統合開発環境 • 内部にStrawberry Perlが入っている – 本当はCygwin+PerlやActivePerlなどをインス トールするのが良いのですが,最初の段階では Padreで十分!

• Padreのインストール方法

– http://padre.perlide.org/download.html – 上記URLにアクセスして,DWIN Perlをダウン ロードおよびインストール!

(4)

先端メディアサイエンス学科 中村研究室

Perlの実行方法

これを押すだけ! コマンドで実行!

(5)

先端メディアサイエンス学科 中村研究室

ProcessingとPerl

• 同じ所

– プログラミング言語なので変数,計算,条件分 岐,繰返し,メソッド,クラスなど同じ int i = 1; int count = 0; while( i <= 12345 ){ if( (12345 % i) == 0 ){ // 12345をiで割った余りが // 0だったらcountを増やす count++; } i++; } println( "約数の数は"+count ); my $i = 1; my $count = 0; while( $i <= 12345 ){ if( (12345 % $i) == 0 ){ # 12345を$iで割った余りが # 0だったら$countを増やす $count++; } $i++; }

print STDOUT "約数の数は".$count;

(6)

先端メディアサイエンス学科 中村研究室

ProcessingとPerlの違い

• Perlでは変数名の最初には必ずドルが付く

– 例: $value, $hoge, $ball などなど

– 変数には型(int, Stringなど)が無い(勝手に 解釈) – 変数を定義するときには my をつける – 変数への代入は「=」でつなぐだけ

– 配列名には「@」が最初に,連想配列(ハッ

シュ)には「%」が最初につく

– ユーザからの入力は <STDIN> で,ユーザに

対する出力は STDOUT で行う

(7)

先端メディアサイエンス学科 中村研究室

ProcessingとPerlの違い

• Perlではコメント行は # で始まる

– Processingは // で始まる

• Perlで出力するには print を使う

– print 出力先 出力内容; のようになる – 出力先は省略可能 – 出力先にSTDOUTと書くと画面出力せよの意味 – 出力先にファイルを指定するとファイル出力

– 文字列の連結には「.」を使う

– Processingの場合は「+」を使う

(8)

先端メディアサイエンス学科 中村研究室

ProcessingとPerlの違い

• if は同じだけれど else if が elsif になる

– if( ... ){ ... } elsif( ... ){ ... } elsif( ... ){ ... } else { ... }

– 数値が等しいという意味では ==/!= • if( $id == 5 ){ 5の時の処理 } • if( $id != 5 ){ 5じゃない時の処理 } こちらはProcessingと同じ. 「かつ」「または」も「&&」や「¦¦」で同じ – 文字列が等しいという意味では eq/ne • if( $name eq '中村' ){ 中村の時の処理 } • if( $name ne '中村' ){ 中村じゃない時の処理 }

(9)

先端メディアサイエンス学科 中村研究室

ProcessingとPerlの違い

• メソッド(サブルーチン)は

– 返り値型 メソッド名( 引数 ){ ... } ではなく – sub サブルーチン名{ ... } となる – サブルーチンの呼出は &サブルーチン( 引数 ); – 引数の処理は

void show( int x, int y ){ ... } というものを sub show {

my ( $x, $y ) = @_; # のように書く }

(10)

先端メディアサイエンス学科 中村研究室

ProcessingとPerlの違い

• サブルーチンを使っている例

– あまり大きな差が無いことがわかりますか? sub getNumberOfYakusu { my ( $num ) = @_; my $count = 0; while( $i <= $num ){

if( ($num % $i) == 0 ){ # $numを$iで割った余りが # 0だったら$countを増やす $count++; } $i++; } return $count; }

print &getNumberOfYakusu(12345); int getNumberofYakusu( int num ){

int count = 0; int i = 1; while( i<=num ){ if( (num % i) == 0 ){ // numをiで割った余りが // 0だったらcountを増やす count++; } i++; } return count; } println( getNumberOfYakusu(12345) );

(11)

先端メディアサイエンス学科 中村研究室

試しに

• 約数の数を表示するプログラムを,コピペ

(12)

先端メディアサイエンス学科 中村研究室

文字コードの問題

• そのまま実行すると...

何やら読めない文字列が…

本当はこうしたい!

(13)

先端メディアサイエンス学科 中村研究室

文字コードを変更する

(14)

先端メディアサイエンス学科 中村研究室

[演習]

• 約数を表示するサブルーチンを作り,1から

1000までのそれぞれの数の約数の数を表示

せよ!

• 引数として入力した数字が素数かどうかを

判定するサブルーチンを作り,素数ならそ

の値を表示するプログラムを作成せよ!

• 1から10000までのすべての素数を表示せよ

(15)

先端メディアサイエンス学科 中村研究室

入力を取得する

• ユーザからの入力を取得して結果を変更し

たい!

– 年齢を訊いて,お酒が飲めるかどうかを判断 – リンゴ(120円)を何個購入するかを訊いて, 合計の値段を表示 – 苗字と名前を訊いて,確認したい

(16)

先端メディアサイエンス学科 中村研究室

入力を取得する

• 取得する方法は単に <STDIN> と書くだけ!

print STDOUT "年齢は何歳ですか?"; my $age = <STDIN>; if( $age >= 20 ){ print STDOUT "お酒が飲めます"; } else { print STDOUT "お酒が飲めません"; } print STDOUT "苗字は?"; my $myoji = <STDIN>; print STDOUT "名前は?"; my $namae = <STDIN>; print STDOUT "ようこそ" . $myoji . $namae . "さま";

(17)

先端メディアサイエンス学科 中村研究室

[演習]

• リンゴ(120円)を何個購入するかユーザ

に質問し,その個数に応じて合計がいくら

になるかを回答せよ

• リンゴ(120円)とみかん(30円)を何個

ずつ購入するか質問し,ユーザの回答に応

じて合計がいくらになるか回答せよ

• ユーザが1000円しか持っていないとき,リ

ンゴをいくつ購入するか質問し,購入可能

かどうか回答せよ

(18)

先端メディアサイエンス学科 中村研究室

Perlで文字列処理

• ここからはPerlの得意な世界へ

– 文字列の処理 – ファイル入出力

(19)

先端メディアサイエンス学科 中村研究室

ファイルから読み込む

• ファイルを開く

– open( FILE_IN, "ファイル名" );

• ファイルの内容を1行 $line に読み込む

– $line = <FILE_IN>; – 1行読み込む際には「<>」をつける – $line の内容を表示するには...

• print STDOUT $line;

• ファイルを閉じる

(20)

先端メディアサイエンス学科 中村研究室

ファイルに書き込む

• ファイルを開く

– open( FILE_OUT, ">ファイル名" ); – open( FILE_OUT, ">>ファイル名" ); – 「>」が1個の場合はファイルを一旦削除して新 規作成,2個の場合はそのファイルに追記する

• ファイルに書き込む

– print FILE_OUT "1行目" . "¥n"; – print FILE_OUT "2行目" . "¥n"; – 文字列を繋ぐ時は「.」で,改行は「¥n」

• ファイルを閉じる

– close( FILE_OUT );

(21)

先端メディアサイエンス学科 中村研究室

ファイルから読み込む

• ファイルの中身を読み込む!

– 繰り返しでひたすら読み込む

• while( $line = <FILE_IN> ){ ... }

• whileはファイルの最終行まで来たら終了

• おまじない chomp( $line ); という行を入れておくこ

とによって,行の最後に入っている改行を削除する ことができる(¥nをカット)

(22)

先端メディアサイエンス学科 中村研究室

[演習] 読み込んで表示

• 読み込んだ内容を表示してみよう

– http://snakamura.org/files/ims50.csv – open で開き,print で表示する

• 読み込んだ内容に応じて画面に出力する内

容を変更してみよう

– 上記ファイルを読み込み,内容に応じて表示を 変更する – MSなら現象数理学科, FMSなら先端メディア サイエンス学科,NDならネットワークデザイン 学科と表示する

(23)

先端メディアサイエンス学科 中村研究室

実行結果

• こんな感じになります.文字化けしている

人は文字コード変換を!

文字化けた例

(24)

先端メディアサイエンス学科 中村研究室

演習: 読み込んで表示

• 読み込んだ内容をそのままファイルへ書き

込んでみよう(転写する)

• 読み込んだ内容に応じて出力を変更し,フ

ァイルに出力してみよう

– MSなら現象数理学科, FMSなら先端メディア サイエンス学科, NDならネットワークデザイ ン学科と表示する

(25)

先端メディアサイエンス学科 中村研究室

演習: 数える

• MS,FMS,NDの数を数えて表示しよう

– 下記のファイルをダウンロードして,そのそれ ぞれの数をカウントしてみよう – http://snakamura.org/files/ims.csv • MS: 個,FMS: 個,ND: 個 – http://snakamura.org/files/ims2.csv • MS: 個,FMS: 個,ND:

(26)

先端メディアサイエンス学科 中村研究室

MS, FMS,ND数カウント

open( FILE, "ims.csv" ); my $ms = 0; my $fms = 0; my $nd = 0; while( my $line = <FILE> ){ chomp($line); if( $line eq "MS" ){ $ms ++; } elsif( $line eq "FMS" ){ $fms ++; } elsif( $line eq "ND" ){ $nd ++;     } } close( FILE ); print "MS  = " . $ms . "¥n"; print "FMS = " . $fms . "¥n"; print "ND  = " . $nd . "¥n";

(27)

先端メディアサイエンス学科 中村研究室

演習: 数える

• サイコロの目の偏りを調べる

– http://snakamaura.org/files/saikoro10.csv – http://snakamaura.org/files/saikoro1000.csv – http://snakamaura.org/files/saikoro100000.csv – http://snakamaura.org/files/saikoro100000000.csv

(28)

先端メディアサイエンス学科 中村研究室

数えるプログラムは面倒

• 数える対象分の変数を用意するのは大変

• 配列を使おう!

(29)

先端メディアサイエンス学科 中村研究室

配列

• 配列の最初には「@」をつける

– @count • countという名前の配列をつくる – 要素数を指定する必要はない – 配列の各要素は「$」ではじめ,要素番号は0か ら,要素は [] で指定する

• $count[0], $count[1], $count[2], ... • print $count[0];

• $count[0] = 3; $count[2]++; など

• 配列に一度に値を入れるには = () を使う

(30)

先端メディアサイエンス学科 中村研究室

配列(文字列も一緒)

• 文字列の配列も同じように利用

• $name[0] = 'nakamura';

• @name = ('nakamura', 'komatsu', 'kikuchi');

• 「@_」というメソッドの最初に登場する不

思議なおまじないは,引数の配列という意

• my ($x, $y) = @_; は,@_ が要素が2つの配列で あり,$x = $_[0]; $y = $_[1]; としているという 意味

(31)

先端メディアサイエンス学科 中村研究室

[演習]

• 下記のファイルをダウンロードし,1∼100

までの数字が何個ずつあるか表示せよ

– http://snakamura.org/files/num100.csv – なお,数を数える時は配列を利用せよ

(32)

先端メディアサイエンス学科 中村研究室

パターンがあると大変

• 数値なら配列でいいが,文字列の場合はど

うやって数えたら良いの?

• その文字列分,変数を用意する?

• それはあまりに面倒すぎる...

連想配列(ハッシュ)を使おう!

(33)

先端メディアサイエンス学科 中村研究室

連想配列とは...

• 配列の場合は 0, 1, 2, 3, 4, ... がインデック

ス(目次)となってそれぞれの値を呼び出

したりするが,FMS, MS, NDなどをインデ

ックスとしてしまう

0 55 1 48 2 63 3 55 4 59 5 47 FMS 191 MS 140 ND 120 SFC 300 IAMAS 420 FUN 380

(34)

先端メディアサイエンス学科 中村研究室

連想配列

• 連想配列の最初には「%」をつける

– %count_ims • count_ims という名前の連想配列をつくる

• 配列の場合は 0, 1, 2, ... で値を取得するが,

もっとわかりやすい語で配列を作るもの

– $count_ims{ 'FMS' } = 190; – $count_ims{ 'MS' } = 140; – $count_ims{ 'ND' } = 120;

– print STDOUT $count_ims{'FMS'}; – print STDOUT $count_ims{'MS'}; – print STDOUT $count_ims{'ND'};

(35)

先端メディアサイエンス学科 中村研究室

連想配列

• 連想配列の最初には「%」をつける

– %price • price という名前の連想配列をつくる

• 配列の場合は 0, 1, 2, ... で値を取得するが,

もっとわかりやすい語で配列を作るもの

– $price{ 'apple' } = 100; – $price{ 'orange' } = 80; – $price{ 'melon' } = 950;

(36)

先端メディアサイエンス学科 中村研究室

連想配列

• 連想配列の最初には「%」をつける

– %name • name という名前の連想配列をつくる • $name{ 'nakamura' } = 'satoshi';

• $name{ 'komatsu' } = 'takanori';

• 何かの数を数えてみる

– %ims_count;

• $ims_count{ 'FMS' }++; • $ims_count{ 'MS' }++; • $ims_count{ 'ND' }++;

(37)

先端メディアサイエンス学科 中村研究室

連想配列の内容を表示

下記どちらでも値は取れます

foreach my $key(keys(%count)){

print "$key: ".$count{$key}."¥n";

}

while (my ($key, $value) = each(%count)){

print "$key: $value¥n";

}

key value FMS 191 MS 140 ND 120 SFC 300 IAMAS 420 FUN 380

(38)

先端メディアサイエンス学科 中村研究室

[演習] 数えて表示する

• ツイートした人のニックネームを一覧化し

てみる

– http://snakamura.org/tsv/p2_all_nickonly.tsv (プログラミング演習2発表会の全ツイートの ニックネームを抽出したもの)をダウンロード してニックネームごとにその数を数え,出力し てみよう

(39)

先端メディアサイエンス学科 中村研究室

答え

my %nick_count;

open( FILE, "p2_all_nickonly.tsv" ); while( my $line = <FILE> ){

chomp( $line );

$nick_count{ $line }++; }

close( FILE );

foreach my $key( keys( %nick_count ) ){ print "$key: ".$nick_count{$key}."¥n"; }

(40)

先端メディアサイエンス学科 中村研究室

ニックネーム順に並べたい

• ソートする

– Perlではsortと書くだけで簡単にソートできる my %nick_count;

open( FILE, "p2_all_nickonly.tsv" ); while( my $line = <FILE> ){

chomp( $line );

$nick_count{ $line }++; }

close( FILE );

foreach my $key( sort keys( %nick_count ) ){ print "$key: ".$nick_count{$key}."¥n";

(41)

先端メディアサイエンス学科 中村研究室

多い順に並べたい

• ソートする

– 下記のプログラムを書くとソートすることが出 来る – 意味としては,$nick_count{$a}という何かと ,$nick_count{$b}という何かを比較して並び 替える

こんなのは覚える必要ない,必要に応じて検

索!

for my $key ( sort {$nick_count{$b} <=> $nick_count{$a} || $a cmp $b} keys %nick_count) { print $key . "=" . $nick_count{$key} . "¥n"; }

(42)

先端メディアサイエンス学科 中村研究室

トップ10を表示

my %nick_count;

open( FILE, "p2_all_nickonly.tsv" ); while( my $line = <FILE> ){

chomp( $line );

$nick_count{ $line }++; }

close( FILE ); my $num = 1;

for my $key (sort {$nick_count{$b}<=>$nick_count{$a} || $a cmp $b} keys %nick_count) { print $num . ": " . $key . "=" . $nick_count{$key} . "¥n";

$num++;

if( $num > 10 ){ last;

} }

(43)

先端メディアサイエンス学科 中村研究室

[演習]

• 先述のファイル(p2_all_nickonly.tsv1)に

ついて,書き込みが多い順に10件の結果を

表示せよ

• 同様の処理を下記ファイルについても実行

してみよ

– http://snakamura.org/tsv/p1_all_nickonly.tsv

(44)

先端メディアサイエンス学科 中村研究室

内容を抽出しよう

• 抽出前のデータはタブ区切りで日時,ニッ

クネーム,書き込みが並んでいる

• ここから書き込み時分だけ,ニックネーム

や書き込みの内容だけを抽出するには?

(45)

先端メディアサイエンス学科 中村研究室

その前に

• 書き込み時間だけを抽出したものについて

,書き込み時分のみを取り出してカウント

したい

(46)

先端メディアサイエンス学科 中村研究室 46 0 5 10 15 20 25 30 35 14:39 14:45 14:50 14:55 15:00 15:05 15:10 15:15 15:20 15:25 15:30 15:35 15:40 15:45 15:58 16:03 16:08 16:13 16:18 16:23 16:28 16:33 16:38 16:43 16:48 17:06 17:11 17:16 17:21 17:26 17:31 17:36 17:41 17:46 17:51 17:56 18:01 マイクは? 宇宙へ 来週テストは ありません 食堂に通い詰 めました 急な茶番 ミクロック 博士と助手 ソシャゲ

こんなグラフを作りたい!

(47)

先端メディアサイエンス学科 中村研究室

正規表現(抽出)

• 基本的には下記のフォーマットにのっとる

• 正規表現でまず覚えておくこと

– 普通に書いた文字はそのまま適用される – () で囲まれた部分を抽出する – [] で囲まれた部分に含まれる文字列とマッチ • [1234] だと1234のいずれかの文字にマッチする語 – [] の中で ^ を書くとそれ以外という意味

変数 =~ /正規表現パターン/;

(48)

先端メディアサイエンス学科 中村研究室

[演習]

• MS,FMS,NDとマッチする語が何回登場

するかをそれぞれカウントしてみよ?

• http://snakamura.org/files/ims.csv – ヒント • if( $line = /MS/ ){ ... } でMSというキーワードとマッチ ング • if( $line = /FMS/ ){ ... } でMSというキーワードとマッ チング • if( $line = /ND/ ){ ... } でMSというキーワードとマッチ ング

(49)

先端メディアサイエンス学科 中村研究室

MS, FMS, NDを数える

open( FILE, "ims.csv" ); my $ms = 0; my $fms = 0; my $nd = 0; while( my $line = <FILE> ){ chomp($line); if( $line =~ /MS/ ){ $ms ++; } elsif( $line =~ /FMS/ ){ $fms ++; } elsif( $line =~ /ND/ ){ $nd ++;     } } close( FILE ); print "MS  = " . $ms . "¥n"; print "FMS = " . $fms . "¥n"; print "ND  = " . $nd . "¥n"; 結果がおかしいのは何故?

(50)

先端メディアサイエンス学科 中村研究室

[演習]

• 時間と分だけを抜き出して出力するには?

– p2_all_timeonly.tsv をチェックすると以下の様 なフォーマットになっている 2014‐01‐20 14:39:59 2014‐01‐20 14:41:01 2014‐01‐20 14:41:23 2014‐01‐20 14:42:19 2014‐01‐20 14:42:28 2014‐01‐20 14:43:09 2014‐01‐20 14:43:19 2014‐01‐20 14:43:47 2014‐01‐20 14:44:47 2014‐01‐20 14:45:01 14:39 14:41 14:41 14:42 14:42 14:43 14:43 14:43 14:44 14:45

(51)

先端メディアサイエンス学科 中村研究室

見ていくと...

1. 「数字4つ」 2. 「マイナス」 3. 「数字2つ」 4. 「マイナス」 5. 「数字2つ」 6. 「スペース」 7. 「数字2つ」 8. 「コロン」 9. 「数字2つ」 10.「コロン」 11.「数字2つ」 2014‐01‐20 14:39:59 2014‐01‐20 14:41:01 2014‐01‐20 14:41:23 2014‐01‐20 14:42:19 2014‐01‐20 14:42:28 2014‐01‐20 14:43:09 2014‐01‐20 14:43:19 2014‐01‐20 14:43:47 2014‐01‐20 14:44:47 2014‐01‐20 14:45:01

(52)

先端メディアサイエンス学科 中村研究室

正規表現を書いてみる

• 「数字2つ」「コロン」「数字2つ」の部分

を抽出したらよい

• [] の中を何回繰り返すか?は続けて

– {数字} で数次回繰り返す – + で1回以上繰り返す – * で0回以上繰り返す となるので... $line =~ /([0123456789][0123456789]:[0123456789][0123456789])/;

$line =~ /([0123456789]{2}:[0123456789]{2})/;

(53)

先端メディアサイエンス学科 中村研究室

マッチした情報をどう出力?

• ()でマッチした結果はそのカッコの順番

に応じて $1, $2, $3, $4, ... と取得できる

• というパターンの場合,1つ目の()のもの

がそれに該当するので,

• というコードで結果を表示できる.¥nは改

$line =~ /([0123456789]{2}:[0123456789]{2})/;

print   STDOUT  $1 . "¥n";

(54)

先端メディアサイエンス学科 中村研究室

(55)

先端メディアサイエンス学科 中村研究室

ちなみに

• 「0∼9までの数字2つ:0∼9までの数字2つ

」というパターンだと,時分だけじゃなく

て分秒もひっかかってしまいそうだが...

• 正規表現は最初にマッチしたところを優先

するため,今回は問題なし

– きっちりやるなら,最初にスペースを入れると か,最後にコロンを入れるとかしたらよい

$line =~ / 

([0123456789]{2}:[0123456789]{2})

:/;

(56)

先端メディアサイエンス学科 中村研究室

0123456789と打つのは面倒

• 省略できます!

– 「0-9」と書くと,0から9までの全ての数字と いう意味 – 同様に[a-z]はaからzまでの小文字の英字,[A-Z] はAからZまでの大文字の英字となる – [0-9a-zA-z]とかくと,英数字とマッチする – 「¥d」で数字とマッチングすることが可能

$line =~ / 

([0‐9]{2}:[0‐9]{2})

:/;

$line =~ / 

(¥d+:¥d+)

:/;

(57)

先端メディアサイエンス学科 中村研究室

時間と分を分割して取りたい

• カッコで分割して数字だけそれぞれ取得

• その後,$1と$2で結果を表示する

$line =~ / 

([0‐9]{2})

:

([0‐9]{2})

:/;

print  STDOUT  $1 . "時" . $2 . "分¥n";

(58)

先端メディアサイエンス学科 中村研究室

[演習]

• 上記ファイルについて,「2014-01-20

14:39:59」 を「2014年01月20日 14時39

分59秒」と表示するようにプログラムを作

成せよ

(59)

先端メディアサイエンス学科 中村研究室

[演習]

• 下記のファイルから英字のみの行を抽出し

て表示せよ

– http://snakamura.org/tsv/mix100.csv

• 下記のファイル(上記と一緒)から数字の

みの行を抽出して表示せよ

– http://snakamura.org/tsv/mix100.csv

(60)

先端メディアサイエンス学科 中村研究室

[演習]

• 連想配列などを使い,下記のファイルから

,時分毎のツイート件数を求めるプログラ

ムを作成せよ

– http://snakamura.org/tsv/p2_all_timeonly.tsv

• また,上記のファイルについて,時分ごと

のツイート件数が多い順に20件出力せよ

(61)

先端メディアサイエンス学科 中村研究室

[演習]

• 正規表現にチャレンジ

– 郵便番号を抽出するにはどうするか? – 電話番号を抽出するにはどうするか? – 携帯電話かどうかを判定するにはどうするか? – メールアドレスを判定するにはどうするか? • これはかなり難易度が高い – URLかどうかを判定するにはどうするか? • 「://」があるかどうかで判定

(62)

先端メディアサイエンス学科 中村研究室

正規表現の注意点

• 幾つかのそのままでは表現できない文字が存在する.その 場合は「¥」エスケープシーケンスを利用する – ¥n 改行 – ¥t 水平タブ – ¥¥ 文字としての「¥」 – ¥$ 文字としての「$」 – ¥/ 文字としての「/」 – ¥? 文字としての「?」 – ¥+ 文字としての「+」 – ¥* 文字としての「*」 – ¥- []内にマイナスを書く時は... – ¥' シングルクォーテーション(') – ¥" ダブルクォーテーション(") – ¥. 文字としての「.」(単に「.」を使うと任意の文字) – などなど

(63)

先端メディアサイエンス学科 中村研究室

正規表現の用法

• 「.」は任意の文字にマッチ • 「a?」はaまたは空文字列にマッチ • 「a*」はaの0回以上の繰り返しにマッチ • 「a+」はaの一回以上の繰り返しにマッチ • 「a{m,n}」はm回以上n回以下の繰り返しにマッチ • 「a{n,}」はn回以上の繰り返しにマッチ • 「a{n}」はn回の繰り返しにマッチ. 色々あるが基本的なことだけ記憶して, 後は検索したらOK!

(64)

先端メディアサイエンス学科 中村研究室

(65)

先端メディアサイエンス学科 中村研究室

[演習]

• timeonly や nickonly ではない下記のファ

イルをダウンロードし,ニックネーム毎の

投稿数ランキング,時分毎の投稿数ランキ

ングを作成せよ

– http://snakamura.org/tsv/p2_all.tsv – http://snakamura.org/tsv/p1_all.tsv – ただし,タブは「¥t」となる

• 上記ファイルについて「宮下」「菊池」「

小松」という語が何回出てくるかカウント

してみよう

(66)

先端メディアサイエンス学科 中村研究室

CPANで色々インストール

• CPANとは色々なライブラリ(モジュール)

(67)

先端メディアサイエンス学科 中村研究室

Webから直接情報をとる

• LWP::UserAgent というモジュールをインス

トールする

• CPANを起動後, install LWP::UserAgent と

入力する

# ウェブページの情報を取得するときに使う use LWP::UserAgent; # UserAgent(ウェブアクセスするもの)を用意する my $ua = LWP::UserAgent‐>new; # ウェブページから情報を取得する my $response = $ua‐>get('http://snakamura.org/teach/fms/'); # 取得した内容を表示する print $response‐>content;

(68)

先端メディアサイエンス学科 中村研究室

(69)

先端メディアサイエンス学科 中村研究室

SJISに変換してあげる

• 元々のコンテンツをチェックするとUTF-8と

書いてある(HTMLをチェック).つまり

UTF-8からSJISに変換してあげる必要がある

• 文字コードの変換には Encode を使う

– decode で内部形式に,encode で目的のに変換 UTF‐8 内部形式 Shift  JIS

(70)

先端メディアサイエンス学科 中村研究室 # ウェブページの情報を取得するときに使う use LWP::UserAgent; # 文字コードを変換するときに使う use Encode; # UserAgent(ウェブアクセスするもの)を用意する my $ua = LWP::UserAgent‐>new; # ウェブページから情報を取得する my $response = $ua‐>get('http://snakamura.org/teach/fms/'); my $str = $response‐>content; # 一度UTF‐8から内部形式に変換して~ $str = decode( "UTF‐8", $str ); # SJISに変換する $str = encode( "ShiftJIS", $str ); # SJISに変換したものを表示する print $str;

(71)

先端メディアサイエンス学科 中村研究室

[演習]

• 上記のウェブページからURLだけを抽出す

るにはどうするか?

• http://wiki.fms-meiji.jp/ の演習発表会のペ

ージから発表者のリストを取得するには?

• 出力した結果をファイルに格納するには?

(72)

先端メディアサイエンス学科 中村研究室

文字列を分析しよう

• ツイートでどんなことが書かれていたか気

になるが分析するのは大変である

• 自然言語処理をしてみよう!

• Mecabをインストールしよう!

– http://mecab.sourceforge.jp

(73)

先端メディアサイエンス学科 中村研究室

文字列を分析しよう

• MecabはC:¥Tools¥Mecabなどにインストー

ルしよう(Program Filesでもよいけどね)

• 文字コードはSJISにしておきましょう

• コマンドプロンプトを開き,cdで

Mecab¥bin というフォルダまで辿り着き,

mecab.exe を実行!

• 実行した後,日本語入力にして「今日はい

い天気ですね」などのように入力してみよ

う!

(74)

先端メディアサイエンス学科 中村研究室

Mecabの結果をどう取るか?

# 外部アプリの入出力を取るためのモジュール use IPC::Open2; # open2でmecabを起動(各自のパスに変更) # OUTはmecabからの出力,INはmecabへの入力 open2( OUT, IN, "C:/Tools/Mecab/bin/mecab.exe" ); # mecabにINで出力.最後に改行を忘れず! print IN "今日はいい天気ですね¥n"; # OUTから出力結果を取得して表示する while( my $line = <OUT> ){ print STDOUT $line; } # 最後にINとOUTを閉じておく close( IN ); close( OUT );

(75)

先端メディアサイエンス学科 中村研究室

[演習]

• Mecabに入力する文字列を色々と変更し,

出力される結果の語だけを表示してみよう

• どういう正規表現を書けば,語の部分だけ

を取り出すことが可能だろうか?

– 正規表現の文頭は「^」文末は「$」で表現する – ∼でないは[]の中に「^」を書く • [^¥t] タブ以外の文字であれば∼ – 1回以上繰り返すは「+」を使う

(76)

先端メディアサイエンス学科 中村研究室

さて

• Twitterの書き込みをMecabで分析し,なん

という語がよく登場しているかを出力!

• 手順

– 各ユーザのツイートを順に取得する – ツイートをMecabに入力 – Mecabさんからの出力を取得する – 取得した結果を分析する – 連想配列でカウントする – ソートして表示する 挑戦してみましょう.これを最後の課題とします.

(77)

先端メディアサイエンス学科 中村研究室

[演習]

• 適当なウェブページからテキスト情報を抽

出し,ファイルに保存せよ

• 適当なウェブページからテキスト情報を抽

出し,そのページにあらわれる語の頻度を

求め,ファイルに保存せよ

(78)

先端メディアサイエンス学科 中村研究室

Perlは色々省略できる言語

%nick_count;

open( FILE, "p2_all_nickonly.tsv" ); while( <FILE> ){ chomp; $nick_count{ $_ }++; } close( FILE ); %time_count;

open( FILE, "p2_all.tsv" ); while( <FILE> ){ /([¥d]+:[¥d]+)/; $time_count{$1}++; } close( FILE ); my は省略してもよい $_ は <> からの入力 =~ など色々省略可能

(79)

先端メディアサイエンス学科 中村研究室

[課題]

• Tweetの書き込み頻度の高い名詞トップ20

を作成し,その頻度ともに示せ

– その際,明らかに名詞で無さそうなものは省け

• Tweetの書き込み分析結果で,名詞が連続す

るものは1つの名詞として扱い頻度を求めよ

– 「総合数理学部」が「総合」「数」「理学部」 となってしまう問題を解決する

• Tweetの書き込み頻度の高い形容詞トップ

20を作成し,その頻度ともに示せ

(80)

先端メディアサイエンス学科 中村研究室

[課題]

• 適当なスポーツニュースサイトを選定し,

そこからニュースタイトルを列挙せよ

– 列挙結果をファイルに保存せよ

• 適当なウェブページから画像のリンクを取

得し(画像リンクはIMGタグ),その画像

URLリストを作成せよ

– 可能なら画像をダウンロードしてみよ – LWP::UserAgent を使えば下記でできるよ! open(OUT, ">ファイル名"); binmode OUT;

print OUT $response->content; close(OUT);

参照

関連したドキュメント

ERROR  -00002 認証失敗または 圏外   クラウドへの接続設定及びア ンテ ナ 接続を確認して ください。. ERROR  -00044 回線未登録または

「海洋の管理」を主たる目的として、海洋に関する人間の活動を律する原則へ転換したと

①配慮義務の内容として︑どの程度の措置をとる必要があるかについては︑粘り強い議論が行なわれた︒メンガー

討することに意義があると思われる︒ 具体的措置を考えておく必要があると思う︒

○安井会長 ありがとうございました。.

学側からより、たくさんの情報 提供してほしいなあと感じて います。講議 まま に関して、うるさ すぎる学生、講議 まま

・ 研究室における指導をカリキュラムの核とする。特別実験及び演習 12