• 締切済み

解析機能について

おはようございます.毎回お世話になっております. IDを紛失してしまい,前回まででご回答いただいたのにも関わらず,返信できず申し訳ありませんでした; 今回は前回までの質問と結果を踏まえ,質問させていただきます. 私は現在ホームページの解析機能をいじっています. 解析機能のベースとなっているのは下記で配布されているものです. URL記載失礼します. http://www7a.biglobe.ne.jp/~wwwwww/analyzer/ 私の追加として,検索ワード解析機能(word,word2の部分)に新たにword3を設けて,word2までで分割された各単語を集計し表示させようと思っております. 現在検索ワードの表示はできているのですが,変数がマッチしていないためか,うまく集計してくれません. 以下に追加部分のコードを記載します. elsif($FORM{'mode'} eq "word3") { push my @search_words, $word; my %word_of = map {$_ => 0} @search_words ; foreach my $search_key ( keys %word_of ) { foreach my $words ( keys %word_of ) { $word_of{$search_key}++ if $words =~ /\Q$search_key\E/; } } foreach ( sort ( keys %word_of ) ){ print = qq[<table width="600"><td width="400">[$_ ]</td><td width="50"> $word_of{$_} 件</td><td with ="150"><img src="bar.gif" width=$word_of{$_} height=10></td></table>\n]; } } 初歩的なところで間違っている可能性もあるかもしれませんが,おわかりになりましたら,ご助力ください. 不明な点などございましたら随時お答え致します. よろしくお願いします.

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

みんなの回答

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

う~ん,「単語の格納形式がど~のこ~の」となると, 実際にどうなっているのかを吐かせた方がいいと思いますね. それも, (形からおそらく CGI かなんかでしょうから) 別途「それ用」のログファイルを作ってそっちに出力させる. で, 例えば open LOG, '>>', '/some/path/to/log.txt'; print LOG join(', ', map{ qq("$_") } @search_words), "\n"; close LOG; my %word_of = map {$_ => 0} @search_words ; のように出力させて, その結果をみる.

meltykiss
質問者

補足

回答ありがとうございます.ならびに,返信が遅れてすみません; 表示形式の問題かもしれませんが,出力された内容をtxtに張り付けしてみると,既存の機能で集められた語群は, あい -------------------------- あいう -------------------------- のように,仕切りとなるハイフンと改行が見られました. これが適切に処理されない原因でしょうか.

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

とりあえず手元ではこんなプログラムで (それなりに) 期待されるはずの結果が出ていると思いますが.... @search_words = qw(foo bar foobaz barfoo baz); my %word_of = map {$_ => 0} @search_words; for my $search_key (keys %word_of) { for my $words (keys %word_of) { $word_of{$search_key}++ if $words =~ /\Q$search_key\E/; } } for (sort keys %word_of) { print qq($_ => $word_of{$_}\n); } 「検索ワード」のなかに空白が入っているとかいうことはないですよね?

meltykiss
質問者

お礼

お礼から失礼します. いただいたコードを動かしてみました. 私も実行済みなのですが,自分でハッシュ(または配列)を与えたときには正常に動くコードなのですが,配布されている解析機能のコードに入れると正常に動作しなくなってしまいます. プログラム自体は合ってるとすると,単語の格納形式が違うからなのでしょうか?

meltykiss
質問者

補足

回答ありがとうございます! いただいたコードを動作させてみたいと思います. >「検索ワード」のなかに空白が入っているとかいうことはないですよね? 空白とは「Perl 入門」のような単語のことですか? それならば入っていますが,今追加しようとしているコード単体では空白が含まれている単語がハッシュに入っていても処理してくれました.

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

「うまく集計してくれない」とは, 具体的にはどのように「うまく集計してくれない」のですか?

meltykiss
質問者

補足

回答ありがとうございます. 1,検索ワードの数が全て1件になってしまう. 2,同一の単語が複数回表示されてしまう. の2点です. 2は,同一の単語が$word内にあるのならば,集計されて表示されるのは1つのみ,1は単語の数により値が変動するのがそれぞれ求める動作です.

