コーパス言語学実践 2006 年度 2 学期 第 9 回
2 本日の内容 これまでと同様の作業 – プログラムで処理するケースの紹介
3 perl のプログラム( 1 ) 述べ語数で各品詞の語数を計算する wc_nobe.pl perl wc_nobe.pl < gingatetsudono_yoru08.txt
4 perl のプログラム( 2 ) 異なり語数で各品詞の語数を計算する wc_kotonari.pl perl wc_kotonari.pl < gingatetsudono_yoru08.txt
5 プログラムを理解するヒント ( 1 ) split 関数 連想配列 foreach という構文
6 split 関数補足( 1 ) split 関数と配列の関係 split 関数は第1引数で指定した区切り子 (文字列)で,第2引数で指定した文字 列の中身を区切り,その結果を配列に代 = split(/ ☆ /, $line);
7 split 関数の補足( 2 ) = split(/ ☆ /, $line); $line=” サラダ☆ 380 ☆ レタス, ツナ, ブロッコリー, ドレッシング, たまねぎ ☆ 260”; だとすると
8 split 関数の補足( 3 ) = split(/ ☆ /, ” サラダ☆ 380 ☆ レタス, ツナ, ブロッコリー, ドレッシング, たまねぎ ☆ 260”); こんな感じで, 区切り子は「☆」ということになります.
9 split 関数の補足( 4 ) split 関数では サラダ☆ 380 ☆レタス, ツナ, ブロッコリー, ドレッ シング, たまねぎ☆ 260 split 関数では,指定された文字列の中に = split(/ ☆ /, $line);
10 split 関数の補足( 5 ) split 関数では サラダ☆ 380 ☆レタス, ツナ, ブロッコリー, ドレッ シング, たまねぎ☆ 260 = split(/ ☆ /, $line);
11 split 関数の補足( 6 ) split 関数では サラダ☆ 380 ☆レタス, ツナ, ブロッコリー, ドレッ シング, たまねぎ☆ 260 ここまでの値を = split(/ ☆ /, $line); サラダ
12 split 関数の補足( 7 ) split 関数では サラダ☆ 380 ☆レタス, ツナ, ブロッコリー, ドレッ シング, たまねぎ☆ 260 = split(/ ☆ /, $line); サラダ
13 split 関数の補足( 8 ) split 関数では サラダ☆ 380 ☆レタス, ツナ, ブロッコリー, ドレッ シング, たまねぎ☆ 260 = split(/ ☆ /, $line); サラダ
14 split 関数の補足( 9 ) split 関数では サラダ☆ 380 ☆レタス, ツナ, ブロッコリー, ドレッ シング, たまねぎ☆ 260 ここまでを = split(/ ☆ /, $line); サラダ 380 1
15 split 関数の補足( 10 ) split 関数では サラダ☆ 380 ☆レタス, ツナ, ブロッコリー, ドレッ シング, たまねぎ☆ 260 = split(/ ☆ /, $line); サラダ 380 1
16 split 関数の補足( 11 ) split 関数では サラダ☆ 380 ☆レタス, ツナ, ブロッコリー, ドレッ シング, たまねぎ☆ 260 = split(/ ☆ /, $line); サラダ 380 1
17 split 関数の補足( 12 ) split 関数では サラダ☆ 380 ☆レタス, ツナ, ブロッコリー, ドレッ シング, たまねぎ☆ 260 ここまでを = split(/ ☆ /, $line); サラダ レタス, ツナ, ブロッコ リー, ドレッシング, たまねぎ 2
18 split 関数の補足( 13 ) split 関数では サラダ☆ 380 ☆レタス, ツナ, ブロッコリー, ドレッ シング, たまねぎ☆ 260 = split(/ ☆ /, $line); サラダ レタス, ツナ, ブロッコ リー, ドレッシング, たまねぎ 2
19 split 関数の補足( 14 ) split 関数では サラダ☆ 380 ☆レタス, ツナ, ブロッコリー, ドレッ シング, たまねぎ☆ 260 文字列の最後まで = split(/ ☆ /, $line); サラダ レタス, ツナ, ブロッコ リー, ドレッシング, たまねぎ 2
20 split 関数の補足( 15 ) split 関数では サラダ☆ 380 ☆レタス, ツナ, ブロッコリー, ドレッ シング, たまねぎ☆ 260 ここまでを = split(/ ☆ /, $line); サラダ レタス, ツナ, ブロッコ リー, ドレッシング, たまねぎ
21 split 関数の補足( 16 ) split 関数では サラダ☆ 380 ☆レタス, ツナ, ブロッコリー, ドレッ シング, たまねぎ☆ 260 これで split 関数の = split(/ ☆ /, $line); サラダ レタス, ツナ, ブロッコ リー, ドレッシング, たまねぎ
22 split 関数の補足( 17 ) while(<>) { = split(/\t/, $_); print(“$a[0] - $a[1] - $a[2] - $a[3]\n”); } exit; splittest.pl として保存 perl splittest.pl < gingatetsudono_yoru08.txt
23 連想配列(1) perl には,連想配列と呼ばれる配列がある. 特徴:添え字に文字列が使える – 連想配列には%に続けて名前をつける. 例:% array という連想配列 要素 ( 中 身) 添え字 (インデック ス) $array{“ 松 ”}=2000; $array{“ 竹 ”}=1500; $array{“ 梅 ”}=1000; 上松松竹梅 $array{“ 上松 ”}=3000;
24 連想配列( 2 ) 連想配列の使い方(参照) – 各要素を個別に参照 print “ 上松の中身は ”. $a{“ 上松 ”}. “\n”; print “ 松の中身は ”. $a{“ 松 ”}. “\n”; print “ 竹の中身は ”. $a{“ 竹 ”}. “\n”; print “ 梅の中身は ”. $a{“ 梅 ”}. “\n”; %a 上松 松 竹 梅 添え字 中身
25 連想配列( 3 ) 練習 renso01.pl をダウンロードして実行 y:\corpus> perl renso01.pl 連想配列 a に値を代入. 値の出力がされているはず. を確かめる.
26 連想配列( 4 ) wc_nobe.pl = split(/\t/, $_); $count{$a[3]}++; ← ここが連想配列 –split 関数で タブで区切った,すると $a[?] に値が入 る –$a[3] には,品詞が入っている. – 品詞を 添え字 にして $count{ 品詞 } という連想配 列 「++」は 1 つ数字を足すという意味
27 foreach という構文( 1 ) 繰り返し構文として foreach というのが ある –wc_nobe.pl では foreach $key (sort keys %count) { printf ("%s\t%d\n", $key, $count{$key}); } 連想配列 %count の添え字を $key に入れ る 添え字はソートして順番に取り出す
28 foreach という構文( 2 ) –wc_kotonari.pl では foreach $key (keys %count0) = split(/ /, $key); $count{$b[0]}++; } というのもある.ソートしないで取り出す.
29 foreach という構文( 3 ) while($_=<>) { = split(/\t/, $_); $soeji=$a[3]. " ". $a[0]. " ". $a[1]. " ". $a[2]; $count0{$soeji}++; } foreach $key (keys %count0) = split(/ /, $key); $count{$b[0]}++; } foreach $key (sort keys %count) { printf ("%s\t%d\n", $key, $count{$key}); } exit;