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) 概要 
• 転置インデックス 
ざっくりいうと"本の索引"みたいなもの。はてなキーワ 
ード"転置インデックス"の説明がわかりやすい。例えば 
下記のようなものが転置インデックス。 
単語ドキュメントID 
Pearl 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日水曜日

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

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