関連するQ&A

  • 解析機能の拡張について

    おはようございます。いつもお世話になっています。 今回は解析機能の拡張についてお聞きしたいと思います。 解析機能については、かんたん作成.comさんのcgiをお借りしました。 http://www7a.biglobe.ne.jp/~wwwwww/analyzer/ これをベースに、検索ワードの集計機能を追加しようと思っております。 word1、word2に検索ワードの表示・分割がありますが、新たにword3を設けて分割されたものを集計し、表示する処理をしたいです。 集計については、前回までで教えていただいた正規表現を用いて自ら組んでみたのですが、変数が一致していないせいか上手く表示できません。 以下に検索ワードを処理しているプログラムを記載します。 elsif($FORM{'mode'} eq "word1" or $FORM{'mode'} eq "word2" or $FORM{'mode'} eq "word3") { #検索ワード my ($n, $pair, $word); if($referer =~ /\?/) { my ($url, $query) = split(/\?/, $referer); for($n = 0 ; $n < @search ; $n++) { if($url =~ /$search[$n][1]/) { foreach $pair (split(/&/, $query)) { my ($key, $value) = split(/=/, $pair); if($key eq $search[$n][2]) { $word = $value; last; } } last; } } if($word) { $word =~ tr/+/ /; $word =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg; if($FORM{'mode'} eq "word1") { ++$freg{$word}; } elsif($FORM{'mode'} eq "word2") { my $word2; $word =~ s/\x81\x40/ /g; foreach $word2 (split(/\s+/, $word)) { if($word2) { ++$freg{$word2}; } } } #=====================================================================EDIT elsif($FORM{'mode'} eq "word3") { my %word_of = map {$_ => 0} %freg; foreach my $search_key ( keys %word_of ) { foreach my $word ( keys %word_of ) { $word_of{$search_key}++ if $word =~ /$search_key/; } } foreach ( sort ( keys %word_of ) ){ print "<table><tr><td>「$_」 </td><td> $word_of{$_} 件</td></table>\n"; } } #=====================================================================END } } } } word3の項目が現在私が編集している部分です。 プログラム全体を通して、私自身が望む動作を可能とする部分の追加は行ったと思うのですが、見落としている点があるかもしれません。 また前述したように、変数が一致していないのかもしれません。 おかしな点に気づかれたら、お手数ですがお教え願えますか。 もしかしたら初歩的なミスをしているかもしれませんが、よろしくお願いいたします。 不明な点などございましたら、随時対応します。 ここでは書ききれないため、現在編集中のcgiファイルを添付データとして貼り付けておきます。

  • Perl 正規表現について

    Perlに関していつもお世話になっております。 今回も正規表現に関する質問をしたいと思います。 「あ、あい、あいう、あいうえ、あいうえお」というハッシュが存在するときに、「{あ}は○○回出ました。」「{あい}は○○回出ました。」とそれぞれ表示させるコードを組もうと思います。 前回までで皆様に教えていただいたことを元に組んでみました。 #!/usr/bin/perl use warnings; use strict; use utf8; use Encode; my %word_of = ( 'あい' => 0, 'あいう' => 0, 'あいうえ' => 0, 'あいうえお' => 0, 'かき' => 0, 'かきく' => 0, 'かきくけ' => 0, 'かきくけこ' => 0, ); foreach my $search_key ( keys %word_of ) { foreach my $word ( keys %word_of ) { if ( $word =~ /$search_key/ ) { $word_of{$search_key}++; } } } foreach my $key ( sort ( keys %word_of ) ) { # utf8, shiftjis eucjp ... print encode( 'utf8', "「$key」 は $word_of{$key} 回出ました" ), "\n"; } これを出来ればeucjpで組みたいのですが、可能でしょうか? 私の思いあたる点、utf8表記の部分をeucjpに直しただけではエラーが出てしまいます。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • smartでのtable表示について

    ちょっとベタな書き方ですが下記のように、画像と名前のセットを表示して行く時に、 最後、余ったセルに{html_table}などを使って自動的に埋めて行く事は、出来ますでしょうか、 <table width="650" border="0" cellspacing="0" cellpadding="0"> {foreach from=$data item=data key=key name="loop"} {if $smarty.foreach.loop.iteration %5 ==1}<tr>{/if} <td> <table width="125" border="0" cellspacing="0" cellpadding="1"> <tr> <td><a href="{$data.id}.php"><img src="img/{$data.staff_file}" width="125" height="175" border="0"></a> </td></tr> <tr> <td>{$data.name} </td> </td></tr> </table> </td> {if $smarty.foreach.loop.iteration % 5 ==0}</tr>{/if} {/foreach} {if $smarty.foreach.loop.total % 5 ==4}<td> </td>{/if} {if $smarty.foreach.loop.total % 5 ==3}<td> </td><td> </td>{/if} {if $smarty.foreach.loop.total % 5 ==2}<td> </td><td> </td><td> </td>{/if} {if $smarty.foreach.loop.total % 5 ==1}<td> </td><td> </td><td> </td><td> </td>{/if} </table>

    • ベストアンサー
    • PHP
  • perl cgiでnameを

    perl cgiでフォームの行と列を以下のようにハッシュと配列を使って生成しようとしました: my %temp = ( 'test1' => 'テスト1', 'test2' => 'テスト2' ) for (my $linepnt = 1; $linepnt<8; $linepnt++){ foreach my $key (keys(%temp)){ print "<td><input type=\"text\" name=\"$key . '_' . $linepnt\" value=\"$in_data{$key . '_' . $linepnt}\" style=\"width:3em;font-size:medium\">mL</td>"; } } するとフォームからの入力を受けた側ではnameを test1_7 というように受け取らずに test1+.+%27_%27+.+7 と受け取っていることが分かりました。 name=\'test1_' . $linepnt\"  とするだけなら正しく test1_7  として受け取ってくれます。 なにが間違っているのでしょうか。 ご指導ください。

    • ベストアンサー
    • CGI
  • foreachの使い方

    ------------------------------------------- include.php <?php $kakaku = array(1=>'300', 2=>'500' ); $picture = array(1='img/pan.jpg', 2='img/choko.jpg' ); ?> ------------------------------------------- index.php <table border="1" height="188" width="461"> <tr> <td width="458" height="160"><img border="0" src="<?php echo $picture ;?>" width="190" height="157"> <font size="4" color="#FF00FF"><b><?php echo $kakaku ;?></b></font></td> </tr> </table> -------------------------------------------- この時に <tr> <td width="458" height="160"><img border="0" src="<?php echo $picture ;?>" width="190" height="157"> <font size="4" color="#FF00FF"><b><?php echo $kakaku ;?></b></font></td> </tr> の部分を変数の値の分だけ繰り返したい時、 <?php foreach($picture AS $key => $val) { ?> <? } ?> <?php foreach($kakaku AS $key => $val) { ?> <? } ?> はどう記述したらいいのですか?? 結果的には <table border="1" height="188" width="461"> <tr> <td width="458" height="160"><img border="0" src="img/pan.jpg" width="190" height="157"> <font size="4" color="#FF00FF"><b>300円</b></font></td> </tr>  <tr> <td width="458" height="160"><img border="0" src="img/choko.jpg" width="190" height="157"> <font size="4" color="#FF00FF"><b>500円</b></font></td> </tr> </table> というふうにしたいのです! よろしくお願いします。

    • ベストアンサー
    • PHP
  • 全角スペースを半角スペースに変換

    $str = mb_convert_kana($usersearch, "s", "EUC-JP"); $usersearch= $_POST['usersearch']; 上記のソースを記述し、htmlのテキストボックス(usersearch)内にある全角スペースを半角にしようと試みるのですが、上手く変換されません。何か解決策はないでしょうか?? 全体的にはこのようなソースです。 $search_query = "select * from kensaku2"; $str = mb_convert_kana($usersearch, "s", "EUC-JP"); $usersearch= $_POST['usersearch']; $clean_search = str_replace(',', ' ', $usersearch); $search_words = explode(' ', $clean_search); $final_search_words = array(); if (count($search_words) > 0) { foreach ($search_words as $word) { if (!empty($word)) { $final_search_words[] = $word; } } } // Generate a WHERE clause using all of the search keywords $where_list = array(); if (count($final_search_words) > 0) { foreach($final_search_words as $word) { $where_list[] = "syou LIKE '%$word%'"; } } $where_clause = implode(' AND ', $where_list); // Add the keyword WHERE clause to the search query if (!empty($where_clause)) { $search_query .= " WHERE $where_clause"; } よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • jQueryのloadを使用して要素を解析して表示するとき同時にテーブ

    jQueryのloadを使用して要素を解析して表示するとき同時にテーブルのセル背景の色変更をしたいと思っています。 解析して表示は出来るのですがどうしても色が変わってくれません。 $(function(){ var target1_load=$("#target1_load"); target1_load.load("B.html .youso"); if (target1_load.text()=="XXX")target1_load.css({backgroundColor:"red"}); }); としていますが対象divのある個所は下記のようになっています。 <table style="width: 90%"> <tr> <td style="width: 180px"> <div id="d1" style="width: 180px">●ビバガッツ1</div></td> <td style="width: 180px"> <img alt="" src="login-blue.gif" width="89" height="26" /></td> <td style="width: 80px"> <img alt="" src="b_count1.gif" width="24" height="27" /></td> <td style="width: 100px">&nbsp;</td> <td><div id="target1_load"></div></td> </tr> <tr> <td colspan="5"><p id="p1"></p></td> よろしくお願いします

  • ホームページのテーブルをWordに貼り付けると左にづれる?

    以下のコードのHTMLで作られたテーブルをブラウザーに表示→コピー→Wordに貼り付けると、テーブルがWordの文字列開始位置よりも左側にづれてペーストされるのですが、どのようにして回避できるのでしょうか? コード: <table width="550" border="1" cellspacing="0" cellpadding="40"> <tr> <td width="466" colspan="2" align="center"> 表タイトル </td> </tr> <tr align="left" valign="top"> <td width="118"> 表見出し行 </td> <td width="266"> データ </td> </tr> </table> どうやら、テーブルのcellpaddingが関係しているようで、cellpaddingの値を以下のコードのように小さくすると、テーブルをWordに貼り付けたときに文字列開始位置よりも左にずれる割合は小さくなります。 コード: <table width="550" border="1" cellspacing="0" cellpadding="5"> <tr> <td width="536" colspan="2" align="center"> 表タイトル </td> </tr> <tr align="left" valign="top"> <td width="188"> 表見出し行 </td> <td width="336"> データ </td> </tr> </table> ただ、それでも少し左にずれることには変わりませんし、cellpaddingの値が大きなテーブルをWordに貼り付けるときの回避策とはなりません。 どのようにしたら、cellpaddingの値が0ではないホームページのテーブルをブラウザーからコピーしWordに貼り付けたとき、Wordの文字列開始位置より左にずれないようにできるのでしょうか? よろしくお願いします。

  • Perlを使った単語出現カウント

    コマンドライン引数で 入力ファイルからデータ受け取って結果を出力ファイルに書き込みたいのですが、プログラムは #!/usr/bin/perl while ( <> ) { @words = split(" "); $wc{@words[0]} += 1; } foreach $key (keys %wc) { print "$wc{$key} $key\n"; } で今のコードでは、コンソールに出力されるだけとなってしまいます。 ファイル入出力を行うにはどうすればいいですか?

    • ベストアンサー
    • Perl
  • NetScape 全角数字の折り返し

    NetScapeで、下記のHTMLを表示させてみました。 <table> <tr><td width=50> 22222222222222222222222222222222222222222222222222 </td></tr> <table> というようなのを、表示させたところ、 tdのwidthの幅に関係なく、2という文字がずっと 横一直線に表示されてしまいます。 NetScapeの全角数字のワードラップのバグであるということがわかりました。 しかしながら、widthの幅で折り返したいのです。 tdタグに、そういった属性を持たしたりするなどで 対応できるものなのでしょうか? 以上よろしくお願いいたします。

    • ベストアンサー
    • HTML