Presentation is loading. Please wait.

Presentation is loading. Please wait.

コーパス言語学実践 2006 年度 2 学期 第 9 回. 2 本日の内容 これまでと同様の作業 – プログラムで処理するケースの紹介.

Similar presentations


Presentation on theme: "コーパス言語学実践 2006 年度 2 学期 第 9 回. 2 本日の内容 これまでと同様の作業 – プログラムで処理するケースの紹介."— Presentation transcript:

1 コーパス言語学実践 2006 年度 2 学期 第 9 回

2 2 本日の内容 これまでと同様の作業 – プログラムで処理するケースの紹介

3 3 perl のプログラム( 1 ) 述べ語数で各品詞の語数を計算する wc_nobe.pl perl wc_nobe.pl < gingatetsudono_yoru08.txt

4 4 perl のプログラム( 2 ) 異なり語数で各品詞の語数を計算する wc_kotonari.pl perl wc_kotonari.pl < gingatetsudono_yoru08.txt

5 5 プログラムを理解するヒント ( 1 ) split 関数 連想配列 foreach という構文

6 6 split 関数補足( 1 ) split 関数と配列の関係 split 関数は第1引数で指定した区切り子 (文字列)で,第2引数で指定した文字 列の中身を区切り,その結果を配列に代 入する @a = split(/ ☆ /, $line);

7 7 split 関数の補足( 2 ) 例: @a = split(/ ☆ /, $line); $line=” サラダ☆ 380 ☆ レタス, ツナ, ブロッコリー, ドレッシング, たまねぎ ☆ 260”; だとすると

8 8 split 関数の補足( 3 ) 例: @a = split(/ ☆ /, ” サラダ☆ 380 ☆ レタス, ツナ, ブロッコリー, ドレッシング, たまねぎ ☆ 260”); こんな感じで, 区切り子は「☆」ということになります.

9 9 split 関数の補足( 4 ) split 関数では サラダ☆ 380 ☆レタス, ツナ, ブロッコリー, ドレッ シング, たまねぎ☆ 260 split 関数では,指定された文字列の中に 区切り文字があるかどうか先頭から探します. @a = split(/ ☆ /, $line);

10 10 split 関数の補足( 5 ) split 関数では サラダ☆ 380 ☆レタス, ツナ, ブロッコリー, ドレッ シング, たまねぎ☆ 260 ありました! @a = split(/ ☆ /, $line);

11 11 split 関数の補足( 6 ) split 関数では サラダ☆ 380 ☆レタス, ツナ, ブロッコリー, ドレッ シング, たまねぎ☆ 260 ここまでの値を 配列に入れます @a = split(/ ☆ /, $line); サラダ 0 @a

12 12 split 関数の補足( 7 ) split 関数では サラダ☆ 380 ☆レタス, ツナ, ブロッコリー, ドレッ シング, たまねぎ☆ 260 探索を続けます @a = split(/ ☆ /, $line); サラダ 0 @a

13 13 split 関数の補足( 8 ) split 関数では サラダ☆ 380 ☆レタス, ツナ, ブロッコリー, ドレッ シング, たまねぎ☆ 260 見つかりました! @a = split(/ ☆ /, $line); サラダ 0 @a

14 14 split 関数の補足( 9 ) split 関数では サラダ☆ 380 ☆レタス, ツナ, ブロッコリー, ドレッ シング, たまねぎ☆ 260 ここまでを 代入します @a = split(/ ☆ /, $line); サラダ 0 @a 380 1

15 15 split 関数の補足( 10 ) split 関数では サラダ☆ 380 ☆レタス, ツナ, ブロッコリー, ドレッ シング, たまねぎ☆ 260 続けます. @a = split(/ ☆ /, $line); サラダ 0 @a 380 1

16 16 split 関数の補足( 11 ) split 関数では サラダ☆ 380 ☆レタス, ツナ, ブロッコリー, ドレッ シング, たまねぎ☆ 260 見つかりました. @a = split(/ ☆ /, $line); サラダ 0 @a 380 1

17 17 split 関数の補足( 12 ) split 関数では サラダ☆ 380 ☆レタス, ツナ, ブロッコリー, ドレッ シング, たまねぎ☆ 260 ここまでを 代入します. @a = split(/ ☆ /, $line); サラダ 0 @a 380 1 レタス, ツナ, ブロッコ リー, ドレッシング, たまねぎ 2

