- ベストアンサー
一番多い文字の検索
Perlのスクリプトを用いて次のようなCGIプログラムを作ろうとしています。 「ユーザがインプットした文章(何かしらのストーリー)をsubmitして もらい、Perlプログラムを用いて、その文章の中にでてくる最頻出の単語を読み取る。(ここで文章は英語であり、最頻出の単語はa,the など文章の内容に関係のない言葉は排除する。)Perlプログラムで読み取った最頻出の単語を ユーザに表示。」 最頻出の単語を読み取る という部分で 苦戦しているのですが 何がアドバイスをいただけないでしょうか? よろしくお願いします。
- ilnmfay
- お礼率75% (137/181)
- Perl
- 回答数2
- ありがとう数3
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
(1) a、theなどいらない単語を削除 (2) 単語がキー、頻度が値となるような連想配列を作ったあと値で降順にソート でいいでしょう。 $bufに文章が入っているとして、例えば次のように。 $buf =~ s/\ba\b//gi; # aを削除 $buf =~ s/\bthe\b//gi; # bを削除 # 単語をカウント foreach(split(/\s+/, $buf)) { $m{$_}++; } # 頻度の高い順に表示 foreach(sort { $m{$b} <=> $m{$a} || $a cmp $b} keys %m) { print "$_: $m{$_}\n"; }
その他の回答 (1)
- laundryload
- ベストアンサー率35% (18/51)
あとはNo.1を基本に、英数字以外を空白に置き換えておくとか、行末のハイフンの処理をするなどこまごました処理を好みに応じて追加すればいいかと。
お礼
アドバイスありがとうございます。 ただいま、試行錯誤してよいプログラムにしているところです。 回答ありがとうございました。
関連するQ&A
- ファイル入出力 ~perl~
以下のようなプログラムを作っています。(CGI,perlプログラム使用) 1.HTML文章中に textareaを設置。 2.ユーザがtextareaに文章を入力(英語)。 3.submitボタンを押すと、Perlプログラムが最頻出単語を読み取り、「This story is about "その最頻出単語を表示 " We have n stories about the topic. If you wish to see it, please click here.」 この際、a,the,I,youなど、topic内容に関係の内単語を排除。 文章の最後のhereをクリックすると、今までユーザが保存した同じtopicに関するデータを見れる仕組みになっています。 さて、質問なんですが、 今、submitボタンによって提出された文章をサーバ上に保存するところで困っています。 以下のような、ファイル入力のプログラムを書きました。 $fileName = $word . ".dat"; #word は読み込んだ最頻出語 open FH, "< $fileName" or die; $numberOfStory++; print $stored; #stored はtextareaから読み込んだ文章。 print "\n\n\n"; close (FH); この記述で、 ファイルを読み込むまたは、作ってサーバ上のデータベースに保存しようと試みましたが、プログラムが動きません。 また、$numberOfStoryという整数型の変数を利用することによって、保存された文章の数も数えたいのですが、やり方がわかりません。 どなたかアドバイスをいただけないでしょうか。 よろしくお願いします。
- ベストアンサー
- CGI
- PHP 文字の出現回数
textareaからユーザーにインプットしてもらった文章(英語)を PHPを使って読み取り、 単語の出現した回数をarrayにいれるプログラムを作ります。 たとえば、 I am a student. I am a XX university student. という文章をユーザーがインプットしたら、 I:2 am:2 a:2 studemt:2 XX:1 university :1 と値を返します。 Perlでは 読み取った文章(ここでは文字列)を $storyとすると、 foreach( split(/\s+/,$story) ) { $m{$_}++; } でその後、 連想配列のキーと値を順に表示していけばよいとわかります。 PHPではこれをどう表現すればよいでしょうか? foreach( explode(" ", $story ) ) { ... } というところから悩んでいます。 どなたかアドバイスをいただけないでしょうか。 お願いします。
- ベストアンサー
- PHP
- textareaの内容をPerlプログラムに送る
現在、次のようなプログラム(Perl)を作っています。 「ユーザがホームページ上のtextareaになんらかの短いストーリーを書き込む(英語)。submitボタンを押すとその文章の中から一番多い単語をPerlプログラムが読み取って、その後ホームページ上に "Your story is about ..." (...にはその読み取った英単語を表示)と表示。ただし、a,the などの特に文章の内容に関係内単語は削除するようにプログラムを組む。 その後、We have the "n" stories talking about "..." If you want to see them, please click here. と表示。(読み取った英単語に関するストーリーを私たちはすでにn個持っています。もしそれを見たかったらここをクリックしてください) nは今までユーザからもらったストーリーの数をプログラムにより表示。 おおまかにこんな感じのプログラムを作っています。 Perlのプログラム(出現回数の多い英単語を探し出す)はできました。、 (1)HTMLのtextareaとそのプログラムを以下にしてつなげるか。 textarea のタグ内に name ="story"として、プログラムに$storyとすればtextarea 内の文字をgetできるのでしょうか? (2)データを保存 データベースに storyを保存する方法がわからず困っています。 post やgetを使えばよいのでしょうか? 長文すみません。 アドバイスしていただけるかたがいらっしゃれば、よろしくお願いいたします。
- ベストアンサー
- CGI
- PHP 文字の出現回数2
前回↓ http://oshiete1.goo.ne.jp/qa29 で回答をいただいて、問題は解決したのですがまた新たに わからないことがあるので質問させてください。 作っているプログラムは ユーザーがtextareaからインプットした文章(英語)を PHPプログラムが読み取り 出現数を数えるというものです。 ここまでは前回の質問で解決したのですが、 その後 インプットした文章から 特に文章の内容に関係ないと思われる単語(例えば、I,am,you,are,and,orなど)を除外したいのです。 そこから、出現回数を数え、一番多い出現数の単語をoutputしてユーザーに返し… とプログラムがさらに続くのですが 「特定の単語の除外」で困っています。 プログラムは今、以下のような状態です。 $story = _Post["story"]; //get the story from HTML doc preg_match_all("/([a-zA-Z']+)/",$story,$match); //Get the words foreach($match[0] as $val){ $count[$val]++; // strtolower } このプログラムの途中で、特定の単語(I、you、amなど)を削除したいのです。2行目で作った配列matchから特定の単語をうまく除外するよい方法はないでしょうか? explode、split等ではうまくいきませんでした。 アドバイスをいただけないでしょうか。 よろしくお願いします。
- ベストアンサー
- PHP
- テキストエリアのインプットをPerlプログラムへ
基本事項だと思うのですが質問させてください。 まず、HTMLファイル上に <form method= "post" action ="http://localhost/test.cgi> <textarea name ="story" cols="60" rows="10"> This is a test. </textarea> ... <input type="submit" name="submit_story" value="submit"> とプログラムを組みます。 その後、perlプログラムにテキストエリアの内容を送りユーザがsubmitボタンを押したときに HTMLファイルとして出力します。 そのPerlは以下のように組みました。 print "Content-type: text/html\n"; print "\n"; print "<html>\n"; print "<head>\n"; print "<title>The test of CGI</title>\n"; print "</head>\n"; print "<body>\n"; $story = $_POST["story"]; print "<p><h3>Textarea says $story </h3></p>\n"; print "</body>\n"; print "</html>\n"; しかし、$storyは表示されませんでした。 どこがおかしいのでしょうか? もしよければアドバイスをお願いします。
- ベストアンサー
- CGI
- ハッシュの要素を別ファイルに渡すことができますか
perlで次のようなプログラムがあります。 sub { 中略 $USERS{$xy} #$xyは変数 中略 } <form name="user" action="$ENV{'SCRIPT_NAME" method="POST"> ユーザー名:<input type="text" name="username"><br> パスワード:<input type="password" name="pass" value=""><br> <input type="submit" value="ログイン"> ------------- このとき$USERS{$xy} の要素を別ファイルに渡すことができますか。可能ならばどのようにすればよいでしょうか
- ベストアンサー
- Perl
- サイトにエラーが出て閲覧できません
前まで見れたサイトがCGIエラーと出て、閲覧できなくなりました。 以下の文章が出ます。 自分で解決しようと試みましたが、分からない言葉ばかりで苦戦しています。 どうすればよいのでしょう。 ・ パスの指定間違い perl のパスは /usr/bin/perl です。 ・ パーミッション(権限)が正しく設定されていません FTPソフトなどで、パーミッションを適切に設定してみてください。 ・ スクリプトの改行コードに問題があります ファイルの転送時はアスキーモードで転送して下さい。 ・ スクリプトの記述に誤りがある可能性があります 文法チェック等を行ってください。
- 締切済み
- CGI
- FreeBSDのperl
自分のPCでCGIが動かずに苦戦しているのですが 環境はpc9821にFTPでインストールしてUSER環境を 選択しています。この環境でperlへのパスをCGIを使うためのファイルを/usr/bin/perlに指定していたとおもうのですがperlはきちんとうごいているのでしょうか? USER環境にはperlははいっていないということはありませんでしょうか?よろしくおねがいします。
- ベストアンサー
- その他(OS)
- クオートの多重入れ子をするには?
print文でhtmlを出力するCGIをperlでプログラムしているのですが、 クオートの入れ子がうまくいきません。(3重入れ子) print "<td><input type=button value='ログイン' onclick='action="./test.cgi";submit();'></td>\n"; ヒア文字列を使って print <<"A"; <td><input type=button value='ログイン' onclick="action='./test.cgi';submit();"></td>\n A とすればうまくいくのですが、ヒア文字列を使わずに簡素に書く方法は無いでしょうか? よろしくお願いします。m(__)m
- ベストアンサー
- CGI
- ブラウザを使用しないでプログラムから変数を送る方法
通常、 ・GETの場合 <a href=http://www.xxx.co.jp?a=1>submit</a> ・POSTの場合 <form method=post action="xxx.cgi"> <input type=hidden name=a value=1> <input type=submit value=submit> </form> のなどのHTMLでクリックまたはSUBMITボタンを押すとその特定のURLのWWWサーバーに変数が送られますよね。 これをブラウザを使用せず、サーバーのプログラム(perl)を使用して、そのプログラムを実行すると プログラムで指定した特定のURLのwwwサーバー(port 80)に変数を送る方法書き方を教えて下さい。 GETの場合、POSTの場合それぞれ教えてください。 通常、ブラウザがしていることを、プログラムでしたいと思っています。 よろしくお願いします
- ベストアンサー
- CGI
お礼
回答ありがとうございます。 うまく、出現回数の多い文字から並びました。 ほんとにありがとうございました。