2009年10月25日() << 前の日記 | 次の日記 >>
これまでの10月25日 編集

■1週末の過ごし方次の記事 >> このエントリーをはてなブックマークに追加

予定していた打ち合わせが無くなったので、この時間にオフになることが決まった。
折角の週末だから、家族サービスしておきたいが、何をするかな。

■ 関連記事

■2関連記事検索のデバッグ[hns]<< 前の記事 このエントリーをはてなブックマークに追加

昨日[http://www.nantoka.com/~kei/diary/?20091024&to=200910242#T200910242]フライドチキンの記事[http://www.nantoka.com/~kei/diary/?20091024&to=200910241#T200910241] で、関連記事が出てこないのがおかしいと気づいたので、デバッグしてみることにした。
関連記事検索は、 tf-idf[http://ja.wikipedia.org/wiki/Tf-idf] に、単語の長さや構成文字を基にした係数を掛けたものを使っているのですが、まず、 フライドチキンの記事[http://www.nantoka.com/~kei/diary/?20091024&to=200910241#T200910241] でのTFと係数を確認してみる。
nikki=# SELECT keyword, SUM(idf * score) AS tf
 FROM article, keywords, keywordlist, keywordidf
 WHERE
      article.id = keywords.article_id
  AND keywords.keyword_id = keywordlist.id
  AND keywords.keyword_id = keywordidf.keyword_id
  AND nikki_date = '2009-10-24'
  AND article_no = 1
 GROUP BY keywordlist.id, keyword
 ORDER BY tf DESC, keywordlist.id
 LIMIT 20;
       keyword        |        tf
----------------------+------------------
 フライドチキン       | 26.7149831502022
 ウイスキー           | 22.0210056597938
 チキン               | 19.0775761355412
 チューリップ         | 18.7641749203457
 手羽                 |  14.800030254366
 フライ               | 11.6098572215477
 チキンコルドンブルー | 10.7105371331685
 パン粉               | 9.96949422252275
 バスケット           | 8.92901630926261
 ハイボール           | 8.92901630926261
 バリエーション       | 8.39633371310052
 サントリー           | 8.13467576459694
 中華                 |  7.9603645104895
 ニッカ               | 7.73729569284771
 水                   | 7.43782102731242
 南蛮                 | 6.89175645936501
 コショウ             | 6.65943587933492
 仕上げ               | 6.64632948168183
 鶏                   | 6.58386048611456
 ブランド             | 6.29698286894017
(20 行)
これを見る限り、キーワード抽出はできていそう。
関連記事を抽出してみると、
SELECT t.nikki_date, t.article_no, t.title, SUM(i.idf * kl.score)
 FROM article AS t, article AS f, keywords AS kt, keywords AS kf, keywordidf AS i, keywordlist AS kl
 WHERE
      kt.keyword_id = kf.keyword_id
  AND kt.keyword_id = i.keyword_id
  AND kt.keyword_id = kl.id
  AND kf.article_id = f.id
  AND kt.article_id = t.id
  AND kt.article_id <> kf.article_id
  AND kt.is_top_a = true
  AND kf.is_top_a = true
  AND f.nikki_date = '2009-10-24'
  AND f.article_no = 1
 GROUP BY t.nikki_date, t.article_no, t.title
 ORDER BY SUM(i.idf * kl.score) DESC, t.nikki_date DESC, t.article_no
 LIMIT 20;
 nikki_date | article_no |         title          |       sum
------------+------------+------------------------+------------------
 2009-10-25 |          2 | 関連記事検索のデバッグ | 17.2882571048631
(1 行)
と、この記事しか出てこない。
キーワード「フライドチキン」を含む記事は、他にもあるはずと思って、namazuで検索すると、 この記事[http://www.nantoka.com/~kei/diary/?20050721&to=200507211#T200507211] が該当するので、この記事のキーワードを出力させてみると、
nikki=# SELECT keyword, SUM(idf * score) AS tf
 FROM article, keywords, keywordlist, keywordidf
 WHERE
      article.id = keywords.article_id
  AND keywords.keyword_id = keywordlist.id
  AND keywords.keyword_id = keywordidf.keyword_id
  AND nikki_date = '2005-07-21'
  AND article_no = 1
 GROUP BY keywordlist.id, keyword
 ORDER BY tf DESC, keywordlist.id
 LIMIT 10;
    keyword     |        tf
----------------+------------------
 map            | 5.39923757027701
 136            | 4.87010409776545
 ウオッ         |  4.4648073217977
 2500           | 4.28534718647156
 フライドチキン | 4.19842599961785
 愛知           | 3.88369534940785
 ごはん         | 3.87365236116891
 壱番屋         | 3.86885297764766
 フィット       | 3.82346161453322
 カナル         | 3.52469145626482
(10 行)
確かに入っている。ということは、関連記事を探すクエリに問題がありそうだ。
実は、tf-idfをそのまま使うと、当該の記事では注目されていない単語なのに、相手の記事での出現回数によって上位のスコアを得てしまうという現象があって、これに対処するために足きりを設けているのだが、これが悪さをしているのでは無いかと思って、調べてみた。
nikki=# SELECT keyword, SUM(idf * score) AS tf, is_top_a, article_id
 FROM article, keywords, keywordlist, keywordidf
 WHERE
      article.id = keywords.article_id
  AND keywords.keyword_id = keywordlist.id
  AND keywords.keyword_id = keywordidf.keyword_id
  AND nikki_date = '2009-10-24'
  AND article_no = 1
 GROUP BY keywordlist.id, keyword, is_top_a, article_id
 ORDER BY tf DESC, keywordlist.id
 LIMIT 10;
    keyword     |        tf        | is_top_a | article_id
----------------+------------------+----------+------------
 フライドチキン | 25.1905559977071 | f        |       2687
 ウイスキー     | 21.2552644018479 | f        |       2687
 チキン         | 18.7477481006029 | f        |       2687
 手羽           | 14.1647925793949 | f        |       2687
 チューリップ   | 12.8219076117393 | f        |       2687
 フライ         | 11.3454736539966 | f        |       2687
 パン粉         | 9.54158980464597 | f        |       2687
 バリエーション |  8.0359515101913 | f        |       2687
 中華           |   7.756388653075 | f        |       2687
 サントリー     | 7.67048978541913 | f        |       2687
(10 行)
is_top_aがtrueのキーワードだけが使用されることになっているので、これでは検索結果に出てこないはずだ。
is_top_aは、各キーワードを、文字数と構成文字種から得た係数で補正済みのtfの降順に並べて、上位15ワードを選択するようになっている。コード断片は以下の様な感じだ。
UPDATE keywords SET is_top_a = true WHERE id IN (
 SELECT
    MIN(keywords.id)
  FROM
     keywordlist
   , keywordidf
   , keywords
  WHERE
       keywordlist.id = keywords.keyword_id
   AND keywordlist.id = keywordidf.keyword_id
   AND keywords.article_id = [article_id]
  GROUP BY
     keyword
   , keywordidf.idf * score
  ORDER BY
     keywordidf.idf * score DESC
  LIMIT 1
);
これを掛けなおしてやったら、フライドチキンつながりの記事は表示されるようになった。現状、インデックス生成はバックグラウンドでやらせているのだけれども、記事更新のタイミングと絡んで、排他処理にミスがあるのかも知れない。
あと、top15という抽出が狭すぎる感じがしたので微調整してみる。

■ 関連記事

今日のつぶやき

以上、1 日分です。

指定日の日記を表示

前月 2009年10月 翌月
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

最近の日記

2019年04月01日

新元号「令和」について

2019年03月23日

DXアンテナ ワイヤレスチューナー メディアコンセント DMC10F1

2019年02月17日

#例のグラボを活用する

2019年01月03日

シリーズ5・myHomeAlexaで自分のCDをかける

2018年12月25日

シリーズ4・英語の楽曲・アルバム・アーティスト名をカタカナに直す

2018年12月23日

シリーズ3: Echo Dotがやってきた

2018年12月19日

続・Echo Dotがやってきた

分野別タイトル一覧


全て
CLIP
SYA!nikki
book
freebsd
hns
magic
おさけ
おしごと
お買いもの
ぐる
ごはん
アクセシビリティ
オープンソース
セキュリティ
音楽
地域情報化
電子自治体
日記

keikuma on Twitter

keikuma Name:前田勝之
Location:長崎市
Web:http://www.nantok...
Bio:前田勝之(まえだかつゆき)。長崎在住。コンサル、SE、プログラマー、 なんとか株式会社代表、非常勤講師(情報セキュリティ)。 セキュアド、テクニカルエンジニア(SV,NW)。サーバ管理とWeb日記を10年ほど。 ネットとリアルの接点に関心あり。食べること・歌うこと・愛すること・作ること・飲むこと。おいしいものがぜんぶすき。

サイト内検索

Google AdSense

Powered by hns-2.19.9, HyperNikkiSystem Project