MeCabを使ってMemorium向けに、PukiWikiのページから名詞・形容詞を抽出し、キーワードファイルを生成するPerlスクリプトを「改版」(1/28)
MeCabを使ってMemorium向けに、PukiWikiのページから名詞・形容詞を抽出し、キーワードファイルを生成するPerlスクリプト (1/24) (http://d-k.cocolog-nifty.com/blog/2005/01/mecabmemoriumpu.html)を改良しました。
変更点は以下の2点。
- 入力ファイルの文字コードをPerlスクリプト内で、EUCに変換すること
- Perlスクリプトの引数として、入力ファイルのパスを指定できるようにした。入力ファイルの引数が省略された場合は、既定値でPukiWikiのファイルから入力するようにする。
これで好きなファイル(例えば、HTMLページなど)をMemoriumにキーワードとして渡すことができるようになりました。
以下、変更したソース。Perlの超超超初心者なので汚いところや変なところはご容赦を。
■Perlを起動して、出力ファイルをUTF8に変換するシェルスクリプト
perl /home/hogehoge/bin/pukiwiki2memorium.pl $1 lv -Ou8 /home/hogehoge/public_html/tmp/MemoriumKeywords.txt.euc >/home/hogehoge/public_html/tmp/MemoriumKeywords.txt.utf8
■Perlスクリプト
#!/usr/bin/perl use Jcode; my $i_dir = '/home/hogehoge/public_html/pukiwiki/wiki'; my $o_dir = '/home/hogehoge/public_html/tmp'; my $o_memorium_fn = 'MemoriumKeywords.txt.euc'; my $from_pukiwiki = 'true'; my $i=1; my @o_memorium; # 標準入力から入力ファイル if ( ($#ARGV+1) >= 1 ) { $from_pukiwiki = 'false'; print "MeCab への入力ファイルは引数\n"; my $i_filename = $ARGV[0]; chomp $i_filename ; open(I_PUKIWIKI,"<$i_filename") || die "Can't open 引数の入力ファイル"; $o_memorium[0] = ":ファイルからのメモ:"; } else { print "MeCab への入力ファイルは PukiWiki\n"; # Select PukiWiki Newest File opendir(DIR,$i_dir) or die "$!"; while($filename=readdir(DIR) ) { @stat = stat $i_dir.'/'.$filename; ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdat) = localtime($stat[9]); $mtime=sprintf("%04d%02d%02d%02d%02d%02d",$year+1900,$mon+1,$mday,$hour,$min,$sec); push(@fnames,$mtime.",".$filename); } closedir(DIR); @fnames=sort{$b cmp $a}@fnames; my @i_date_pukiwiki = split(/,/,@fnames[1]); my $i_pukiwiki = @i_date_pukiwiki[1]; # Read PukiWiki Newest File my $i_pukiwiki_path = $i_dir."/".$i_pukiwiki; open(I_PUKIWIKI,"<$i_pukiwiki_path" ) or die "$!"; $o_memorium[0] = ":PukiWikiからのメモ:"; } my $o_memorium_path = $o_dir."/".$o_memorium_fn; open(O_MEMO, ">$o_memorium_path" ) or die "$!"; while( <I_PUKIWIKI> ){ # MeCab: Yet Another Part-of-Speech and Morphological Analyzer # http://chasen.org/~taku/software/mecab/ use MeCab; # 入力ファイルの文字コードをEUCに変換 $_ = jcode($_)->euc; my @arg = ($0, "-Ochasen"); my $mecab = new MeCab::Tagger (\@arg); my @memorium_card = $mecab->parse($_); # MeCab 品詞で処理を分ける。 # tune apps:Memorium # http://blog.livedoor.jp/tunepolo/archives/6794946.html foreach my $row ( @memorium_card ) { my @rows = split(/\n/,$row); foreach my $card ( @rows ) { if ( $card =~ /名詞|形容詞|副詞|接続詞/ ) { my @meisi_list = split(/\t/,$card); # Output Memorium Format # Memorium Keywords - Memoriumプラグイン # http://www.persistent.org/memorium/hiki.cgi?Memorium%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3 # :単語:品詞: の形式で出力 $o_memorium[$i] = ":".$meisi_list[0].":".$meisi_list[3]."\n"; $i=$i+1; } } } } my %count; @o_memorium = grep(!$count{$_}++, @o_memorium); print @o_memorium; print O_MEMO @o_memorium; close(O_MEMO); print "PukiWiki -> Memorium.Done!\n"; EOF
■MeCabで抽出したキーワードの例:
MeCab(+辞書
ipadic)は「半角英数字」はダメだけど、「HP」「in」のような「全角英数字」は抽出してくれるのか。ならPerlスクリプト内でMeCabへ渡す前に「半角英数字」を「全角英数字」に変換する?(宿題)
:メール:名詞-サ変接続 :バックアップ:名詞-サ変接続 :仕様:名詞-一般 :モバイル:名詞-一般 :台:名詞-接尾-一般 :目:名詞-接尾-一般 :いつ:名詞-副詞可能 :どこ:名詞-代名詞-一般 :名無し:名詞-一般 :結構:副詞-一般 :がっかり:副詞-助詞類接続 :同期:名詞-副詞可能 :ん:名詞-非自立-一般 :もん:名詞-非自立-一般 :無い:形容詞-自立 :in:名詞-一般 :ファイル:名詞-一般 :良い:形容詞-非自立 :テキストエディタ:名詞-一般 :やつ:名詞-非自立-一般 :インフォメーション:名詞-一般 :みなさま:名詞-代名詞-一般 :いつも:副詞-助詞類接続 :HP:名詞-一般 :作成:名詞-サ変接続 :更新:名詞-サ変接続 :なかなか:副詞-助詞類接続
1/29 追記:
「あたまがうにになる:
人工無能を作ろう~汚染チェック(perl) (http://www.i-on.gr.jp/~lan/blog/archives/000260.html)」を参考に「半角→全角」に変換の処理を、手元のPerlスクリプトの方には入れてみましたが効果の程は???
以上。
うーん、次の興味は「人口無能」かしら。
| 固定リンク | コメント (0) | トラックバック (0)

