• 締切済み

perl  TermExtract 動かない

perl で TermExtract というものを使って専門用語抽出をしたいと思っています。 参考ページ http://gensen.dl.itc.u-tokyo.ac.jp/termextract.h … 形態素解析ソフトは「和布蕪」を使っています。 参考ページの 「和布蕪」の場合の、TermExtract::MeCab サンプルスクリプトを参考にして 動かしてみたんですがうまく動作しません。 <ソース> #! /usr/bin/perl use TermExtract::MeCab; my $data = new TermExtract::MeCab; my $InputFile = "./CGI/mecab_out.txt"; $SIG{INT} = $SIG{QUIT} = $SIG{TERM} = 'sigexit'; my $output_mode = 1; my @noun_list = $data->get_imp_word($InputFile); print "Content-type: text/html; charset=EUC-JP\n\n"; print <<"EOM"; <!DOCTYPE html> <HTML> <HEAD> <TITLE>mecab</TITLE> </HEAD> <BODY> EOM foreach (@noun_list) { # 結果表示 printf "%-60s %16.2f\n", $_->[0], $_->[1] if $output_mode == 1; printf "%s\n", $_->[0] if $output_mode == 2; printf "%s,", $_->[0] if $output_mode == 3; } sub sigexit { $data->unlock_db; } print <<"EOM"; </BODY> </HTML> EOM <---------------> mecab_out.txtには、和布蕪」を使って出食された形態素解析済みのデータ が入っています。 ブラウザでみると、真っ白のページが表示されます。 なにか使い方を間違えているのでしょうか? よろしくお願いいたします。

  • Perl
  • 回答数1
  • ありがとう数0

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「ブラウザで見る」以外の動作確認はしないんですか?

hi_mawa
質問者

補足

変数の渡し方を変えてみり、同じような問題で困った人がいるか調べたり perlcheckerやprint"check";したり、真っ白なページのhtmlソースを見たりなど、 自分で出来うる限りの、動作確認・調査をしたうえで質問しています。 サンプルをコピペしてきて、動かないから質問なんてことは絶対にしません。 格闘した結果、テキストファイル、実行ファイルの文字コードをSHIFT-JISにした時だけ表示されました。 UTF-8,EUCでは文字化けすらせずに何も表示されないようでした。 原因はわかりませんが、TermExtractは動作させることができたようでよかったです。 ありがとうございました。

