前提・実現したいこと
学習用データ(trainディレクトリの記事を形態素解析した train.list )からパラメータ(事前確率 P(c), 条件付き確率 P(e|c))を記録を計算し, それらを記録したmodelファイルからパラメータを読み込み, それを使用してテスト用データ(testディレクトリの記事を形態素解析した test.list)の記事を分類する分類用プログラムを作成したいです。ナイーブベイズの実装です。
発生している問題・エラーメッセージ
ファイルの読み込みは何とか理解できたものの, 分類をするのにどのような表現をしたら良いか分かりません。最終的に対数尤度まで求めるのですがエラーの原因が分からないので教えていただきたいです。
Global symbol "$term" requires explicit package name (did you forget to declare "my $term"?) at bayes_classifier.pl line 74. Global symbol "@e" requires explicit package name (did you forget to declare "my @e"?) at bayes_classifier.pl line 76. Global symbol "$noun" requires explicit package name (did you forget to declare "my $noun"?) at bayes_classifier.pl line 76. Execution of bayes_classifier.pl aborted due to compilation errors.
該当のソースコード
Perl
1#!/usr/bin/perl 2use strict; 3use Encode; 4use utf8; 5 6main(); 7 8sub main 9{ 10 open(my $IN,"test.list"); 11 my %ClassHash; # 各クラスに属する文書の出現数 12 my $N=0; # 文書総数 13 my $H; # 素性総数 14 15 my %TrainData; 16 my %HypoHash; 17 18 while(my $data_utf8 = <$IN>) 19 { 20 my $data = decode_utf8($data_utf8); 21 chomp($data); 22 23 # ファイルのクラスを取得 24 my @e = split(/ /,$data); 25 my $file = $e[0]; 26 my $class = $e[1]; 27 my $word_str = $e[2]; 28 29 # 事前確率用の頻度 30 $ClassHash{$class}++; 31 $N++; 32 33 # fileの形態素解析を行い、名詞を取り出す 34 my %TermFrequency; 35 my @word_list = split(/,/,$word_str); 36 37 foreach my $noun (@word_list) 38 { 39 $TermFrequency{$noun}++; 40 $H++; 41 } 42 43 # 素性の出現頻度 44 foreach my $term (keys %TermFrequency) 45 { 46 my $tf = $TermFrequency{$term}; 47 $HypoHash{$class} += $tf; 48 49 # 各クラスにおける名詞の頻度を格納 50 $TrainData{$class}{$term} += $tf; 51 } 52 undef %TermFrequency; 53 } 54 close($IN); 55 56 my %PH; # 事前確率 P(c) 57 my %PE; # 属性ごとの条件付き確率 P(E_{n}|H) 58 59 # 学習式におけるパラメータを学習 60 foreach my $class (keys %ClassHash) 61 { 62 # 事前確率: P(c) 63 $PH{$class} = $ClassHash{$class}/$N; 64 65 # 各属性値の条件付き確率 P(e_{i}|c) 66 foreach my $term (keys %{$TrainData{$class}}) 67 { 68 my $f_ce = $TrainData{$class}->{$term}; 69 my $f_c = $HypoHash{$class}; 70 71 $PE{$class}->{$term} = $f_ce/$f_c; 72 } 73 my $a; 74 $a=$a+log($term)/log(2); 75 my $cl=$PH{$class}+$a; 76 print encode_utf8("$e[0] → $noun $cl"); 77 } 78}
test.list
2012-04-18_1.txt none パソコン,iPad,ゲーム,複数,操作,ワイヤレス,メルコ,ホールディングス,グループ,中核,バッファ,ロー,名古屋,斉木,邦明,バッファ,ロー,ワイヤレス,5月,上旬,全国,家電,量販,ワイヤレス,PC,型番,出荷,5月,上旬,ワイヤレス,専用,型番,出荷,5月,上旬,メイン,パソコン,マウス,キーボード,パソコン,ゲーム,iPad,操作,ワイヤレス,コネクター,追加,複数,操作,インストール,不要,使い,安心,イメージ,ページ,ページ,buffalo,products,catalog,supply,peripheral,一覧,ページ,buffalo,products,catalog,supply,peripheral,掲載,仕様,機種,改定,仕様,変更,機種,追加,最新,ページ,確認,掲載,希望,小売,消費,ユーザー,バッファロー,マガジン,ハロー,バッファロー,ハローバッファロー,86886,URL,buffalo,ユーザー,参加,ZQwoonet,SAK,zqwoo,sak,公衆,無線,LAN,FREESPOT,freespot, ・・・ 2012-04-27_0.txt none 日立,最大手,IT,大学,クラ,ウド,戦略,パートナーシップ,契約,締結,日立製作所,千代田,執行,中西,宏明,日立,社会,最大手,IT,たび,大学,基幹,クラウドコンピューティング,形態,戦略,パートナーシップ,契約,締結,両社,共同,日立,大学,現地,大学,コーポレーション,設立,大学,本部,SaaS,形態,試験,年度,現地,大学,本格,日立,多く,実績,事務,大学,経営,包括,支援,ソリューション,提携,日立,支援,営業,活動,両社,構築,ノウハウ,もと,年度,以降,大学,展開,検討,近年,適合,人材,目的,教育,大学,大幅,増加,増加,傾向,増加,新規,大学,設立,大学,規模,拡大,事務,整備,課題,現状,大学,限定,大学,事務,全体,包括,支援,整備,大学,背景,需要,期待,日立,多く,大学,IT,総合,大学,for,大学,SaaS,形態,for,中核,大学,全体,経理,大学,経営,基盤,日立製作所,公共,最大手,IT,SaaS,大学,基幹,協業,多数,実績,大学,経営,IT,プロジェクト,日立,大学,クラ,ウド,戦略,パートナー,関係,将来,両社,大学,展開,概要,所在地,社会,設立,従業,概要,最大手,保守,展開,テスト,組み込み,海外,拠点,グローバル,大阪,ヨーロッパ,ほか,ホームページ,日立,大学,ソリューション,ホームページ,hitachi,index,html,
modelファイル
<feature> 43081 <prior> ゲーム・娯楽 0.0266666666666667 <prior> コンピューター 0.0977777777777778 <prior> 情報・コンテンツ 0.0622222222222222 <prior> 周辺機器 0.164444444444444 <prior> 半導体 0.186666666666667 <prior> 通信・インターネット 0.102222222222222 <prior> システム・ソフト開発 0.36 <conditional> 情報・コンテンツ 復旧 0.000595592614651578 <conditional> 情報・コンテンツ WEB 0.000595592614651578 <conditional> 情報・コンテンツ ウド 0.00119118522930316 ・・・ <conditional> 半導体 紀尾井町 0.00215156586182166 <conditional> 半導体 エレクトロン 0.00083672005737509 <conditional> 半導体 オプション 0.0011953143676787
試したこと
全ての要素にアクセスするためにforeach関数を用いてその中で全て計算を行ってみたものの,
引数が上手く繋がりませんでした。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。