13012007 HyperEstraier
Lingua::JA::Summarizeで特徴語を抽出して、Hyper Estraierでblosxomのデータを検索するということをやってみた。
抽出された語彙は単にOR検索しているので、精度があんまよくない。
use strict; use warnings; use Estraier; use Lingua::JA::Summarize; my $entry = << '__DDD__'; 文章をここへ __DDD__ my $s = Lingua::JA::Summarize->new; $s->analyze($entry); my @keywords = $s->keywords({ minwords => 3, maxwords => 5}); my $query_keywords = join(" OR ", @keywords); print $query_keywords; my $db = new Database(); # open the database unless($db->open("/usr/local/blosxom/casket", Database::DBREADER)){ printf("error: %s\n", $db->err_msg($db->error())); exit; } my $cond = new Condition(); $cond->set_phrase($query_keywords); $cond->set_max(5); $cond->add_attr('@uri ISTREW .txt'); my $result = $db->search($cond); my $dnum = $result->doc_num(); foreach my $i (0..$dnum-1){ my $doc = $db->get_doc($result->get_doc_id($i), 0); next unless(defined($doc)); my $uri = $doc->attr('@uri'); printf("URI: %s\n", $uri) if defined($uri); my $title = $doc->attr('@title'); printf("Title: %s\n", $title) if defined($title); # display the body text # my $texts = $doc->texts(); # foreach my $text (@$texts){ # printf("%s\n", $text); # } } unless($db->close()){ printf("error: %s\n", $db->err_msg($db->error())); }
文書の類似性検索だったら文書をHyper Estraierに登録してから、類似度検索をかければいいのかも。estseek.cgiのsimilar検索みたいのがやりたいんだけど。Hyper Estraierのドキュメントをちゃんと読まねば。