Groongaで学ぶ全文検索 2015-11-06 に参加した

cf. https://groonga.doorkeeper.jp/events/33701

2回連続欠席からの、渋谷開催に参加しました。

本日のテーマ

精度

精度 is ... ?

出席者のイメージは以下

  • ユーザの満足度
  • 思ったものが探せているかの度合い
  • もれなくさがせているか
  • ゴミがない

再現率と適合率

精度について論じると、再現率と適合率という話がよく出る。

  • 再現率:答えを返せた割合
    ハズレがあっても割合には影響しない
    キーワードにマッチする文書が3つあったら、答えに3つ含まれていれば 100%.

  • 適合率:答えた内容にどれだけ正しい内容を含んでいるか
    あてずっぽうで返すと適合率が低くなる

この 2 つはどちらかを上げるとどちらかが下がる関係にある
ex. 全文書返せば再現率 100% だがゴミが多いので適合率は下がる

どちらが重要、重視するかは 何のための検索なのか 、使い方による
ex. 特許検索は適合率より再現率が重要

とは言え ... 結果のすべてを利用者が精査するわけではなく、
結果上位で判断することがほとんどなので、現実的に重視されるべきは スコアづけ である。

スコアづけの考え方

  • TF(Term Frequency):単語出現回数
  • TFIDF(= TF inverted DF = TF/DF)
    • DF(Document Frequency):(単語が含まれる)ドキュメント数

TFIDF は AND 検索、OR 検索におけるスコアづけに用いられる考え方。
TF が同値だった場合、DF が大きい値のキーワードより、DF が小さい値のキーワードのドキュメントが高スコアとして扱われる

教科書的には上記 2 つがよく用いられるが、他にもタグや位置情報といったメタデータを加味することで
(検索対象、用途によっては)より精度の高い結果が得られる

Groongaで学ぶ全文検索 2015-10-02 に参加した

cf. https://groonga.doorkeeper.jp/events/31859

どう使うか見てみよう !

参加者全員から「今の知識」と「どういう知識をつけられたらうれしいか」を聞いて内容を決め た結果を反映し
今日は使ってみる !
受講者は Rails が身近だということで、講師のチョイスで題材は Mroonga となった。

シンプルに全文検索

Rails + MySQL で、全文検索してみる。LIKE 検索である。
LIKE 検索を全文検索だと捉えたことがなかったので新鮮だった。

MySQL では LIKE 検索を逐次検索として処理する。
このため、検索対象が増えると遅くなる
検索エンジン考えるとき、検索に 1 秒かかるかどうかがひとつの判断基準)

閑話休題

MySQL との接続でトラブルあったが、以下で解消。
Rails mysql2でrake db:createがエラー問題 - Qiita

では、全文検索 !

Mroonga インストール。Mac OS X なら homebrew でインストールできる。

brew install https://raw.github.com/mroonga/homebrew/master/mroonga.rb --use-homebrew-mysql

インストールが済んだら、MySQL のストレージエンジンを Mroonga へ差し替える。
InnoDB へ Add-On するようなイメージを勝手にもっていたが
Mroonga は ストレージエンジン なので 差し替え になる。

ALTER TABLE table_name ENGINE = mroonga
  • インデックス作成
    • RDBMS と同じにインデックス張るだけ。
CREATE FULLTEXT INDEX index_name ON table_name(column_name, ...)
  • MySQL全文検索構文で問い合わせる(MATCH AGAINST)
    • MySQL の構文は面倒い、トノコト
      • 下記、...A B C と入れると、AND 検索としてほしいところだが A OR B OR C の解釈で全文検索される。
        AND 検索させたいなら +A +B +C となる。
SELECT * FROM table_name WHERE MATCH(column_name) AGAINST("..." IN BOOLEAN MODE)

まとめ

  • LIKE 検索も全文検索である
  • Mroonga は全文検索が得意なストレージエンジンである
  • 今回、コーディングは がく さんが行ってくれました。さすがよちよチスト。ありがとうございました。

