phpで全文検索エンジンをつくるまで

36
PHPで全文検索エンジンをつくるまで @masayuki5160 14123日水曜日

Upload: masayuki-tanaka

Post on 09-Jul-2015

1.472 views

Category:

Software


1 download

DESCRIPTION

PHPで全文検索エンジンをつくるまで

TRANSCRIPT

Page 1: PHPで全文検索エンジンをつくるまで

PHPで全文検索エンジンをつくるまで@masayuki5160

14年12月3日水曜日

Page 2: PHPで全文検索エンジンをつくるまで

はじめに

以前から検索エンジンをつくってみたいなーと思っていて、やっとつくれました。やはり面白い分野だったんですが、かなり広範な知識が必要でした。でも大学でちゃんと習ったことばかりだったという、、先生方すいませんw

そんな話をつらつらまとめます。難しい話ではないです。今まで縁がなかった人向けに少しだけまとめます。

PHPを選択しているのはPHPならわかる人多いよね、という理由です。

14年12月3日水曜日

Page 3: PHPで全文検索エンジンをつくるまで

本資料の対象者

こんな人に向けて話します。

• 全文検索エンジンなにそれ?

• PHPしかわからんけど、興味ある!

• 独学したけど、挫折しちゃった。。

詳しい方はぜひ間違ってる点など指摘頂けると助かります!

14年12月3日水曜日

Page 4: PHPで全文検索エンジンをつくるまで

アジェンダ

1. 全文検索エンジンを作ってみるまで

(1) 自然言語処理

(2) クローラー

2. 全文検索エンジンの開発(Mecabを使用)

(1) 概要

(2) 実際のソース

3. 全文検索エンジンをつくってみて

14年12月3日水曜日

Page 5: PHPで全文検索エンジンをつくるまで

アジェンダ

検索エンジン

自然言語処理

クローラ

それぞれ検索エンジンをつくるために必要な知識。でも、異なる分野だったりするのでややこい。さらに人工知能の話もここに絡んできたりすることもあるのでさらにとっつきにくく見えます。

14年12月3日水曜日

Page 6: PHPで全文検索エンジンをつくるまで

んじゃはじめます。

まずは自然言語処理のお話から。

14年12月3日水曜日

Page 7: PHPで全文検索エンジンをつくるまで

1-(1) 自然言語処理

ヒトが日常話している言葉をコンピュータに認識させる処理、技術のこと。ちょっと考えればわかるけど、これってすごい大変。たとえば、

• 英語、日本語... など言語はいっぱい

• それぞれの言語で文法違うよね

検索エンジンを作るときにはこれをクリアする必要がある。まずは基本から、ということで"わかち書き"のお話し。

14年12月3日水曜日

Page 8: PHPで全文検索エンジンをつくるまで

1-(1) 自然言語処理

• わかち書き

語の区切りに空白をはさんで記述することをわかち書きといいます。つまり 日本語はわかち書き、英語は違いますね。英語はわかち書きではないので、空白をつかえば語を区切っていくことが容易にできそうですね。

でも日本語は、、うまく語を区切ると難しいですよね。

というわけで形態素解析のお話しにいきましょう。

14年12月3日水曜日

Page 9: PHPで全文検索エンジンをつくるまで

1-(1) 自然言語処理

• 形態素解析

さあ困った、ということで日本語の文法の知識(文法のルールの集まり)や辞書(品詞等の情報付きの単語リスト)を情報源として用い形態素(日本語で意味を持つ最小単位)に分割することを"形態素解析"といいます。

形態素解析をするとどうなるか、こんな感じです。

※Mecabを使用したサンプルです. Mecabについては後述.

14年12月3日水曜日

Page 10: PHPで全文検索エンジンをつくるまで

1-(1) 自然言語処理

形態素解析する文章

Mecabのテストです

14年12月3日水曜日

Page 11: PHPで全文検索エンジンをつくるまで

1-(1) 自然言語処理

これを形態素解析してみると、、

14年12月3日水曜日

Page 12: PHPで全文検索エンジンをつくるまで

1-(1) 自然言語処理

Mecab => 名詞,固有名詞,組織,,,,

の => 助詞,連体化,,,,,の,ノ,ノ

テスト => 名詞,サ変接続,,,,,テスト,テスト,テスト

です => 助動詞,,,*,特殊・デス,基本形,です,デス,

デス

14年12月3日水曜日

