More Related Content
PDF
RubyもApache Arrowでデータ処理言語の仲間入り PDF
Apache ArrowのRubyバインディングをGObject Introspectionで PPTX
Students report card for C++ project.. PPTX
PDF
Project Proposal document for Hotel Management System PPTX
Online hotel booking application - Design Process PPTX
Hotel Reservation System Project PDF
Hotel Management System Final Report Similar to PHP Source Code Search with PHP
PDF
YAPC::Asia 2014 - 半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情 PDF
PDF
PHP初心者セッション2023 〜ChatGPT時代の簡単な始め方〜 PDF
PDF
Getting Started with Testing using PHPUnit PDF
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2011 PPTX
PDF
PHPの今とこれから2024 at PHP Conference Japan 2024 PDF
PPTX
PDF
PDF
PDF
Dive into the Cloud with our buddy, lovely PHP! PDF
Modern PHP Programming @ PFI Seminar PDF
最新PHP事情 (2000年7月22日,PHPカンファレンス) PDF
Introduction to Continuous Test Runner MakeGood PDF
PDF
GMO TECHNOLOGY BOOT CAMP2015(PHP編) PDF
PDF
More from Sotaro Karasawa
PDF
PDF
PDF
PDF
PDF
PDF
PDF
PDF
PDF
Mockingbirdサーバサイド@拡張機能勉強会 PDF
PDF
PDF
PDF
PDF
openpearについて@楽天テクノロジーカンファレンス PDF
PDF
PDF
Mockingbirdイベントハンドリング@拡張機能勉強会 PDF
PDF
PDF
Mockingbirdのタブバーの実装@拡張機能勉強会 Recently uploaded
PDF
Qitta NotebookLM Sample Slide #3 NotebookLMで60ページ超の登壇スライド作成してみた PDF
Qitta NotebookLM Sample Slide #1 NotebookLMで60ページ超の登壇スライド作成してみた PDF
Qitta NotebookLM Sample Slide #7 NotebookLMで60ページ超の登壇スライド作成してみた PDF
Qitta NotebookLM Sample Slide #5 NotebookLMで60ページ超の登壇スライド作成してみた PDF
Qitta NotebookLM Sample Slide #2 NotebookLMで60ページ超の登壇スライド作成してみた PDF
Qitta NotebookLM Sample Slide #4 NotebookLMで60ページ超の登壇スライド作成してみた PDF
Qitta NotebookLM Sample Slide #1 NotebookLMで60ページ超の登壇スライド作成してみた PDF
Qitta NotebookLM Sample Slide #6 NotebookLMで60ページ超の登壇スライド作成してみた PDF
Qitta NotebookLM Sample Slide #8 NotebookLMで60ページ超の登壇スライド作成してみた 完成 PDF
ネットワーク分析による 理学療法推論の可視化 ---教育支援のためのシステム開発に向けて--- PDF
AgentCoreで実現するマルチテナントAIエージェント PDF
Machine Tests Benchmark Suite. Explain github.com/alexziskind1/machine_tests #1 PDF
Machine Tests Benchmark Suite. Explain github.com/alexziskind1/machine_tests #2 PDF
エンジニアが選ぶべきAIエディタ & Antigravity 活用例@ウェビナー「触ってみてどうだった?Google Antigravity 既存IDEと... PHP Source Code Search with PHP
- 1.
PHP Source CodeSearch
with
PHP
柄沢聡太郎 (sotarok)
http://nequal.jp/
twitter.com/sotarok
- 2.
始める前に
Copyright © nequal, Creative Commons Attribution-
Noncommercial 2.1 @ PHP Study #46.
- 3.
今⽇はPHP勉強会
Copyright © nequal, Creative Commons Attribution-
Noncommercial 2.1 @ PHP Study #46.
- 4.
なぜ 9/29 ではないのか
Copyright © nequal, Creative Commons Attribution-
Noncommercial 2.1 @ PHP Study #46.
- 5.
懇親会はピザだって?
Copyright © nequal, Creative Commons Attribution-
Noncommercial 2.1 @ PHP Study #46.
- 6.
⾁はどうしたんですか
Copyright © nequal, Creative Commons Attribution-
Noncommercial 2.1 @ PHP Study #46.
- 7.
本来のPHP勉強会
Copyright © nequal, Creative Commons Attribution-
Noncommercial 2.1 @ PHP Study #46.
- 8.
PHPerは
⾁の精神を忘れ
てしまったか
Copyright © nequal, Creative Commons Attribution-
Noncommercial 2.1 @ PHP Study #46.
- 9.
- 10.
- 11.
sotarok
• そうたろう(けー)
• プリン
• プリン
• プリン
• pudding
• プリン
• ⾁
• ごはん
• 自転⾞
• 写真 – Sony α 300
• Ethna
• nequal
Copyright © nequal, Creative Commons Attribution-
Noncommercial 2.1 @ PHP Study #46.
- 12.
宣伝
• WikiHub
– http://wikihub.org/
– Git で⽂書管理して,それを Wiki 形式で整形して
表⽰
– GitHub の Service Hook で簡単同期
• 制限つきOpenBeta
– 100⼈まで
Copyright © nequal, Creative Commons Attribution-
Noncommercial 2.1 @ PHP Study #46.
- 13.
宣伝2 なぜか誰も
買ってこない
• プリンが好きです
Copyright © nequal, Creative Commons Attribution-
Noncommercial 2.1 @ PHP Study #46.
- 14.
宣伝2 yuchimiriさんに
RTまでされたのに
• プリンが好きです
Copyright © nequal, Creative Commons Attribution-
Noncommercial 2.1 @ PHP Study #46.
- 15.
検索エンジンとか
つくってるとこ!
Preferred Infrastructure (PFI)
というところでインターンやってます
だからか
だからです
Copyright © nequal, Creative Commons Attribution-
Noncommercial 2.1 @ PHP Study #46.
- 16.
Agenda
• 検索エンジン
• 転置インデックス
• クロールとキーワード抽出
• スコアリングと並び替え
• デモ
• 技術的な課題とか
Copyright © nequal, Creative Commons Attribution-
Noncommercial 2.1 @ PHP Study #46.
- 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.
grep
• 与えられたキーワードをファイルをたどり,⽂字
列⼀致で探す
• 前処理が必要ない
• どこにでも⼊ってる
grepのデメリット
• 大量の⽂書から探すのは時間がかかる
– 同じキーワードで再検索するときもまた同じ処理
• ランキングづけができない
Copyright © nequal, Creative Commons Attribution-
Noncommercial 2.1 @ PHP Study #46.
- 19.
検索エンジンを作る
• 既存のいろんなソフトウェアを使うのもいいけど
• 「検索エンジン」
– そんな難しくない
– PHPでもできる
– カンタンだよ!
• 今回の目標
– ローカルのPHPソースファイルからメソッドや関数
や変数を検索できるようにする
– ディレクトリを指定して,再帰的にPHPファイルを
検索
– grep -rn 'substr' **/*.php
Copyright © nequal, Creative Commons Attribution-
Noncommercial 2.1 @ PHP Study #46.
- 20.
- 21.
転置インデックス
• キーワードから⽂書を逆引きできるようにあらか
じめつくっておくインデックス
• 焼⾁ =>
– ⽜角
– Wikipedia – 焼⾁
– YAKINIQUEST - ヤキニクエスト
– ...
Copyright © nequal, Creative Commons Attribution-
Noncommercial 2.1 @ PHP Study #46.
- 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.
※⽂書はフィクションです
⽂書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.
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.
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.
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.
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.
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.
転置インデックスを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.
- 31.
クロールとキーワード抽出
• 対象の⽂書からキーワードを拾い集める
• クローラー-> Google なら Google Bot とか
• キーワード ->
– 空⽩区切りの⽂字列(英語圏のひと)
– 形態素解析(明⽇ は あめ だ)
– n-gram
• n⽂字区切りでキーワードにする
• 2-gram(bi-gram)
• 明⽇ ⽇は はあ あめ めだ
Copyright © nequal, Creative Commons Attribution-
Noncommercial 2.1 @ PHP Study #46.
- 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.
クロールとキーワード抽出を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.
- 35.
- 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.
- 38.
技術的な課題
• デモったやつは全部 onmemory
– 大規模⽂書はイケない
• symfony で 140MB くらい⾷うかな
– ということで,転置インデックスを外部ファイル
(Key-Value Store... まぁ,SQLite とかでもいい
けど) に保持するといい
• 並び替えの基準は出現頻度でいいの?
– これはまあ難しいですね
– 属性情報とかいろいろとればさらに
• And/Or 検索
Copyright © nequal, Creative Commons Attribution-
Noncommercial 2.1 @ PHP Study #46.
- 39.
まとめ
• 簡単な検索エンジンはPHPでもつくれる
–それもお⼿軽に
• インデックスをあらかじめつくっておけば検索は
瞬時にできる
• 検索技術とか楽しい
Copyright © nequal, Creative Commons Attribution-
Noncommercial 2.1 @ PHP Study #46.
- 40.