関連するQ&A

  • perl MeCab 和布蕪 エラー

    perlで、テキストを形態素解析し、専門用語を抽出するコードを書いています。 Text::MeCab と TermExtract::MeCab; を利用しているのですが、 よくわからないエラーがでます。 以下 ソースとエラー文になります。 <ソース> #! /usr/bin/perl use Text::MeCab; use TermExtract::MeCab; my $text = "私はももが好きです。"; my $mtext = getMecabText($text); sub getMecabText{ my ($text) = shift @_; my @arg = ($0,"Ochasen"); my $mecab = new Text::MeCab::Tagger(\@arg); my $exdata = new TermExtract::MeCab; $text = $mecab->parse($text); return $text; } printKeyWord($mtext); sub printKeyWord{ my ($mtext) = shift @_; my $data = new TermExtract::MeCab; my $output_mode = 1; $data->use_TF; my @noun_list = $data->get_imp_word($mtext,'var'); foreach (@noun_list) { next if $_->[0] =~ /^(昭和)*(平成)*(\d+年)*(\d+月)*(\d+日)*(午前)*(午後)*(\d+時)*(\d+分)*(\d+秒)*$/; next if $_->[0] =~ /^\d+$/; printf "%-60s %16.2f\n", $_->[0], $_->[1] if $output_mode == 1; printf "%s\n", $_->[0] if $output_mode == 2; printf "%s,", $_->[0] if $output_mode == 3; } } <エラー文> Can't locate loadable object for module Text::MeCab in @INC (@INC contains: C:/usr/site/lib C:/usr/lib .) at C:/usr/lib/DynaLoader.pm line 21 BEGIN failed--compilation aborted at C:/usr/lib/Text/MeCab.pm line 21. Compilation failed in require at ./lab/a.cgi line 2. BEGIN failed--compilation aborted at ./lab/a.cgi line 2. C:/usr/site/lib と C:/usr/lib の中に MeCab.pmファイルを置いても同じエラーがでます。 DynaLoader.pm line 21 や MeCab.pm line 21 は改行のみでした。 MeCab.pm は http://search.cpan.org/~dmaki/Text-MeCab-0.20013/lib/Text/MeCab.pm の Source にあるものをコピペして設置しています。 いろいろと格闘したのですが、お手上げ状態です。 原因がわかる方いらっしゃれば教えていただきたいです。 よろしくお願いしいたします。

  • MeCab(和布蕪)をPerlで使うには

    MeCabをPerlから使おうと思い、MeCab本体であるmecab-0.93.exeと mecab-perl-0.93.tar.gzをダウンロードしました。 mecab-perl-0.93ディレクトリにあるtest.plをWindowsのコマンドプロンプトにて実行してみたのですが、エラーがでてしまいます。プログラムとエラーは以下の通りです。どういったエラーなのか良く分かりません。アドバイスお願いします。 <プログラム> #!c:/perl/bin/perl use lib $ENV{PWD} . "/blib/lib"; use lib $ENV{PWD} . "/blib/arch"; use MeCab; print $MeCab::VERSION, "\n"; my $sentence = "太郎はこの本を二郎を見た女性に渡した。"; my $c = new MeCab::Tagger (join " ", @ARGV); print $c->parse($sentence); for (my $m = $c->parseToNode ($sentence); $m; $m = $m->{next}) { printf ("%s\t%s\n", $m->{surface}, $m->{feature}); } <エラー内容> % test.pl Can't locate loadable object for module MeCab in @INC (@INC contains: /blib/arch /blib/lib C:/Perl/lib C:/Perl/site/lib .) at MeCab.pm line 8 Compilation failed in require at C:\Program Files\MeCab\mecab-perl-0.93\test.pl line5 BEGIN failes--compilation aborted at C:\Program Files\MeCab\mecab-perl-0.93\test.pl line5 以上です。

  • perlの条件分岐について

    条件分岐を使い、長いperlを簡単にまとめたいと思っています。抜粋したperlを以下にのせましたがYES/NOがずっと続いていて、メンテナンスに困っています。 どうかアドバイスをお願いします。 ・データのかたち %%%%%%%%%345 YES%%%%%%%%%%%%%%%%%%%%%%%%% ver 3445675585950 data 111111111111 345 777good %%%%%%%%%380 NO%%%%%%%%%%%%%%%%%%%%%%%%%% big 2910028717721 q qtyuqqqqqqqqq ppm 3.9999999999 380 NO 222down ・現在のperlの抜粋 #345がYESのとき if($_ =~ /\s+345+\s+(-?[\d.]+)/){ print OUT "\n345,$1,YES"; } #345がNOのとき if($_ =~ /\s+345+\s+NO+\s+(-?[\d.]+)/){ print OUT "\n345,$1,NO"; } #380がYESのとき if($_ =~ /\s+380+\s+(-?[\d.]+)/){ print OUT "\n380,$1,YES"; } #380がNOのとき if($_ =~ /\s+380+\s+NO+\s+(-?[\d.]+)/){ print OUT "\n380,$1,NO"; }

  • perl

    授業でperlをやっていて課題がでてるのですが、 よく分かりません。 200以上300未満の数字か否かを判断する物を作りたいです。 が、300以上だと反応はないのですが200未満でも反応があります。 どこが違うのか教えてください 2つあります。 (1) my $a= 118; if($a < 200 ){ print "" } elsif($a => 300 ){ print "" } else { print "OK.\n"; } (2) my $x =111; if ($x ge 200 && $x lt 300){ print "OK.\n"; }

  • perlがうごきません

    <html> <head> <title>form3</title> </head> <body> <form action="form3.cgi" method="post" name="form3"> <input type="text"name="form3"> <input type="submit"value="送信"> </form> </body> </html> ::::::::::::::::::::::::::::::: #! /usr/bin/perl if($ENV{"REQUEST_METHOD"} eq "GET"){ $str=$ENV{QUERY_STRING"}; }else{ read(STDIN, $str, $ENV{"CONTENT_LENGTH"}); } $str=~ tr/+/ /; $str=~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("c", hex($1))/eg; foreach(split(/&/, $str)){ my ($key, $value)=split(/=/, $_); $data{$key}=$value; } print "Content-type:text/html\n"; print "\n"; print "<html>\n"; print "<head><title>form3</title></head>\n"; print "<body>$data{'form3'}</body>\n"; print "</html>\n"; exit; :::::::::::::::::::::::::::::::: どうしてもうごきません。 どこかスクリプトがまちがっているのでしょうか。 パールのパスはあっています。

    • ベストアンサー
    • Perl
  • perlの構文がおかしいようです。

    構文は以下の通りです。IF文のところがおかしいようですが、どこに間違いがあるのか教えていただけないでしょうか。 sub ippack { my ($a, $b, $c, $d) = @_; return ($a << 24) | ($b << 16) | ($c << 8) | $d; } sub ipunpack() { my ($n) = @_; return (($n>>24)&0xFF,($n>>16)&0xFF,($n>>8)&0xFF,$n&0xFF); } open (IN,"<useIP.txt") while(my $input = <IN>) { if ($input =~ /([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+) ([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)/){; my $n = &ippack($1,$2,$3,$4); my $m = &ippack($5,$6,$7,$8); $n = $n & $m; $m = ~$m & 0xFFFFFFFF; for(my $i = 0; $i <= $m; $i++) { print join(".", &ipunpack($n+$i))."\n "; } } if-else($input =~ /([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)/);{ print "$input\n"; } print "\n"; }

    • ベストアンサー
    • Perl
  • PerlでCabochaを呼び出すには(Windows)

    Windows上でコマンドラインからではなく、PerlのプログラムからCabochaを使うにはどのようにすればいいのでしょうか。Cabochaはwindows版のcabocha-0.52.exeを使用しています。 Linux版のCabochaに含まれている以下のtest.plのようなソースを実行したいのですが、 (http://chasen.org/~taku/software/cabocha/libcabocha.html)に書いてあるperl/READMEを読んだ後、Cygwinで実行してもtest.plは実装できませんでした。 /**********************************************************/ use lib "../src/.libs"; use lib $ENV{PWD} . "/blib/lib"; use lib $ENV{PWD} . "/blib/arch"; my $sentence = "太郎はこの本を二郎を見た女性に渡した。"; use CaboCha; my $c = new CaboCha::Parser([($0, @ARGV)]); print $c->parseToString ($sentence); my $tree = $c->parse($sentence); print $tree->toString (2); my $size = $tree->size(); my $ci = 0; for (my $i = 0; $i < $size; ++$i) { my $token = $tree->token ($i); if ($token->hasChunk ()) { printf ("* %d %d%s %d/%d %f\n", $ci++, $token->chunk->link, $token->chunk->rel, $token->chunk->head, $token->chunk->func, $token->chunk->score); } printf ("%s\t%s\t%s\t%s\t%s\t%s\t%s\n", $token->surface, $token->base, $token->read, $token->pos, $token->ctype, $token->cform, $token->ne); } print "EOS\n"; /*****************************************************/

  • perlをcgiに変換

    my(%area) = ( "愛知" => 0, #県内は仮に第0地帯とする "関東" => 1, #第1地帯 "信越" => 1, "近畿" => 1, "東海" => 1, "北陸" => 1, "東北" => 2, #第2地帯 "中国" => 2, "四国" => 2, "九州" => 3, #第3地帯 "北海道" => 5, #第5地帯 "沖縄" => 6, ); #地帯番号から、サイズ・料金対応表への変換 my(%postage) = ( 0 => { 60=> 600, 80=> 800, 100=>1000, 120=>1200, 140=>1400, 160=>1600, 170=>1700 }, 1 => { 60=> 700, 80=> 900, 100=>1100, 120=>1300, 140=>1500, 160=>1700, 170=>1900 }, 2 => { 60=> 800, 80=>1000, 100=>1200, 120=>1400, 140=>1600, 160=>1800, 170=>2000 }, 3 => { 60=> 900, 80=>1100, 100=>1300, 120=>1500, 140=>1700, 160=>1900, 170=>2100 }, 5 => { 60=>1100, 80=>1300, 100=>1500, 120=>1700, 140=>1900, 160=>2100, 170=>2300 }, 6 => { 60=>1200, 80=>1400, 100=>1600, 120=>1800, 140=>2000, 160=>2200, 170=>2400 }, ); print"愛知県から小包の地方を入力してください。\n"; chomp($areaname=<>); my $areano = $area{$areaname}; #if (!defined($areano)) { #print "地域名「$areaname」は正しくありません\n"; #exit; #} print"小包のサイズを入力してください。\n"; chomp($size=<>); my $price = $postage{$areano}->{$size}; #if (!defined($price)) { #print "サイズ「$size」は正しくありません\n"; #exit; #} $price =~ s/(\d)(\d{3})$/$1,$2/; print "$areaname 地方は第 $areano 地帯です。\n$size サイズは $price 円になります\n"; このperlは動きますが、どのようにcgiを書き換えればいいのか分かりません。 my $price = $postage {$areano}->{$hash{'size'}}; とするとエラーになってしまいます。 分かる方いましたら、教えてください。 教えて頂けると、助かります。 よろしくお願いします。

    • ベストアンサー
    • CGI
  • [Perl]foreach if 抽出

    質問させていただきます。 メールヘッダに対して以下のプログラムを実行します。 ソースコード ~略 my $file_data_str = join("", @file_data); my @received_datas = split(/Received:/, $file_data_str); my @received_datas = reverse(@received_datas); foreach my $sorted(@received_datas){ if($sorted =~ /by\s\w+.abc.jp/){ $sorted =~ /(\[\d+\.\d+\.\d+\.\d+\])/; print $sorted; print "\n"; } } } exit; を実行すると以下のようにに実行結果が出てきます。 from 158.217.207.30 (114.114.96.20 [114.114.96.20]) by ************abc.jp from ****************.jp (***************.jp [158.217.208.15]) by ***********abc.jp 私は [114.114.96.20]だけを取りだしのですがどうしたらいいでしょうか? foreach my $sorted(@received_datas){ if($sorted =~ /by\s\w.abc.jp/){ $sorted =~ /(\[\d+\.\d+\.\d+\.\d+\])/; ここをどうにかすればいけると思うのですが詰まってしまって… 申し訳ないですが助言をお願いします。

    • ベストアンサー
    • Perl
  • perl 初心者です。 わかりやすくお願いします。

    Perlを始めたのですが、本や色いろんなサイトを見てもよく分かりません。 Aと言うデータを読み込んで最大最小・平均・標準偏差を求めたいです。 (1)どこが間違っているのか1部づつでもいいので詳しく教えてください。 (2)一つ一つの意味がちゃんとはつかめていないと感じるので流れを教えてください。 #!/usr/bin/perl # 12345 STDIN use strict; use warnings; open ( FILEHANDLE , " < A " ) ; my @Str=<STDIN>; foreach my $Row (@Str ){ print $Row; } my $Minimum=$ARGV[0]; my $Maximum=$Minimum; my $Sum=$Minimum; my $temp=0; my $i=1; while ( $i < $Num_arg){ $temp=$ARGV[$i]; if ( $Minimum > $temp ) { $Minimum = $temp; }elsif ( $Maximum < $temp ){ $Maximum = $temp; } $Sum = $Sum + $temp; $i++; } my $Average = $Sum / $Num_arg; my $w = foreach my $w(0..$#Numbers){ ($Num_arg - $Average) ** / Num_arg; } my $Standarddivitation = sqrt ($w); print "Average value = $Average \n"; print "Maximum Value = $Maximum \n"; print "Minimum Value = $Minimum \n"; print "Standard devitation = $Standarddevitation;

専門家に質問してみよう