エントリーの特徴的単語を抽出する

BulkfeedsさんのSimilarity Search

Blog エントリに含まれる文章を形態素解析し、特徴的単語を抜き出して、それらの単語で Bulkfeeds の RSS Item 全文検索します。

というものでかなり楽しいアプリケーション(最近とてつもなく重く、無反応が日常化してたりもしますが(^^;;)なんですが、まま

「なんでこのエントリがココに並ぶんだろう…??」

ということが発生しています。

これはつまり上記の文章を形態素解析し、特徴的単語を抜き出す段階で「特徴的単語」が人間の考えるものと異なる結果なんですが、Bulkfeedsさんのほうで

「Bulkfeedsが特徴的単語と判定した単語」

を取得するAPIが公開され、これを呼び出すCGIを見つけちゃいましたので、早速さくっと組み込んでみました(^_^)

bricklife.weblog."Bulkfeeds を使って特徴的単語を表示"

早速 quick hack。similar.xml のほうを使って、エントリーの特徴的単語の表示する JavaScript を出力する CGI(ややこしい)を作ってみました。

うを、素晴しい! ワタシの考えてた動作をまったくそのまま実現してくれてます(^_^) やはり皆さん考えることは同じ模様。

早速(大感謝を捧げてから)スクリプトを頂いて来て、設置します。基本的に配布元のファイルそのまんまですが、サイドバーに設置→幅が少ないため、出力部分をちょっとだけ改造してます。

# JavaScript出力
print $q->header(-type => 'application/x-javascript');
if (@terms > 0) {
print "document.write('<div class=\"bulkfeedsSimilarityTerms\">');";
print "document.write('<div class=\"sidetitle\">特徴的単語</div>');";
for (my $i = 0; $i < @terms && $i < 5; $i++) {
my $term = Jcode->new($terms[$i], 'utf8')->euc;
print "document.write('<a class=\"similarTerm\" "
."href=\"https://bulkfeeds.net/app/search2?q="
.uri_escape($term)."\" target=\"_blank\" title=\"『"
.$term."』をBulkfeedsで検索する\">$term</a> ');";
}
print "document.write('</div>');";
}

あと、キャッシュの有効期限がオリジナルでは1時間だったのを8時間に大幅延長しました。ただでさえ重いBulkfeedsさんをより一層酷使しようってんだから、これくらいは遠慮しとかないと(^_^;)

Individual Archive Tamplateにはこう書きました。

<script type="text/javaScript">
var url = '<$MTEntryPermalink$>';
var cgi = 'similar.cgi';
document.write('<scr' + 'ipt type="text/javaScript" src="' + cgi
+ '?url=' + escape(url) + '"></scr' + 'ipt>');
</script>

<script language="JavaScript">
var url ='<$MTEntryPermalink$>';
var n = 5;
var oe = 'euc-jp';
var style = 'lite'; // or 'mt-comments'
var noheader = 0;
document.write('<scr' + 'ipt language="JavaScript" src="jc.cgi?https://bulkfeeds.net/app/similar.js?url=' + escape(url) + '&amp;n=' + n + '&amp;style=' + style + '&amp;oe=' + oe + '&amp;noheader=' + noheader + '&amp;target=_blank"></scr' + 'ipt>');
</script>

当然の如くSimilarity Searchとセットで設置してます。中継君jsとキャッシュフォルダ名(./cache)が同一なので、similar.cgiとjc.cgiは同じトコに置いとくのが宜しいかと。


「なんか最近Bulkfeedsさんにおとなりエントリを探してもらえないエントリが増えてるなぁ? そんなに特殊なことばかり書いてるかなぁ??」

などと思ってたんですが、コレの組み込み作業中に原因と思われるトコに突き当たりました。

Bulkfeeds: Add / Ping your RSS - RSS Directory & Searchにindex.rdfをAddすると

以下の URL は 登録に失敗しました。

https://crusherfactory.net/~yas_/index.rdf (XML parse error in RSS)

↑こうなるようになってました!(>_<;) このために新しいエントリがbulkfeedsさんに拾ってもらえなくなってた→RSSを拾ってもらえないと内容を解析してもらえない→特徴的単語ナシ→おとなりエントリが探せなくなってた模様。

とりあえず、index.xmlのほうをAddすればちゃんと受け付けてくれて大丈夫みたい→こっちをいちいち手動でAddすることでなんとか解析してもらえるみたいです。なんかすげぇ場当たり的な解決法ですが(^_^;)


なんか配布元のbricklife.weblog.*さんが

アクセス過多による CGI 停止処理を受け、サーバへの負荷を考え設置をやめました。見たくなったら以下の「Powered by Bulkfeeds」をクリックすれば見れますしね。

とのことで、上記CGIの設置をやめられちゃったみたいです。

ココはアクセス数が知れてるし、自鯖なんで誰かに怒られたり迷惑をかける事もない→引き続き稼動させる予定ですが、レンタルサーバでなおかつアクセス数が多めなサイトの方とかは、設置時にちょっと考えられたほうがいいかもしんないです。一応念のため(-_-;)

Premature end of script headers: /home/yas_/public_html/similar.cgi
Can't use an undefined value as an ARRAY reference at similar.cgi line 29.

「Bulkfeedsさんの重い時間帯」にはリクエストがタイムアウトし、↑こんな感じでsimilar.cgiが500を返してくる場面がままあったりする模様。でもこれはこちらで対策の出来る事ではないので、「そういうモノ」と割り切るしかないかも(-_-)

ちなみにエラーの出てる29行めってのは

# XMLパース -> 配列格納
my @terms = @{XMLin($xml, ForceArray => ["term"])->{term}};

やはり↑この行ですね(-_-)