phpで全文検索エンジンをつくるまで
DESCRIPTION
PHPで全文検索エンジンをつくるまでTRANSCRIPT
PHPで全文検索エンジンをつくるまで@masayuki5160
14年12月3日水曜日
はじめに
以前から検索エンジンをつくってみたいなーと思っていて、やっとつくれました。やはり面白い分野だったんですが、かなり広範な知識が必要でした。でも大学でちゃんと習ったことばかりだったという、、先生方すいませんw
そんな話をつらつらまとめます。難しい話ではないです。今まで縁がなかった人向けに少しだけまとめます。
PHPを選択しているのはPHPならわかる人多いよね、という理由です。
14年12月3日水曜日
本資料の対象者
こんな人に向けて話します。
• 全文検索エンジンなにそれ?
• PHPしかわからんけど、興味ある!
• 独学したけど、挫折しちゃった。。
詳しい方はぜひ間違ってる点など指摘頂けると助かります!
14年12月3日水曜日
アジェンダ
1. 全文検索エンジンを作ってみるまで
(1) 自然言語処理
(2) クローラー
2. 全文検索エンジンの開発(Mecabを使用)
(1) 概要
(2) 実際のソース
3. 全文検索エンジンをつくってみて
14年12月3日水曜日
アジェンダ
検索エンジン
自然言語処理
クローラ
それぞれ検索エンジンをつくるために必要な知識。でも、異なる分野だったりするのでややこい。さらに人工知能の話もここに絡んできたりすることもあるのでさらにとっつきにくく見えます。
14年12月3日水曜日
んじゃはじめます。
まずは自然言語処理のお話から。
14年12月3日水曜日
1-(1) 自然言語処理
ヒトが日常話している言葉をコンピュータに認識させる処理、技術のこと。ちょっと考えればわかるけど、これってすごい大変。たとえば、
• 英語、日本語... など言語はいっぱい
• それぞれの言語で文法違うよね
検索エンジンを作るときにはこれをクリアする必要がある。まずは基本から、ということで"わかち書き"のお話し。
14年12月3日水曜日
1-(1) 自然言語処理
• わかち書き
語の区切りに空白をはさんで記述することをわかち書きといいます。つまり 日本語はわかち書き、英語は違いますね。英語はわかち書きではないので、空白をつかえば語を区切っていくことが容易にできそうですね。
でも日本語は、、うまく語を区切ると難しいですよね。
というわけで形態素解析のお話しにいきましょう。
14年12月3日水曜日
1-(1) 自然言語処理
• 形態素解析
さあ困った、ということで日本語の文法の知識(文法のルールの集まり)や辞書(品詞等の情報付きの単語リスト)を情報源として用い形態素(日本語で意味を持つ最小単位)に分割することを"形態素解析"といいます。
形態素解析をするとどうなるか、こんな感じです。
※Mecabを使用したサンプルです. Mecabについては後述.
14年12月3日水曜日
1-(1) 自然言語処理
形態素解析する文章
Mecabのテストです
14年12月3日水曜日
1-(1) 自然言語処理
これを形態素解析してみると、、
14年12月3日水曜日
1-(1) 自然言語処理
Mecab => 名詞,固有名詞,組織,,,,
の => 助詞,連体化,,,,,の,ノ,ノ
テスト => 名詞,サ変接続,,,,,テスト,テスト,テスト
です => 助動詞,,,*,特殊・デス,基本形,です,デス,
デス
14年12月3日水曜日
1-(1) 自然言語処理
形態素に分割されてますね!
14年12月3日水曜日
1-(1) 自然言語処理
ということで形態素解析をすることで日常話している言葉をコンピュータに認識させることできそうですね。
でも形態素解析のプログラムなんてつくってたら大変だ~、、ということで先ほどでてきた"Mecab"の紹介。
14年12月3日水曜日
1-(1) 自然言語処理
• Mecab
オープンソースの日本語形態素解析エンジンで品詞情報を利用した解析・推定を行うことができます。MeCabはGoogleが公開した大規模日本語n-gramデータの作成にも使用されています。
セットアップもけっこう簡単。インストール手順については下記を参照。
MecabをEC2上にインストールする
14年12月3日水曜日
1-(1) 自然言語処理
• まとめ
自然言語処理のざっくり基本的なお話しはこの程度で。
今回はMecabを使用した全文検索エンジンを実装する前提でしたので形態素解析のお話しのみ駆け足でしましたが、もちろん分かち書きの言語を分割するのは別の方法もあります(n-gram解析など)。
奥が深い分野ですのでぼくもまだまだ勉強中。。
14年12月3日水曜日
んで次はクローラーのお話!
14年12月3日水曜日
1-(2) クローラー
クローラーとは、Webページから自動で情報収集するプログラムのこと。たとえば、
• Googleの検索エンジン
• マーケティング分析で使用するためにSNSの書き込みを収集するプログラム
• 特定のサイトをチェックにいくプログラム
など。意外に身近でお世話になってるものばかりですよね。
14年12月3日水曜日
1-(2) クローラー
んじゃどう実装してるの、てなりますが実際にみてみるのが早いと思いますので今回は下記2例を紹介します。
• Wgetでクローラー
• Twitterのクローリング(API経由)
というわけでお話をしていきますが、 クローラーは設定次第で短時間に大量のリクエストを任意のサービス、サーバにおくることになります。そのあたりをしっかり理解して実装していってください。
14年12月3日水曜日
1-(2) クローラー
• Wgetでクローラー
Wgetはなにかしらのサーバセットアップするときに使用したことあるかと思います。有名なダウンローダーですね。
$ wget http://hogehoge/test.txt
て感じで気軽にダウンロードできますよね。このWgetがなんでクローラーかというと、再帰ダウンロード機能があるから!
14年12月3日水曜日
1-(2) クローラー
• Wgetでクローラー
“再帰ダウンロード”とは任意のページ内のURLリンク先もダウンロードするよ、てこと。使い方はこんな感じ。
$ wget -r -l2 http://hogehoge/test.html
“-r”が再帰ダウンロードすることを指定し、-l(数字)で最初のページからリンク先を辿る回数を指定します。(幅優先探索ですね)
14年12月3日水曜日
1-(2) クローラー
• Wgetでクローラー
というわけで、“再帰ダウンロード”のおかげで、WgetはダウンロードしたHTMLを解析してリンク抽出まで可能なのでWgetは立派なクローラーとして機能しそうですね。
ぜひ試しにWgetでクローリングしてみてください!
さて次はTwitterのクローリングのお話。
14年12月3日水曜日
1-(2) クローラー
• Twitterのクローリング
Wgetを使ったクローリングで気づいたと思いますが、クローラーを作るときに必要なのがHTMLの解析処理。でも今回は下記理由からAPI経由でのクローリングを行います。
• HTML解析はやっぱり手間
• サイトがかわったら解析処理の修正もいる
• HTMLだと収集可能なデータが限定(Twitterの場合)
14年12月3日水曜日
1-(2) クローラー
• Twitterのクローリング
というわけでTwitter APIを使用したクローラーを作るのですが、 Twitter APIを使用したドキュメントは数多くあるので詳細は割愛します。
ソースはこんな感じでできますのでぜひお試しください.
14年12月3日水曜日
1-(2) クローラー
• まとめ
なんとなく感じたと思いますが、クローラーはクローラーでまた別の分野、てくらい掘り下げるといろいろでてくる奥深いもの。
・どうクロールする?
・負荷は?
・ログイン画面とかあったらどないする?
とかね。いろいろ調べてみるとこれまたおもしろい。
14年12月3日水曜日
さて、やっと本題の全文検索エンジンのお話ですw
14年12月3日水曜日
2 全文検索エンジンの開発
やっとここまできましたw でもいままでの自然言語処理、クローラーの部分て全文検索エンジンを作りはじめるのに実は必要な知識だったりします。
で今回作ってみる全文検索エンジンですが、
• PHP
• MySQL
• Mecab
て環境でいきます。この方がイメージつく方多いのでいいかと思います。
14年12月3日水曜日
2-(1) 概要
• 概要図(検索するとき)
PHPサーバ MySQL
検索ワードをGET送信
転置インデックスから検索
14年12月3日水曜日
2-(1) 概要
• 概要図(インデックスを作るとき)
PHPサーバ(Mecabでの形態素解析)
MySQL・解析対象ドキュメントを格納・転置インデックスを格納
ポイントは”転置インデックス”
14年12月3日水曜日
2-(1) 概要
• 転置インデックス
ざっくりいうと"本の索引"みたいなもの。はてなキーワード"転置インデックス"の説明がわかりやすい。例えば下記のようなものが転置インデックス。
単語 ドキュメントIDPearl 1, 2, 304 ...Perl 1, 5, 10, 12, 15 ...
Python 5, 10, 32 ...
14年12月3日水曜日
2-(1) 概要
• 転置インデックス
転置インデックスのテーブルを作成しておくことで検索したいワードがきまればそれに紐づくドキュメントはすぐわかるよね、ということです。
で、このテーブル"転置インデックス"をつくるために前述の形態素解析(Mecab)を使用していく、ということ。
14年12月3日水曜日
2-(2) 実際のソース
というわけで実際のソースはこんな感じでできます。
今回は前述のTwitterよりクローリングして取得したデータを全文検索できるよう転置インデックスを作成しています。下記のような感じで動作します。
14年12月3日水曜日
3 全文検索エンジンをつくってみて
もちろんここから改善するポイントもありますが、ここまでやったから興味がでてくることってけっこうあります。たとえば、
• OSSの全文検索エンジンてどうなってんの?
• 形態素解析してあつめたトークンをもとにテキストマイニングしてみたいよね
• もうひと踏ん張りすれば機械学習もいけるね
突っ込んで調べてみるとおもしろいと思います、ぜひ。
14年12月3日水曜日
おわりに
ざっくりの説明でしたが、それぞれ奥深い分野ですので突っ込んで調べてみると面白いと思います。
参考文献にも記載していますが、最近なぜか関連の良書がどんどんできてますのでそちらを読むとさらに理解も深まっていいかと思いますのでぜひー
14年12月3日水曜日
おわり!
14年12月3日水曜日
参考文献
• PHPによる機械学習(PHPで、ていうのがとっつきやすくいい本でした。Mecabについても詳しいです。)
• 検索エンジン自作入門~手を動かしながら見渡す検索の舞台裏(非常に難解ですが良書ですね。)
• Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例(クローラーのお話が詳しいかつRubyなのでよみやすいですね。あと実例が豊富なのもうれしい。)
• [Web開発者のための]大規模サービス技術入門(Perlでの全文検索エンジン開発の章があります。)
14年12月3日水曜日