さくらインターネットでTermExtractをCGI上で実行する

2017年7月3日

ようやくさくらインターネットで実行できそうになりましたので、CGIとつなげてみます。

 

#!/usr/bin/perl

use strict;
use warnings;
$ENV{'HOME'}="/home/mlin";
$ENV{'LANG'}="ja_JP.UTF-8";
$ENV{'PATH'}="/home/mlin/perl5/bin:/home/mlin/local/bin";
$ENV{'LD_LIBRARY_PATH'}="/home/mlin/local/lib";
use lib '/home/mlin/perl5/lib/perl5';
use CGI;
use MeCab;
use TermExtract::MeCab;
use Jcode;
my $data = new TermExtract::MeCab;
my $debug;

my $q=new CGI;
my @param=$q->param;
my %HASH;
for (@param){
    $HASH{$_}=$q->param($_);
    $debug.=qq($_ , $HASH{$_} | );
}

my $m = new MeCab::Tagger ("");
my $s = "";
if (exists $HASH{'text'}){
    $s=$HASH{'text'};
}
my $n = $m->parseToNode($s);
my $str="";
my $txtfile="in.txt";
while ($n = $n->{next}) {
    $str.=sprintf("%s\t%s\n",
    $n->{surface}, # 表層
    $n->{feature} # 現在の品詞
    );
}
# 何故かEUCじゃないとTermExtractの結果が返らないのでEUCに変換.
$str = &Jcode::convert($str,"euc","utf8");

# 出力モードを指定
# 1 → 専門用語+重要度、2 → 専門用語のみ
# 3 → カンマ区切り
my $output_mode = 3;

#
# 「形態素解析」済みのテキストファイルから、データを読み込み
# 専門用語リストを配列に返す
# (累積統計DB使用、ドキュメント中の頻度使用にセット)
#
my @noun_list = $data->get_imp_word($str,'var'); # 入力が変数
#my @noun_list = $data->get_imp_word("in.txte"); # 入力がファイル

#
# 専門用語リストと計算した重要度を標準出力に出す
#
my $result;
foreach (@noun_list) {
    # 日付・時刻は表示しない
    next if $_->[0] =~ /^(昭和)*(平成)*(\d+年)*(\d+月)*(\d+日)*(午前)*(午後)*(\d+時)*(\d+分)*(\d+秒)*$/;
    # 数値のみは表示しない
    next if $_->[0] =~ /^\d+$/;

    my $str2 = &Jcode::convert($_->[0],"utf8","euc");

    # 結果表示
    $result .=sprintf "%-60s %16.2f\n", $_->[0], $_->[1] if $output_mode == 1;
    $result .=sprintf "%s\n", $_->[0] if $output_mode == 2;
    $result .=sprintf "%s<br>", $str2 if $output_mode == 3;
}
print "Content-type: text/html\n\n";
print "<html lang=\"ja\">\n";
print "<head>\n";
print " <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n";
print " <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0\">\n";
print " <meta http-equiv=\"Pragma\" content=\"no-cache\" />\n";
print " <meta http-equiv=\"cache-control\" content=\"no-cache\" />\n";
print " <meta http-equiv=\"expires\" content=\"0\" />\n";
print " <link rel=\"apple-touch-icon-precomposed\" href=\"\" />\n";
print " <title>Water</title>\n";
print "</head>\n";
#print "<body>$debug\n";
print "<body>\n";
print " <form action=\"index.cgi\" method=\"post\">\n";
print " <input type=\"submit\" value=\"OK\">\n";
print " <a href=\"./index.cgi\">reload</a><br>\n";
print " <textarea name=\"text\" rows=\"10\" cols=\"60\"></textarea><br>\n";
print " $result";
print " </form>\n";
print "</body>\n";
print "</html>\n";

 
まず、環境変数を設定します。
parseToNodeにテキストエリアからPOSTされてきたデータを渡しています。
最終的に結果を$resultという変数に代入して、
HTMLの中にPRINTしています。

 

これで、ようやく

文章入力→キーワードに分解

というCGIができました!