コマンドライン引数 標準入力

知識情報演習Ⅲ(後半第5回)
辻 慶太
http://slis.sakura.ne.jp/cje3
1
本資料の内容
•
•
•
•
オンライン検索プログラム
レポート課題
成績評価
授業評価
2
索引付けの手順概要(復習)
(1) 索引語の抽出
extract.prl
文字バイグラム,単語,フレーズなど
(2) 不要語の削除 stopword.prl
(3) 接辞処理 stemming.prl
(4) 索引語の重み付け tf.prl
idf.prl
検索手法(検索モデル)によっては不要
例えば,論理式によるブーリアンモデルでは不要
(5) 索引ファイルの編成
3
索引付けのプログラム(復習)
文書群ファイル
documents.txt
入力
extract.prl
stopword.prl
stemming.prl
tf.prl
索引ファイル
index.txt
出力
idf.prl
出力
入力
出力
入力
出力
入力
出力
入力
4
オンライン処理の図解(復習)
犬 ロボット
検索
①索引語の抽出
犬
文書集合
D1~D10
索引付け
(オフライン)
→ D2(0.1) D3(0.8) D5(1.2) D9(0.1)
ロボット → D1(1.2) D3(0.7) D5(0.1)
②文書と重みの探索
③スコアの計算
D1 = 1.2
D2 = 0.1
D3 = 0.8 + 0.7 = 1.5
D5 = 1.2 + 0.1 = 1.3
D9 = 0.1
1. D3
2. D5
3. D1
④文書の整列 4. D2
5. D9
索引
転置ファイル
個別の文書を
読む場合
5
オンライン検索の作成方針
• 索引付けと同様に以下の前処理が必要
(1) 索引語の抽出
(2) 不要語の削除
(3) 接辞処理
索引付けのプログラム
をそのまま使う
• その後で文書ごとにスコアを計算し,スコアの
降順に整列して出力する 今回作成するプログラム
retrieval.prl
6
検索質問ファイルの形式
• 文書群ファイル(documents.txt)と形式を揃えること
で,索引付けのプログラムを流用できるようにする
• ただし,1つのファイルには検索質問を1件だけ入
力する(その方が処理が簡単になる)
• 演習のページにある query.txt を使うとよい
<QUERY>
<NUM>Q001</NUM>
<TEXT>
a web searching system
</TEXT>
</QUERY>
<QUERY> 1つの検索質問
<NUM> 検索質問番号
<TEXT> 検索質問の本文
索引付けのプログラムで,<NUM>
中の番号が D で始まることを前提
にしている場合は注意
7
連結方法1: 中間ファイルを作る
入力
検索質問
ファイル
query.txt
中間ファイル
出力
extract.prl
chuukan1
stopword.prl
chuukan2
stemming.prl
chuukan3
入力
索引ファイル
標準入力
retrieval.prl
index.txt コマンドライン引数
(STDIN)
標準入力と衝突させないため
画面へ出力
% perl extract.prl query.txt > chuukan1
% perl stopword.prl chuukan1 > chuukan2
% perl stemming.prl chuukan2 > chuukan3
% perl retrieval.prl index.txt < chuukan3
コマンドライン引数
標準入力(STDIN)
8
連結方法2: パイプライン処理を行う
検索質問
ファイル
query.txt
入力
extract.prl
出力
入力
stopword.prl
出力
入力
stemming.prl
索引ファイル
index.txt
入力
出力
入力
retrieval.prl
コマンドライン引数
画面へ出力
標準入力
(STDIN)
% perl extract.prl query.txt | perl stopword.prl |
perl stemming.prl | perl retrieval.prl index.txt
標準入力(STDIN)
コマンドライン引数
9
retrieval.prl の仕様
• stemming.prl の出力と索引ファイル(index)
を入力し,検索された文書をスコアの降順に
整列して出力する
• ヒット件数(検索された文書数)を先頭の行に
出力する
Q001 web
Q001 search
Q001 system
stemming.prl の出力
ヒット件数
hit = 6
D004 5.08
D008 3.39
文書番号とスコア
D003 1.69
…
retrieval.prl の出力
10
エラー処理
• ユーザがプログラムを正しく使った場合に正しく動作
することは当然
• ユーザがプログラムの使い方を誤った場合への対
処が重要 → エラー処理
• 今までに出てきた例
– 開こうとしたファイルが開けなかった
open(IN, $file) || die ”$file: $!”;
ファイルのオープン
または
エラーメッセージを出して終了
ファイルのオープンに失敗したら
エラーメッセージを出して終了
11
retrieval.prl におけるエラー処理
• 索引ファイルを開く前に,ファイルがコマンドラインで
指定されているかどうかを確認する
• 指定されていない場合は,エラーメッセージを出して
強制終了する
コマンドライン引数の数を確認
$0: 実行したプログラムの
名称が代入される
この場合は retrieval.prl
if (@ARGV != 1) {
print STDERR ”Usage: $0 <index file>\n”;
exit;
エラーメッセージを標準エラーに出力する
}
exit
強制終了
(標準出力に出すと見落とす場合がある)
このように表示される → Usage retrieval.prl <index file>
12
レポート課題
• 索引付けとオンライン検索のプログラムを作
成する
– extract.prl, stopword.prl, stemming.prl, tf.prl,
idf.prl, retrieval.prl
• プログラムに行番号を付けて,それぞれの行
について別紙で説明する
– 説明は,プログラム1行につき1文程度でよい
13
プログラムと説明の例(extract.prl)
1 while ($line = <>) {
2
chomp($line);
3
if ($line =~ /<NUM>(.+)<\/NUM>/) {
4
$docid = $1;
5
}
6 ……
プログラムと説明を別のページに印刷する
1
2
3
4
5
ファイルの内容がなくなるまで1行ずつ読み込む
ファイル行の末尾にある改行を削除する
ファイル行に <NUM> と </NUM> があれば
<NUM> と </NUM> の間にある文字列を$docidに代入する
3行目の if 文による条件分岐の終了
14
レポートの提出方法
• 形式
– 表紙: 科目名,受講クラス(火・水),学籍番号,氏名
– 本文: 6つのプログラムとそれらの説明
– 注意:
•
•
•
•
•
両面印刷し,左上をステープラで止める
プログラムと説明が見開きのページになるように
どのプログラムか分かるように
可読性が良くなるように努めること
同一・酷似レポートはどちらも0点とする
• 提出場所
– 学務係のレポートボックス
– 受講クラスごとにボックスがあるので間違えないように
(間違えた場合は採点対象から漏れる場合があります)
• 締切(厳守)
– 3月6日(火) 17:00
15
成績評価
• 後半5回分の配点(50点)
– 出席(30%)
• 3点×5回=15点
ここでの数値は目安であり,
実際の評価では多少変動
することがある
– レポート(70%)
• 「プログラム」と「説明」の組で各5点 5点×6 = 30点
• レポートの体裁や可読性など 5点
• 前半5回分と総合して100点満点で計算し,A~D
を判定する
• 完成したプログラムの数が多いほど評価は高い
• 全てのプログラムが完成しなくても及第点に及ぶ
可能性はあるので,あきらめないように
16
授業評価
• 科目番号
GE11222
• 良いことは良いと書こう
– 授業方針を変更する場合に,良い部分を削って
しまうことがないように
• なるべく理由も書こう
– 否定的なコメントを書く場合
• 理由がある → 意見
• 理由がない → 誹謗中傷
17