Page 13: PHPで全文検索エンジンをつくるまで

1-(1) 自然言語処理

形態素に分割されてますね!

14年12月3日水曜日

Page 14: PHPで全文検索エンジンをつくるまで

1-(1) 自然言語処理

ということで形態素解析をすることで日常話している言葉をコンピュータに認識させることできそうですね。

でも形態素解析のプログラムなんてつくってたら大変だ~、、ということで先ほどでてきた"Mecab"の紹介。

14年12月3日水曜日

Page 15: PHPで全文検索エンジンをつくるまで

1-(1) 自然言語処理

• Mecab

オープンソースの日本語形態素解析エンジンで品詞情報を利用した解析・推定を行うことができます。MeCabはGoogleが公開した大規模日本語n-gramデータの作成にも使用されています。

セットアップもけっこう簡単。インストール手順については下記を参照。

MecabをEC2上にインストールする

14年12月3日水曜日

Page 16: PHPで全文検索エンジンをつくるまで

1-(1) 自然言語処理

• まとめ

自然言語処理のざっくり基本的なお話しはこの程度で。

今回はMecabを使用した全文検索エンジンを実装する前提でしたので形態素解析のお話しのみ駆け足でしましたが、もちろん分かち書きの言語を分割するのは別の方法もあります(n-gram解析など)。

奥が深い分野ですのでぼくもまだまだ勉強中。。

14年12月3日水曜日

Page 17: PHPで全文検索エンジンをつくるまで

んで次はクローラーのお話!

14年12月3日水曜日

Page 18: PHPで全文検索エンジンをつくるまで

1-(2) クローラー

クローラーとは、Webページから自動で情報収集するプログラムのこと。たとえば、

• Googleの検索エンジン

• マーケティング分析で使用するためにSNSの書き込みを収集するプログラム

• 特定のサイトをチェックにいくプログラム

など。意外に身近でお世話になってるものばかりですよね。

14年12月3日水曜日

Page 19: PHPで全文検索エンジンをつくるまで

1-(2) クローラー

んじゃどう実装してるの、てなりますが実際にみてみるのが早いと思いますので今回は下記2例を紹介します。

• Wgetでクローラー

• Twitterのクローリング(API経由)

というわけでお話をしていきますが、 クローラーは設定次第で短時間に大量のリクエストを任意のサービス、サーバにおくることになります。そのあたりをしっかり理解して実装していってください。

14年12月3日水曜日

Page 20: PHPで全文検索エンジンをつくるまで

1-(2) クローラー

• Wgetでクローラー

Wgetはなにかしらのサーバセットアップするときに使用したことあるかと思います。有名なダウンローダーですね。

$ wget http://hogehoge/test.txt

て感じで気軽にダウンロードできますよね。このWgetがなんでクローラーかというと、再帰ダウンロード機能があるから!

14年12月3日水曜日

Page 21: PHPで全文検索エンジンをつくるまで

1-(2) クローラー

• Wgetでクローラー

“再帰ダウンロード”とは任意のページ内のURLリンク先もダウンロードするよ、てこと。使い方はこんな感じ。

$ wget -r -l2 http://hogehoge/test.html

“-r”が再帰ダウンロードすることを指定し、-l(数字)で最初のページからリンク先を辿る回数を指定します。(幅優先探索ですね)

14年12月3日水曜日

Page 22: PHPで全文検索エンジンをつくるまで

1-(2) クローラー

• Wgetでクローラー

というわけで、“再帰ダウンロード”のおかげで、WgetはダウンロードしたHTMLを解析してリンク抽出まで可能なのでWgetは立派なクローラーとして機能しそうですね。

ぜひ試しにWgetでクローリングしてみてください!

さて次はTwitterのクローリングのお話。

14年12月3日水曜日

Page 23: PHPで全文検索エンジンをつくるまで

1-(2) クローラー

• Twitterのクローリング

Wgetを使ったクローリングで気づいたと思いますが、クローラーを作るときに必要なのがHTMLの解析処理。でも今回は下記理由からAPI経由でのクローリングを行います。

• HTML解析はやっぱり手間

• サイトがかわったら解析処理の修正もいる

• HTMLだと収集可能なデータが限定(Twitterの場合)

14年12月3日水曜日

Page 24: PHPで全文検索エンジンをつくるまで

1-(2) クローラー

• Twitterのクローリング

というわけでTwitter APIを使用したクローラーを作るのですが、 Twitter APIを使用したドキュメントは数多くあるので詳細は割愛します。

