PHP Source Code Search
with
PHP

柄沢聡太郎 (sotarok)
http://nequal.jp/
twitter.com/sotarok
始める前に




   Copyright © nequal, Creative Commons Attribution-
                 Noncommercial 2.1 @ PHP Study #46.
今⽇はPHP勉強会




     Copyright © nequal, Creative Commons Attribution-
                   Noncommercial 2.1 @ PHP Study #46.
なぜ 9/29 ではないのか




        Copyright © nequal, Creative Commons Attribution-
                      Noncommercial 2.1 @ PHP...
懇親会はピザだって?




     Copyright © nequal, Creative Commons Attribution-
                   Noncommercial 2.1 @ PHP Study #46.
⾁はどうしたんですか




     Copyright © nequal, Creative Commons Attribution-
                   Noncommercial 2.1 @ PHP Study #46.
本来のPHP勉強会




            Copyright © nequal, Creative Commons Attribution-
                          Noncommercial 2.1 @ ...
PHPerは
⾁の精神を忘れ
 てしまったか
    Copyright © nequal, Creative Commons Attribution-
                  Noncommercial 2.1 @ PHP Stu...
ごめんなさい冗談です
gusagiさん幹事おつかれさまです




         Copyright © nequal, Creative Commons Attribution-
                       Noncom...
じこしょうかい
sotarok
•   そうたろう(けー)
•   プリン
•   プリン
•   プリン
•   pudding
•   プリン
•   ⾁
•   ごはん
•   自転⾞
•   写真 – Sony α 300
•   Ethna
•   ...
宣伝
• WikiHub
  – http://wikihub.org/
  – Git で⽂書管理して,それを Wiki 形式で整形して
    表⽰
  – GitHub の Service Hook で簡単同期
• 制限つきOpenBet...
宣伝2                     なぜか誰も
                        買ってこない
• プリンが好きです




             Copyright © nequal, Creative Comm...
宣伝2                      yuchimiriさんに
                        RTまでされたのに

• プリンが好きです




             Copyright © nequal, C...
検索エンジンとか
                         つくってるとこ!




 Preferred Infrastructure (PFI)
というところでインターンやってます




 だからか
        だからです
 ...
Agenda
•   検索エンジン
•   転置インデックス
•   クロールとキーワード抽出
•   スコアリングと並び替え
•   デモ
•   技術的な課題とか




               Copyright © nequal,...
検索エンジン
• キーワードを⼊⼒
 – → そのキーワードが含まれる(そして探したいと
   思われる)⽂書が探せる

• ソースコード検索
 –   grep
 –   gtags (GNU GLOBAL)
 –   trac + Hype...
grep
• 与えられたキーワードをファイルをたどり,⽂字
  列⼀致で探す
• 前処理が必要ない
• どこにでも⼊ってる


grepのデメリット
• 大量の⽂書から探すのは時間がかかる
  – 同じキーワードで再検索するときもまた同じ処理
...
検索エンジンを作る
• 既存のいろんなソフトウェアを使うのもいいけど
• 「検索エンジン」
 – そんな難しくない
 – PHPでもできる
 – カンタンだよ!

• 今回の目標
 – ローカルのPHPソースファイルからメソッドや関数
   や...
転置インデックス
転置インデックス
• キーワードから⽂書を逆引きできるようにあらか
  じめつくっておくインデックス

• 焼⾁ =>
  –   ⽜角
  –   Wikipedia – 焼⾁
  –   YAKINIQUEST - ヤキニクエスト
  – ...
※⽂書はフィクションです

⽂書1
I like Sushi, Yakiniku and pudding !

⽂書2
PHPer like Yakiniku. Maybe not like
Sushi.

⽂書3
Dankogai is an...
※⽂書はフィクションです

⽂書1
I like Sushi , Yakiniku and pudding !

⽂書2
PHPer like Yakiniku. Maybe not like
Sushi.

⽂書3
Dankogai is a...
Sushi          1




             ⽂書1
             I like Sushi, Yakiniku and pudding !
      ⽂書2
    PHPer like Yakiniku....
Sushi           1
 Yakiniku          1




             ⽂書1
             I like Sushi, Yakiniku and pudding !
      ⽂書2
  ...
Sushi           1
 Yakiniku          1
 pudding           1


             ⽂書1
             I like Sushi, Yakiniku and pud...
Sushi           1
 Yakiniku          1              2
 pudding           1


             ⽂書1
             I like Sushi, Y...