Groongaで学ぶ全文検索 2015-09-18 に参加した

cf. https://groonga.doorkeeper.jp/events/31604

全文検索概要説明

input と output

"何かの仕組みを考えるときは input と output で考える"

  • input
    • クエリ
    • キーワード
  • output
    • マッチした文書

探し方について

"検索対象文書を頭から検索する" のは効率が悪い
"辞書他書籍にあるような、索引 (index) " が効率を上げる手助けをする
検索エンジンはあらかじめ index を作っておくことで検索性能の向上を図っている
groonga は index をリアルタイムにつくる(そこが強み!)

では、index をどうやってつくるか

単純化のため、英語を例に考えると、空白区切りで単語を切り出し、
頭文字をキーとする index を作ればよい。
index 自体の構造も検索しやすいように作らないと、ボトルネックになる。
Groonga では検索対象が増えても遅くなりにくいのでバイナリサーチしている。
イナリサーチするにはキーが何らかのルールで順序づけられることが前提となる。

性能という点ではハッシュ構造も挙げられるが
隣接するキーをも検索するようなケースには不向きとなる。
完全一致の検索(タグでの検索など)にはハッシュ構造が向いている。
実際のところ、隣接するキーも検索できることが求められるケース(前方一致など)が多い。

講座「アジャイルサムライの見積りと計画づくり」を受講しました

2014年3月7日(金)アジャイルアカデミーの講座「アジャイルサムライの見積りと計画づくり」を受講しました。 アジャイルアカデミーは「現場ですぐに取り入れられること」を重視した一日集中ワークショップ講座で構成されており、過去3回(3期)開催されています。 くわしくはこちら->トップ:アジャイルアカデミー

講座は講師と受講者の自己紹介の後、受講者のアジャイル実践度合いを確認することから始まりました。 今回は「自身の現場は非アジャイル。これから導入していきたい」という受講者が60%くらい。

「ワークショップは参加者同士で話し合うことも大事。黙っていたらダメ! 声出していこー!!」と アジャイル開発について思うことを書き出し、共有しました。 カテゴライズすると、

  • 理念
  • あるべき姿
  • 導入
  • チームビルディング
  • 育成

受講者それぞれが、会社ではまとめる/ひっぱる立場にあることを感じる内容でした。 午前の部は「使う人に価値のあるものを作ることが大事」というアジャイルの理念を講師が確認して終了です。

午後は受講者がチームとなって

  • 計画
  • 実施
  • ふりかえり

を体験できる「紙ヒコーキを飛ばそう」に取り組みました。 4イテレーション実施しましたが、イテレーションを重ねるごとに 見積り精度も上がり、実績も向上。ふりかえりでも様々なアイデアが出ました。 オトナが真剣に紙ヒコーキ飛ばしに熱中した、貴重な時間にもなりました。

ソフトウェア開発の見積りは、紙ヒコーキほどシンプルではないけれど

  • 「相対」見積りなのだから、ポイントは大中小がわかればよい

一方、私も含め、受講者が疑問に思っていた「不確実性のコーン」への対応については アジャイルの文脈からは外れるとのことでしたが、講師の経験談から

  • 「わかること」と「わからないこと」の腑分けをし、見積りに幅をもたせること

で一定の対応をしてきた、とのアドバイスをいただきました。

また、「わからないからやってみよう、アジャイルだし」も度が過ぎると問題であり

  • 要件が詰まっているか
  • 完了条件が明確かつ共有されているか

以上のような、着手可能 (=Ready) であるかが大事であるとし 総括として、チームで取り組み、チームとして終わらせることが大事と締めくくられました。

講座タイトルこそ「見積りと計画」とありますが、 アジャイルに関して興味/疑問があれば、迷わず受講してみるとよいと思います。 受講の際は「現場の困りごと」を持参すると、なおよいでしょう。講師の大好物だそうですよ。