<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"><channel><title>hyperestraier / Drkcore</title><link>http://blog.kzfmix.com/hyperestraier</link><description>Programming, Music, Snowboarding</description><language>ja</language><lastBuildDate>Sat, 13 Jan 2007 22:51:13 +0919</lastBuildDate><item><title>Lingua::JA::Summarizeの特徴語に重みをつけて文書検索</title><link>http://blog.kzfmix.com/entry/1168696273</link><description>&lt;p&gt;&lt;a href="http://blog.kzfmix.com/entry/1168697376"&gt;Lingua::JA::Summarizeの特徴語をHyper Estraierで検索&lt;/a&gt;
できるようにしたんだけど、特徴語を単にOR検索しているだけなので、精度がよくない。それが気に入らないので類似性検索までできるようにしてみた。&lt;/p&gt;
&lt;h4&gt;Hyper Estraierの類似性検索の仕組み&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://hyperestraier.sourceforge.net/uguide-ja.html" title="User's Guide of Hyper Estraier Version 1 (Japanese)"&gt;User's Guide of Hyper Estraier Version 1 (Japanese)&lt;/a&gt;
&lt;blockquote&gt;estseek.cgiの場合、「[similar]」というリンクを選択すると類似検索を行うことができます。&lt;/blockquote&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;SIMILAR&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;WITH&lt;/span&gt; &lt;span class="err"&gt;重み&lt;/span&gt; &lt;span class="err"&gt;語彙&lt;/span&gt; &lt;span class="n"&gt;WITH&lt;/span&gt; &lt;span class="err"&gt;重み&lt;/span&gt; &lt;span class="err"&gt;語彙&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;という構文で類似性検索をする。さらに、類似性評価に関しても触れている。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://hyperestraier.sourceforge.net/uguide-ja.html" title="User's Guide of Hyper Estraier Version 1 (Japanese)"&gt;User's Guide of Hyper Estraier Version 1 (Japanese)&lt;/a&gt;
&lt;blockquote&gt;類似度はベクトル空間モデルという考え方に基づいて算出されます。文書からキーワードを取り出してベクトルとして表現し、ベクトル同士のなす角の余弦を類似度とするものです。&lt;/blockquote&gt;&lt;/p&gt;
&lt;p&gt;余弦を類似度ってことはユークリッド距離でなくてコサイン距離を測ってるってことだな。つまり、プロファイル(波)の形の類似性を評価してるんだよね。図は&lt;a href="http://ja.openoffice.org/"&gt;OOoのCalc&lt;/a&gt;で(not Excel)。&lt;/p&gt;
&lt;p&gt;&lt;img alt="profile" src="http://www.kzfmix.com/images/blosxom/termprofile.png" /&gt;&lt;/p&gt;
&lt;p&gt;例えば、文書1と文書2は類似性が高い（とういか同一）だ。また、文書4のように一定の重みを均等に載せて直線としてプロファイルを定義してやっても、文書3みたいなOR検索でヒットしてしまうノイズは結構除ける。&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;SIMILAR&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;WITH&lt;/span&gt; &lt;span class="mi"&gt;10000&lt;/span&gt; &lt;span class="n"&gt;catalyst&lt;/span&gt; &lt;span class="n"&gt;WITH&lt;/span&gt; &lt;span class="mi"&gt;10000&lt;/span&gt; &lt;span class="n"&gt;plugin&lt;/span&gt; &lt;span class="n"&gt;WITH&lt;/span&gt; &lt;span class="o"&gt;\&lt;/span&gt;
&lt;span class="mi"&gt;10000&lt;/span&gt; &lt;span class="n"&gt;tagcloud&lt;/span&gt; &lt;span class="n"&gt;WITH&lt;/span&gt; &lt;span class="mi"&gt;10000&lt;/span&gt; &lt;span class="n"&gt;markdown&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;実際に&lt;a href="http://blog.kzfmix.com/entry/1168517954"&gt;similar_entryプラグイン&lt;/a&gt;を上記のような検索式に変更したら、かなり精度が上がった気がする。重みが10000ってのは&lt;a href="/cgi-bin/estseek.cgi"&gt;blosxomのestseek.cgi&lt;/a&gt;の類似性検索の重みを眺めて適当に決めた。&lt;/p&gt;
&lt;h4&gt;Lingua::JA::Summarizeから語彙の重みを取り出す&lt;/h4&gt;
&lt;p&gt;重みを10000とかに決めうちしてしまっても結構使えそうなことはわかったんだけど、どうせなら&lt;a href="http://search.cpan.org/~kazuho/Lingua-JA-Summarize-0.06/lib/Lingua/JA/Summarize.pm"&gt;Lingua::JA::Summarize&lt;/a&gt;から重みを決定したい。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://search.cpan.org/~kazuho/Lingua-JA-Summarize-0.06/lib/Lingua/JA/Summarize.pm"&gt;ドキュメント&lt;/a&gt;読んでみたら、statsっていうメソッドで統計的なデータが求められるらしい。statsメソッドは、こんな感じでハッシュで返ってくる。&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nv"&gt;$VAR1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s"&gt;&amp;#39;r&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                   &lt;span class="s"&gt;&amp;#39;cost&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                   &lt;span class="s"&gt;&amp;#39;count&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                   &lt;span class="s"&gt;&amp;#39;weight&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;5.55555555555556&amp;#39;&lt;/span&gt;
                 &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="s"&gt;&amp;#39;forest&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="s"&gt;&amp;#39;cost&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="s"&gt;&amp;#39;count&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="s"&gt;&amp;#39;weight&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;55.5555555555556&amp;#39;&lt;/span&gt;
                      &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="s"&gt;&amp;#39;バギング&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                              &lt;span class="s"&gt;&amp;#39;cost&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                              &lt;span class="s"&gt;&amp;#39;count&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                              &lt;span class="s"&gt;&amp;#39;weight&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;11.1111111111111&amp;#39;&lt;/span&gt;
                        &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;cost*weightを利用すればよいような感じだけど、これは&lt;a href="http://nais.to/~yto/clog/2005-10-12-1.html"&gt;TFIDF&lt;/a&gt;の意味合いでよいのだろうか?&lt;br /&gt;