ソースはこんな感じでできますのでぜひお試しください.

14年12月3日水曜日

Page 25: PHPで全文検索エンジンをつくるまで

1-(2) クローラー

• まとめ

なんとなく感じたと思いますが、クローラーはクローラーでまた別の分野、てくらい掘り下げるといろいろでてくる奥深いもの。

・どうクロールする?

・負荷は?

・ログイン画面とかあったらどないする?

とかね。いろいろ調べてみるとこれまたおもしろい。

14年12月3日水曜日

Page 26: PHPで全文検索エンジンをつくるまで

さて、やっと本題の全文検索エンジンのお話ですw

14年12月3日水曜日

Page 27: PHPで全文検索エンジンをつくるまで

2 全文検索エンジンの開発

やっとここまできましたw でもいままでの自然言語処理、クローラーの部分て全文検索エンジンを作りはじめるのに実は必要な知識だったりします。

で今回作ってみる全文検索エンジンですが、

• PHP

• MySQL

• Mecab

て環境でいきます。この方がイメージつく方多いのでいいかと思います。

14年12月3日水曜日

Page 28: PHPで全文検索エンジンをつくるまで

2-(1) 概要

• 概要図(検索するとき)

PHPサーバ MySQL

検索ワードをGET送信

転置インデックスから検索

14年12月3日水曜日

Page 29: PHPで全文検索エンジンをつくるまで

2-(1) 概要

• 概要図(インデックスを作るとき)

PHPサーバ(Mecabでの形態素解析)

MySQL・解析対象ドキュメントを格納・転置インデックスを格納

ポイントは”転置インデックス”

14年12月3日水曜日

Page 30: PHPで全文検索エンジンをつくるまで

2-(1) 概要

• 転置インデックス

ざっくりいうと"本の索引"みたいなもの。はてなキーワード"転置インデックス"の説明がわかりやすい。例えば下記のようなものが転置インデックス。

単語 ドキュメントIDPearl 1, 2, 304 ...Perl 1, 5, 10, 12, 15 ...

Python 5, 10, 32 ...

14年12月3日水曜日

Page 31: PHPで全文検索エンジンをつくるまで

2-(1) 概要

• 転置インデックス

転置インデックスのテーブルを作成しておくことで検索したいワードがきまればそれに紐づくドキュメントはすぐわかるよね、ということです。

で、このテーブル"転置インデックス"をつくるために前述の形態素解析(Mecab)を使用していく、ということ。

14年12月3日水曜日

Page 32: PHPで全文検索エンジンをつくるまで

2-(2) 実際のソース

というわけで実際のソースはこんな感じでできます。

今回は前述のTwitterよりクローリングして取得したデータを全文検索できるよう転置インデックスを作成しています。下記のような感じで動作します。

14年12月3日水曜日

Page 33: PHPで全文検索エンジンをつくるまで

3 全文検索エンジンをつくってみて

もちろんここから改善するポイントもありますが、ここまでやったから興味がでてくることってけっこうあります。たとえば、

• OSSの全文検索エンジンてどうなってんの?

• 形態素解析してあつめたトークンをもとにテキストマイニングしてみたいよね

• もうひと踏ん張りすれば機械学習もいけるね

突っ込んで調べてみるとおもしろいと思います、ぜひ。

14年12月3日水曜日

Page 34: PHPで全文検索エンジンをつくるまで

おわりに

ざっくりの説明でしたが、それぞれ奥深い分野ですので突っ込んで調べてみると面白いと思います。

参考文献にも記載していますが、最近なぜか関連の良書がどんどんできてますのでそちらを読むとさらに理解も深まっていいかと思いますのでぜひー

14年12月3日水曜日

Page 35: PHPで全文検索エンジンをつくるまで

おわり!

14年12月3日水曜日

Page 36: PHPで全文検索エンジンをつくるまで

参考文献

• PHPによる機械学習(PHPで、ていうのがとっつきやすくいい本でした。Mecabについても詳しいです。)

• 検索エンジン自作入門~手を動かしながら見渡す検索の舞台裏(非常に難解ですが良書ですね。)

• Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例(クローラーのお話が詳しいかつRubyなのでよみやすいですね。あと実例が豊富なのもうれしい。)

• [Web開発者のための]大規模サービス技術入門(Perlでの全文検索エンジン開発の章があります。)

14年12月3日水曜日