#!/usr/local/bin/perl #!D:/Perl/bin/perl.exe #--------------------------------------------------------------------------------- # HTMLファイルの単語の使用頻度算出Perlスクリプト # URL:http://sakaguch.com 電子メール:http://sakaguch.com/cgi/postmail/ より送信して下さい。 # ファイル名:hindo.pl 2003.04.04 作成:鷹の巣 #--------------------------------------------------------------------------------- # 参考URL:HTMLタグの除去に下記のURLを使用。 #     http://search.namazu.org/ml/namazu-ring/msg01358.html #--------------------------------------------------------------------------------- # 改版記録: # 2003.04.04 Rev.1.000 初版 $ver = 'hindo.pl Rev.1.000(作成:鷹の巣)'; #--------------------------------------------------------------------------------- # 1.用途 # #  このPerlスクリプトは、フリーソフトです。詳細は、項4をご一読願います。 # #  このPerlスクリプトは、指定されたhtmlファイルで使用されている単語の使用頻度を #  調べます。分かち書きには、Chasenまたはkakasiを使用します。 # #  英語では、「Keyword Density Analyzer」や「Keyword Frequency Analyzer」や #  「Keyword Counter」で検索しますと、多くのWebサービスのサイトがヒットしますが、 #  日本語は、単語がスペースで区切られていませんので、使用できません。 #   #  日本語では、オンラインの「SEOツール - SEO検索エンジン最適化」 #  http://www.searchengineoptimization.jp/seo_tools/index.html #  が存在します。このサイトを煩雑に利用することは、迷惑になると考え、 #  実施されている機能を簡単にして最小限の内容を表示するようにして見ました。 # #--------------------------------------------------------------------------------- # 2.作成されるファイルの表示例と特徴 # #  作成されるhtmlファイルの表示例は、以下のURLのリンク先に設置しています。 #  http://sakaguch.com/hindo.html # #  ○利点:設置のしやすさを優先にしたので、Chasenやkakasi用のperlモジュールを #      インストールする必要がない。 #      perl初心者が単語の使用頻度を書き出す方法の参考になると考えます。 # #  ○欠点:クライアント機にPerlをインストールしなければならない。 #      スクリプトの読みやすさに重点を置いているので、処理速度が遅い。 #      Perlの一時ファイルをディスクに書き出すので、速度が遅くCGIの処理には向かない。 # #--------------------------------------------------------------------------------- # 3.ご注意事項 # #  このスクリプトは、Windows 2000 Professional #  Active Perl 5.8.4.810 built for MSWin32-x86-multi-thread #  の環境にて、動作確認を行っております。 #  基本的にPerl5以降でしか、動作しません。 # #  このスクリプトに対するご質問や不具合がございましたら、電子メールで、 #  webmaster@sakaguch.com まで、お寄せ下さい。 #  また、「鷹の巣」の自宅サーバー掲示板 #  http://sakaguch.com/cgi/bbs/ #  にご投稿して頂いても結構です。 # #--------------------------------------------------------------------------------- # 4.著作権 # #  このスクリプトは、鷹の巣が作成しましたが、著作権は放棄しています。 #  スクリプトの再配布や改造は自由ですが、無償として下さい。 #  いかなる目的であっても、このスクリプトに付加価値をつけて、 #  有償配布してはなりません。 # #--------------------------------------------------------------------------------- # 5.インストール方法 # #  1)Perlがインストールされている必要があります。 #  2)分かち書きのChasenまたはkakasiをインストールします。 #   基本的には、Chasenをインストールされることを推奨します。 #  3)Chasenまたはkakasiの実行ファイル(Windowsでしたら、Chasen.exeまたはkakasi.exe) #   のあるディレクトリにこのスクリプトであるhindo.plを設置します。 # #--------------------------------------------------------------------------------- # 6.起動方法 # #  コマンドラインから、perl hindo.plを実行します。 # #--------------------------------------------------------------------------------- # 7.その他 # #  CGI用として作成していませんので、Perlのモジュールは、一切使用していません。 #  使用頻度の百分率表示ですが、分母の使用単語数が辞書により変わりますので、 #  一つの目安と考えて下さい。 # #--------------------------------------------------------------------------------- #--------------------------- #■□■ 基本設定 ■□■ #--------------------------- # 使用頻度を調べるhtmlファイルの設定 $html_file_name = 'D:/www/public_html/index.html'; # 分かち書き選択(1:chasenの場合、0:Kakasiの場合) $flag_chasen = 1; # 分析する用語にtitleタグ部分の反映(1:はい、0:いいえ) $flag_page_title = 1; # 分析する用語にkeywords部分の反映(1:はい、0:いいえ) $flag_keywords = 0; # 分析する用語にDescription部分の反映(1:はい、0:いいえ) $flag_description = 0; # 分析する用語にHTMLタグのalt属性の反映(1:はい、0:いいえ) $flag_alt = 0; # 分析する用語にHTMLタグのtitle属性の反映(1:はい、0:いいえ) $flag_title = 0; # 出現頻度から除外する品詞として、記号以外に助詞も除外する。(1:はい、0:いいえ) $flag_omit_jyoshi = 0; #------------------------------ #■□■ 基本設定の終わり ■□■ #------------------------------ #---------------------------- # 分析する部分の抽出 #---------------------------- print "$ver\n"; # 分析する用語の初期設定 $Bunseki = ""; # HTMLファイルの改行コードの除去 open (IN ,"< $html_file_name") || die ("$html_file_nameがopenできません。\n"); while ( ) { $html =~ s/(\r|\n|\r\n)//g; $html =~ s/\s\s/ /g; $html .= $_; } close (IN); print "$html_file_nameを解析中です。\n"; # HTMLファイルの頭部の切り出し $html =~ /(.*)<\/head>/i; $head = $1; # HTMLファイルのタイトル部分の切り出し $head =~ /(.*)<\/title>/i; $page_title = $1; if ( $flag_page_title ) { # 分析する用語にtitleタグ部分を追加 $Bunseki .= $page_title . " "; } # HTMLファイルのKeywords部分の切り出し $head =~ /<meta name=\"keywords\" content=\"([^\"]*)/i; $keywords = $1; if ( $flag_keywords ) { # 分析する用語にkeywords部分を追加 $Bunseki .= $keywords . " "; } # HTMLファイルのDescription部分の切り出し $head =~ /<meta name=\"description\" content=\"([^\"]*)/i; $description = $1; if ( $flag_description ) { # 分析する用語にdescription部分を追加 $Bunseki .= $description . " "; } # HTMLファイルの本体部分の切り出し $html =~ /<body([^<>]*)>(.*)<\/body>/i; $body = $2; if ( $flag_alt ) { # HTMLファイルの本体内alt属性部分の切り出し while ( $body =~ /alt=\"([^\"]*)/gi ) { $alt .= "$1 "; } # 分析する用語にalt属性部分を追加 $Bunseki .= $alt; } if ( $flag_title ) { # HTMLファイルの本体内title属性部分の切り出し while ( $body =~ /title=\"([^\"]*)/gi ) { $title .= "$1 "; } # 分析する用語にtitle属性部分を追加 $Bunseki .= $title; } # HTMLファイルの本体部分からHTMLタグを除去 # 参考URL:http://search.namazu.org/ml/namazu-ring/msg01358.htmlを使用して、HTMLタグを除去 $body =~ s/<!--.*?-->//gs; $body =~ s/<\/?([^<>]*)>//ge; # 分析する用語を一旦書き出す(perlのモジュールは、使用しない) open OUT,"> ./tmp.txt"; print OUT "$Bunseki$body"; close OUT; # 分析する用語のファイルサイズを設定 $bunseki_filesize = -s "./tmp.txt"; #---------------------------- # 分かち書きを行なう #---------------------------- # 分かち書きを行なって、連想配列%countに用語の使用頻度を格納する。 $count_total = 0; # 出現頻度から除外する品詞を設定する。 $omit = "記号"; if ( $flag_omit_jyoshi ) { $omit = "(記号|^助詞)"; } if ( $flag_chasen ) { # chasenによる分かち書き $h = '"%m %U(%P-)\n"'; open ( COMMAND_HANDLE , "| chasen.exe -F $h < ./tmp.txt > ./wakachitmp.txt") || die("chasen.exeが実行できません。\n"); close COMMAND_HANDLE; # 出現頻度を計数する。 open (IN ,"< ./wakachitmp.txt"); while (<IN>) { chomp($_); $_ =~ /(.*) (.*)/;$word = $1; $word_type = $2; if ( ( $word_type !~ /$omit/ ) ) { $count{"$word $word_type"}++; $count_total++; } } close (IN); } else { # Kakasiによる分かち書き open ( COMMAND_HANDLE , "| Kakasi.exe -w -isjis -osjis < ./tmp.txt > ./wakachitmp.txt") || die("Kakasi.exeが実行できません。"); close COMMAND_HANDLE; # 出現頻度を計数する。 open (IN ,"< ./wakachitmp.txt"); $line = <IN>; @word = split ( / / , $line ); foreach ( @word ) { $count{"$_ "}++; $count_total++; } close (IN); } # 全データを出現頻度として、まとめて書式を整え、配列に格納する。 while (($count_name, $count_value) = each( %count )) { $count_name =~ /(.*) (.*)/; push ( @new ,sprintf ( " %3d回 %.2f(\%) %.2f(\%) %30s %30s\n" , $count_value , $count_value * 100 / $count_total , length($1) * $count_value * 100 / $bunseki_filesize , $1 , $2 )); } #---------------------------- # 頻度表を出力 #---------------------------- print "$html_file_name.txtに頻度表\を出力中です。\n"; # 対象ファイルサイズを設定 $filesize = -s $html_file_name; # 単語の種類を設定 $word_type_num =scalar keys %count; # 逆順(出現頻度の多い順)で並び替え、頻度表として出力する。 open OUT,"> $html_file_name.txt"; print OUT <<"_RESULT_"; ファイルサイズ  :$filesize bytes ページタイトル  :$page_title ページのキーワード:$keywords ページの説明   :$description 単語の種類    :$word_type_num 種類 使用単語数    :$count_total 語 使用回数 頻度   占有率             単語 _RESULT_ print OUT reverse sort @new; print OUT "\n\nHTMLの本体部分の表\示($bunseki_filesize bytes)\n$body\n"; close OUT; exit;