18 18 split 関数の補足( 13 ) split 関数では サラダ☆ 380 ☆レタス, ツナ, ブロッコリー, ドレッ シング, たまねぎ☆ 260 続けます. @a = split(/ ☆ /, $line); サラダ 0 @a 380 1 レタス, ツナ, ブロッコ リー, ドレッシング, たまねぎ 2

19 19 split 関数の補足( 14 ) split 関数では サラダ☆ 380 ☆レタス, ツナ, ブロッコリー, ドレッ シング, たまねぎ☆ 260 文字列の最後まで きました. @a = split(/ ☆ /, $line); サラダ 0 @a 380 1 レタス, ツナ, ブロッコ リー, ドレッシング, たまねぎ 2

20 20 split 関数の補足( 15 ) split 関数では サラダ☆ 380 ☆レタス, ツナ, ブロッコリー, ドレッ シング, たまねぎ☆ 260 ここまでを 代入します. @a = split(/ ☆ /, $line); サラダ 0 @a 380 1 レタス, ツナ, ブロッコ リー, ドレッシング, たまねぎ 2 260 3

21 21 split 関数の補足( 16 ) split 関数では サラダ☆ 380 ☆レタス, ツナ, ブロッコリー, ドレッ シング, たまねぎ☆ 260 これで split 関数の 作業が完了です @a = split(/ ☆ /, $line); サラダ 0 @a 380 1 レタス, ツナ, ブロッコ リー, ドレッシング, たまねぎ 2 260 3

22 22 split 関数の補足( 17 ) while(<>) { chomp; @a = split(/\t/, $_); print(“$a[0] - $a[1] - $a[2] - $a[3]\n”); } exit; splittest.pl として保存 perl splittest.pl < gingatetsudono_yoru08.txt

23 23 連想配列(1) perl には,連想配列と呼ばれる配列がある. 特徴:添え字に文字列が使える – 連想配列には%に続けて名前をつける. 例:% array という連想配列 要素 ( 中 身) 添え字 (インデック ス) $array{“ 松 ”}=2000; $array{“ 竹 ”}=1500; $array{“ 梅 ”}=1000; 上松松竹梅 3000200015001000 $array{“ 上松 ”}=3000;

24 24 連想配列( 2 ) 連想配列の使い方(参照) – 各要素を個別に参照 print “ 上松の中身は ”. $a{“ 上松 ”}. “\n”; print “ 松の中身は ”. $a{“ 松 ”}. “\n”; print “ 竹の中身は ”. $a{“ 竹 ”}. “\n”; print “ 梅の中身は ”. $a{“ 梅 ”}. “\n”; 3000 2000 1500 1000 %a 上松 松 竹 梅 添え字 中身

25 25 連想配列( 3 ) 練習 renso01.pl をダウンロードして実行 y:\corpus> perl renso01.pl 連想配列 a に値を代入. 値の出力がされているはず. を確かめる.

26 26 連想配列( 4 ) wc_nobe.pl の中の, @a = split(/\t/, $_); $count{$a[3]}++; ← ここが連想配列 –split 関数で タブで区切った,すると $a[?] に値が入 る –$a[3] には,品詞が入っている. – 品詞を 添え字 にして $count{ 品詞 } という連想配 列 「++」は 1 つ数字を足すという意味

27 27 foreach という構文( 1 ) 繰り返し構文として foreach というのが ある –wc_nobe.pl では foreach $key (sort keys %count) { printf ("%s\t%d\n", $key, $count{$key}); } 連想配列 %count の添え字を $key に入れ る 添え字はソートして順番に取り出す

28 28 foreach という構文( 2 ) –wc_kotonari.pl では foreach $key (keys %count0) { @b = split(/ /, $key); $count{$b[0]}++; } というのもある.ソートしないで取り出す.

29 29 foreach という構文( 3 ) while($_=<>) { chomp($_); @a = split(/\t/, $_); $soeji=$a[3]. " ". $a[0]. " ". $a[1]. " ". $a[2]; $count0{$soeji}++; } foreach $key (keys %count0) { @b = split(/ /, $key); $count{$b[0]}++; } foreach $key (sort keys %count) { printf ("%s\t%d\n", $key, $count{$key}); } exit;


Download ppt "コーパス言語学実践 2006 年度 2 学期 第 9 回. 2 本日の内容 これまでと同様の作業 – プログラムで処理するケースの紹介."

Similar presentations


Ads by Google