&lt;a href="http://nais.to/~yto/clog/2006-04-26-2.html"&gt;たつをの ChangeLog&lt;/a&gt;とか、&lt;a href="http://labs.cybozu.co.jp/blog/kazuho/archives/2006/04/summarize.php"&gt;奥 一穂のお仕事ブログ&lt;/a&gt;をよく読んでみると、それっぽくは使えるようだ。コメント欄など参考になった。&lt;/p&gt;
&lt;p&gt;CRFは&lt;a href="http://mecab.sourceforge.jp/"&gt;Mecabのサイト&lt;/a&gt;から論文たどれる。&lt;/p&gt;
&lt;p&gt;以下、参考資料&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.jtpa.org/archives/MeCab.pdf"&gt;MeCab 汎用日本語形態素解析エンジン&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.r.dl.itc.u-tokyo.ac.jp/~nakagawa/suri-GJK/model-langinfo5.ppt"&gt;「言語か数学か：. 計算機のパワーによる統計的言語処理」&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://chasen.org/~daiti-m/paper/naist-dlec2004-lmodel.pdf"&gt;言語モデル&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Lingua::JA::Summarizeの抽出語彙に重みをつけてHyper Estraierで類似性検索をする&lt;/h4&gt;
&lt;p&gt;Hyper EstraierもLingua::JA::Summarizeも大体解決したので後は実装するだけ。といっても&lt;a href="http://blog.kzfmix.com/entry/1168697376"&gt;以前作ったコード&lt;/a&gt;にちょっと手を加えrるだけ。重みを10で割ってるのは意味ない(気持ち的にそうしたかっただけ)&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;  &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;@keywords&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$s&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;keywords&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="n"&gt;minwords&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;maxwords&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$stat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$s&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;stats&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$query_keywords&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;[SIMILAR] &amp;quot;&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="o"&gt;\&lt;/span&gt;
    &lt;span class="nb"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot; &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;map&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;WITH &amp;quot;&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="o"&gt;\&lt;/span&gt; 
    &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$stat&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;cost&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nv"&gt;$stat&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;weight&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;\&lt;/span&gt;
    &lt;span class="s"&gt;&amp;quot; $_&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;@keywords&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;こんな感じでEstraier用のクエリを構築してあとはAPIつかって検索するだけ。blosxomの&lt;a href="http://blog.kzfmix.com/entry/1168517954"&gt;similar_entryプラグイン&lt;/a&gt;はこれで検索結果を表示するようにした。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;以下、メモ。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://search.cpan.org/~fimm/Lingua-EN-Summarize-0.2/Summarize.pm"&gt;Lingua::EN::Summarize&lt;/a&gt;
で&lt;a href="http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?DB=pubmed"&gt;pubmed&lt;/a&gt;のアブストラクトいじくるのも楽しいかも&lt;/li&gt;
&lt;li&gt;&lt;a href="http://search.cpan.org/~fimm/Lingua-EN-Summarize-0.2/Summarize.pm"&gt;Lingua::EN::Summarize&lt;/a&gt;と&lt;a href="http://search.cpan.org/~anonwb/WWW-Patent-Page-0.09/lib/WWW/Patent/Page.pm"&gt;WWW::Patent::Page&lt;/a&gt;とか組み合わせてもよさそう。&lt;/li&gt;
&lt;li&gt;&lt;a href="http://search.cpan.org/~kazuho/Lingua-JA-Summarize-0.06/lib/Lingua/JA/Summarize.pm"&gt;Lingua::JA::Summarize&lt;/a&gt;などでの特徴語とSBSのタグってどういう関係になるんだろうか?気になる。&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Sat, 13 Jan 2007 22:51:13 +0919</pubDate><category>hyperestraier</category></item></channel></rss>