Sushi           1              2
 Yakiniku          1              2
 pudding           1


             ⽂書1
             ...
転置インデックスをPHPで
 • array でしょJK


$inverted_index = array(
    'miyazaki' => array(1, 2, 6, 4 ...),
    'aoi' => array(2, 6, ...
クロールとキーワード抽出
クロールとキーワード抽出

• 対象の⽂書からキーワードを拾い集める
• クローラー -> Google なら Google Bot とか

• キーワード ->
  – 空⽩区切りの⽂字列(英語圏のひと)
  – 形態素解析(明⽇ は あめ ...
クロールとキーワード抽出をPHPで(1)


•function crawl ($dirname)
   • foreach(glob($dirname . "/*") as $file)
      • if is_dir($file):
 ...
クロールとキーワード抽出をPHPで(2)

• キーワードの抽出
   – 関数名/メソッド名/クラス名/変数名
   – tokenizer を使う

• token_get_all
   • PHP
   •         tokeniz...
スコアリングと並び替え
スコアリングと並び替え
• なにかの基準で検索結果を並び替える
• あてはまりの良い⽂書を上に出す

• 普通の検索 なら
 – ページランク (Google のウェブ検索)
 – TF-IDF
     • ⽂書中の単語の出現頻度
     ...
スコアリングと並び替えをPHPで
• スコアはソースコード中のそのキーワードの出現
  数
• 多い順に並び替え
                                PHP 5.3 なら
                      ...
デモ


Hyper Pudding
http://gist.github.com/192879
技術的な課題
• デモったやつは全部 on memory
  – 大規模⽂書はイケない
    • symfony で 140MB くらい⾷うかな
  – ということで,転置インデックスを外部ファイル
    (Key-Value Store....
まとめ
• 簡単な検索エンジンはPHPでもつくれる
 – それもお⼿軽に
• インデックスをあらかじめつくっておけば検索は
  瞬時にできる
• 検索技術とか楽しい




             Copyright © nequal, Cr...
ありがとうございました



Question?
Upcoming SlideShare
Loading in...5
×

PHP Source Code Search with PHP

2,902

Published on

@PHP勉強会#46
ソース検索をPHPでつくる

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,902
On Slideshare
0
From Embeds
0
Number of Embeds
8
Actions
Shares
0
Downloads
14
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

PHP Source Code Search with PHP

  1. 1. PHP Source Code Search with PHP 柄沢聡太郎 (sotarok) http://nequal.jp/ twitter.com/sotarok
  2. 2. 始める前に Copyright © nequal, Creative Commons Attribution- Noncommercial 2.1 @ PHP Study #46.
  3. 3. 今⽇はPHP勉強会 Copyright © nequal, Creative Commons Attribution- Noncommercial 2.1 @ PHP Study #46.
  4. 4. なぜ 9/29 ではないのか Copyright © nequal, Creative Commons Attribution- Noncommercial 2.1 @ PHP Study #46.
  5. 5. 懇親会はピザだって? Copyright © nequal, Creative Commons Attribution- Noncommercial 2.1 @ PHP Study #46.
  6. 6. ⾁はどうしたんですか Copyright © nequal, Creative Commons Attribution- Noncommercial 2.1 @ PHP Study #46.
  7. 7. 本来のPHP勉強会 Copyright © nequal, Creative Commons Attribution- Noncommercial 2.1 @ PHP Study #46.
  8. 8. PHPerは ⾁の精神を忘れ てしまったか Copyright © nequal, Creative Commons Attribution- Noncommercial 2.1 @ PHP Study #46.
  9. 9. ごめんなさい冗談です gusagiさん幹事おつかれさまです Copyright © nequal, Creative Commons Attribution- Noncommercial 2.1 @ PHP Study #46.
  10. 10. じこしょうかい
  11. 11. sotarok • そうたろう(けー) • プリン • プリン • プリン • pudding • プリン • ⾁ • ごはん • 自転⾞ • 写真 – Sony α 300 • Ethna • nequal Copyright © nequal, Creative Commons Attribution- Noncommercial 2.1 @ PHP Study #46.
  12. 12. 宣伝 • WikiHub – http://wikihub.org/ – Git で⽂書管理して,それを Wiki 形式で整形して 表⽰ – GitHub の Service Hook で簡単同期 • 制限つきOpenBeta – 100⼈まで Copyright © nequal, Creative Commons Attribution- Noncommercial 2.1 @ PHP Study #46.
  13. 13. 宣伝2 なぜか誰も 買ってこない • プリンが好きです Copyright © nequal, Creative Commons Attribution- Noncommercial 2.1 @ PHP Study #46.
  14. 14. 宣伝2 yuchimiriさんに RTまでされたのに • プリンが好きです Copyright © nequal, Creative Commons Attribution- Noncommercial 2.1 @ PHP Study #46.
  15. 15. 検索エンジンとか つくってるとこ! Preferred Infrastructure (PFI) というところでインターンやってます だからか だからです Copyright © nequal, Creative Commons Attribution- Noncommercial 2.1 @ PHP Study #46.
  16. 16. Agenda • 検索エンジン • 転置インデックス • クロールとキーワード抽出 • スコアリングと並び替え • デモ • 技術的な課題とか Copyright © nequal, Creative Commons Attribution- Noncommercial 2.1 @ PHP Study #46.
  17. 17. 検索エンジン • キーワードを⼊⼒ – → そのキーワードが含まれる(そして探したいと 思われる)⽂書が探せる • ソースコード検索 – grep – gtags (GNU GLOBAL) – trac + Hyper Estraier (BTS + Plugin) – Google Code Search Copyright © nequal, Creative Commons Attribution- Noncommercial 2.1 @ PHP Study #46.
  18. 18. grep • 与えられたキーワードをファイルをたどり,⽂字 列⼀致で探す • 前処理が必要ない • どこにでも⼊ってる grepのデメリット • 大量の⽂書から探すのは時間がかかる – 同じキーワードで再検索するときもまた同じ処理 • ランキングづけができない Copyright © nequal, Creative Commons Attribution- Noncommercial 2.1 @ PHP Study #46.
  19. 19. 検索エンジンを作る • 既存のいろんなソフトウェアを使うのもいいけど • 「検索エンジン」 – そんな難しくない – PHPでもできる – カンタンだよ! • 今回の目標 – ローカルのPHPソースファイルからメソッドや関数 や変数を検索できるようにする – ディレクトリを指定して,再帰的にPHPファイルを 検索 – grep -rn 'substr' **/*.php Copyright © nequal, Creative Commons Attribution- Noncommercial 2.1 @ PHP Study #46.
  20. 20. 転置インデックス
  21. 21. 転置インデックス • キーワードから⽂書を逆引きできるようにあらか じめつくっておくインデックス • 焼⾁ => – ⽜角 – Wikipedia – 焼⾁ – YAKINIQUEST - ヤキニクエスト – ... Copyright © nequal, Creative Commons Attribution- Noncommercial 2.1 @ PHP Study #46.
  22. 22. ※⽂書はフィクションです ⽂書1 I like Sushi, Yakiniku and pudding ! ⽂書2 PHPer like Yakiniku. Maybe not like Sushi. ⽂書3 Dankogai is an enemy of PHPer. Copyright © nequal, Creative Commons Attribution- Noncommercial 2.1 @ PHP Study #46.
  23. 23. ※⽂書はフィクションです ⽂書1 I like Sushi , Yakiniku and pudding ! ⽂書2 PHPer like Yakiniku. Maybe not like Sushi. ⽂書3 Dankogai is an enemy of PHPer. He also like Yakiniku. Copyright © nequal, Creative Commons Attribution- Noncommercial 2.1 @ PHP Study #46.
  24. 24. Sushi 1 ⽂書1 I like Sushi, Yakiniku and pudding ! ⽂書2 PHPer like Yakiniku. Maybe not like ⽂書3 Sushi. Dankogai is an enemy of PHPer. He also like Yakiniku. Copyright © nequal, Creative Commons Attribution- Noncommercial 2.1 @ PHP Study #46.
  25. 25. Sushi 1 Yakiniku 1 ⽂書1 I like Sushi, Yakiniku and pudding ! ⽂書2 PHPer like Yakiniku. Maybe not like ⽂書3 Sushi. Dankogai is an enemy of PHPer. He also like Yakiniku. Copyright © nequal, Creative Commons Attribution- Noncommercial 2.1 @ PHP Study #46.
  26. 26. Sushi 1 Yakiniku 1 pudding 1 ⽂書1 I like Sushi, Yakiniku and pudding ! ⽂書2 PHPer like Yakiniku. Maybe not like ⽂書3 Sushi. Dankogai is an enemy of PHPer. He also like Yakiniku. Copyright © nequal, Creative Commons Attribution- Noncommercial 2.1 @ PHP Study #46.
  27. 27. Sushi 1 Yakiniku 1 2 pudding 1 ⽂書1 I like Sushi, Yakiniku and pudding ! ⽂書2 PHPer like Yakiniku. Maybe not like ⽂書3 Sushi. Dankogai is an enemy of PHPer. He also like Yakiniku. Copyright © nequal, Creative Commons Attribution- Noncommercial 2.1 @ PHP Study #46.
  28. 28. Sushi 1 2 Yakiniku 1 2 pudding 1 ⽂書1 I like Sushi, Yakiniku and pudding ! ⽂書2 PHPer like Yakiniku. Maybe not like ⽂書3 Sushi. Dankogai is an enemy of PHPer. He also like Yakiniku. Copyright © nequal, Creative Commons Attribution- Noncommercial 2.1 @ PHP Study #46.
  29. 29. 転置インデックスをPHPで • array でしょJK $inverted_index = array( 'miyazaki' => array(1, 2, 6, 4 ...), 'aoi' => array(2, 6, 7, ...), 'sotarok' => array(...), ... ); 配列のキー: 配列の要素: 単語 ⽂書IDのリスト Copyright © nequal, Creative Commons Attribution- Noncommercial 2.1 @ PHP Study #46.
  30. 30. クロールとキーワード抽出
  31. 31. クロールとキーワード抽出 • 対象の⽂書からキーワードを拾い集める • クローラー -> Google なら Google Bot とか • キーワード -> – 空⽩区切りの⽂字列(英語圏のひと) – 形態素解析(明⽇ は あめ だ) – n-gram • n⽂字区切りでキーワードにする • 2-gram(bi-gram) • 明⽇ ⽇は はあ あめ めだ Copyright © nequal, Creative Commons Attribution- Noncommercial 2.1 @ PHP Study #46.
  32. 32. クロールとキーワード抽出をPHPで(1) •function crawl ($dirname) • foreach(glob($dirname . "/*") as $file) • if is_dir($file): • $files += crawl ($file) • else: • if $file ~= /.+¥.php$/ • $files[] = $file • return $files Copyright © nequal, Creative Commons Attribution- Noncommercial 2.1 @ PHP Study #46.
  33. 33. クロールとキーワード抽出をPHPで(2) • キーワードの抽出 – 関数名/メソッド名/クラス名/変数名 – tokenizer を使う • token_get_all • PHP • tokenize • http://php.net/tokenizer • T_STRING • T_VARIABLE Copyright © nequal, Creative Commons Attribution- Noncommercial 2.1 @ PHP Study #46.
  34. 34. スコアリングと並び替え
  35. 35. スコアリングと並び替え • なにかの基準で検索結果を並び替える • あてはまりの良い⽂書を上に出す • 普通の検索 なら – ページランク (Google のウェブ検索) – TF-IDF • ⽂書中の単語の出現頻度 • その単語の⽂書全体での珍しさ – ... Copyright © nequal, Creative Commons Attribution- Noncommercial 2.1 @ PHP Study #46.
  36. 36. スコアリングと並び替えをPHPで • スコアはソースコード中のそのキーワードの出現 数 • 多い順に並び替え PHP 5.3 なら function($v1, $v2) uasort( でいける! $scored, create_function( '$v1, $v2', 'return $v1[¥'count¥'] < $v2[¥'count¥'];' ) ); Copyright © nequal, Creative Commons Attribution- Noncommercial 2.1 @ PHP Study #46.
  37. 37. デモ Hyper Pudding http://gist.github.com/192879
  38. 38. 技術的な課題 • デモったやつは全部 on memory – 大規模⽂書はイケない • symfony で 140MB くらい⾷うかな – ということで,転置インデックスを外部ファイル (Key-Value Store... まぁ,SQLite とかでもいい けど) に保持するといい • 並び替えの基準は出現頻度でいいの? – これはまあ難しいですね – 属性情報とかいろいろとればさらに • And/Or 検索 Copyright © nequal, Creative Commons Attribution- Noncommercial 2.1 @ PHP Study #46.
  39. 39. まとめ • 簡単な検索エンジンはPHPでもつくれる – それもお⼿軽に • インデックスをあらかじめつくっておけば検索は 瞬時にできる • 検索技術とか楽しい Copyright © nequal, Creative Commons Attribution- Noncommercial 2.1 @ PHP Study #46.
  40. 40. ありがとうございました Question?
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×