#!/usr/local/bin/perl #----------------------------------------------- # # # 類似テキストの検出 # # #----------------------------------------------- # # 使用法 # $ perl lookup.pl use strict; use Text::ChaSen; my $Logpath="log/log1s2.txt"; # chasen -F '%M,%h/'で形態素解析済みログファイル my @Log; my @ScoreTable; &initialize(); #---------------------- # M A I N #---------------------- while(<>) { print "似た文は->".&lookup($_)."\n"; } # ------------------------------------------------------------------------ # # L O O K U P # # 類似文字列の探索 # # ------------------------------------------------------------------------ sub lookup($) { my $input=shift; my (@source, $token,$line,$score,$s,$key,$code,@scorelist); @source= split /\//,Text::ChaSen::sparse_tostr($input); # スコアの集計 for $line (@Log) { for $token (@source) { $s++ while ($line =~ m/$token/g); if($s>0) { ($key,$code)=split/,/,$token; $score += $ScoreTable[$code] * $s; $s=0; } } push(@scorelist,$score); $score=0; } # @scorelistのなかで最高点の行を探す # 得点が同じ場合最も番号の若い者に一致 # もっとも番号の大きいものに一致させる場合は $max<=$scorelist[$i] # どちらを選ぶかはログの記録方向と人工無脳の方針による # # 似た行が存在しなかった場合、一番新しい記憶を返すのが良いかもしれない my $max=$scorelist[0]; my $index=0; for (my $i=1 ; $i<$#scorelist; $i++) { if ($max < $scorelist[$i]) { $index=$i; $max=$scorelist[$i]; } } return $Log[$index]; } #------------------------------------------------ sub initialize() { Text::ChaSen::getopt_argv('chasen','-F','%M,%h/'); local *FILE; open(FILE,$Logpath) or die "$Logpath not found"; @Log=; close FILE; @ScoreTable =( # $ chasen -lp で表示されるリストに重み付けをする 0, # 0 BOS/EOS 25, # 1 名詞 25, # 2 名詞-一般 30, # 3 名詞-固有名詞 30, # 4 名詞-固有名詞-一般 30, # 5 名詞-固有名詞-人名 30, # 6 名詞-固有名詞-人名-一般 30, # 7 名詞-固有名詞-人名-姓 30, # 8 名詞-固有名詞-人名-名 30, # 9 名詞-固有名詞-組織 30, # 10 名詞-固有名詞-地域 30, # 11 名詞-固有名詞-地域-一般 30, # 12 名詞-固有名詞-地域-国 5, # 13 名詞-代名詞 5, # 14 名詞-代名詞-一般 5, # 15 名詞-代名詞-縮約 20, # 16 名詞-副詞可能 20, # 17 名詞-サ変接続 20, # 18 名詞-形容動詞語幹 30, # 19 名詞-数 20, # 20 名詞-非自立 20, # 21 名詞-非自立-一般 20, # 22 名詞-非自立-副詞可能 20, # 23 名詞-非自立-助動詞語幹 20, # 24 名詞-非自立-形容動詞語幹 4, # 25 名詞-特殊 4, # 26 名詞-特殊-助動詞語幹 5, # 27 名詞-接尾 5, # 28 名詞-接尾-一般 5, # 29 名詞-接尾-人名 5, # 30 名詞-接尾-地域 5, # 31 名詞-接尾-サ変接続 5, # 32 名詞-接尾-助動詞語幹 5, # 33 名詞-接尾-形容動詞語幹 5, # 34 名詞-接尾-副詞可能 5, # 35 名詞-接尾-助数詞 5, # 36 名詞-接尾-特殊 5, # 37 名詞-接続詞的 5, # 38 名詞-動詞非自立的 1, # 39 名詞-引用文字列 20, # 40 名詞-ナイ形容詞語幹 1, # 41 接頭詞 1, # 42 接頭詞-名詞接続 1, # 43 接頭詞-動詞接続 1, # 44 接頭詞-形容詞接続 1, # 45 接頭詞-数接続 15, # 46 動詞 15, # 47 動詞-自立 15, # 48 動詞-非自立 15, # 49 動詞-接尾 10, # 50 形容詞 10, # 51 形容詞-自立 10, # 52 形容詞-非自立 10, # 53 形容詞-接尾 1, # 54 副詞 1, # 55 副詞-一般 1, # 56 副詞-助詞類接続 2, # 57 連体詞 1, # 58 接続詞 1, # 59 助詞 1, # 60 助詞-格助詞 1, # 61 助詞-格助詞-一般 1, # 62 助詞-格助詞-引用 1, # 63 助詞-格助詞-連語 1, # 64 助詞-接続助詞 1, # 65 助詞-係助詞 1, # 66 助詞-副助詞 1, # 67 助詞-間投助詞 1, # 68 助詞-並立助詞 1, # 69 助詞-終助詞 1, # 70 助詞-副助詞/並立助詞/終助詞 1, # 71 助詞-連体化 1, # 72 助詞-副詞化 1, # 73 助詞-特殊 4, # 74 助動詞 5, # 75 感動詞 1, # 76 記号 1, # 77 記号-一般 1, # 78 記号-句点 1, # 79 記号-読点 0, # 80 記号-空白 0, # 81 記号-アルファベット 0, # 82 記号-括弧開 0, # 83 記号-括弧閉 0, # 84 その他 0, # 85 その他-間投 0, # 86 フィラー 0, # 87 非言語音 0, # 88 語断片 ); }