はてなダイアリーキーワード
   をつくってみたよ

   Tsukasa OISHI
はてなダイアリーキーワードとは

■はてなダイアリー
  株式会社はてなが運営しているWeb日記

■はてなダイアリーキーワード
  はてなユーザが共有するキーワード

 ▼キーワードごとに専用ページがある
  ・キーワードの説明
  ・関連商...
はてなダイアリーキーワードをつくりたい

■野良ブログでもはてなダイアリーキーワードを使いたい
  タグやカテゴリを記事ごとに指定するのが
  メンドくさくなってきた

 ▼はてなのAPIがある
  ・楽チン
  ・でもつまんない

 ▼つくっ...
キーワードの自動リンク

■自動リンクの方法

 ▼日記の保存時に、リンク処理を施してからDBへ
   ・パフォーマンスの低下が抑えられる
   ・新しいキーワードが登録されたときの対応が大変
   ・日記を編集したいときも面倒

 ▼日記の表...
キーワードを探し出す

■はてなでの登録キーワード数
  228,758語のキーワード (2008/8/23 16:56)

■すごく重そう
 日記の中から228,758語のキーワードのどれが
 使われているのかを探し出さなきゃ

  
正規表現

■文章の検索といえば正規表現
  228,758語のキーワードを探し出す正規表現なんて
  あるの?

 ▼あった
 ・はてなが用意していた
  ・2730kbの正規表現


  ▼試してみる
  ・6000字程度の文章
  ・0....
オートマトン
■正規表現では遅い
 そもそも正規表現の仕組みはどうなっているのだろう

  ▼非決定性オートマトン(NFA)
            ε
   /a+/
   
             a


  ・繰り返しを考慮しなければな...
決定性オートマトン(DFA)

■決定性オートマトンを考える
 ・キーワード検出は一意に状態遷移が決まる

             か    た

   食    べ    も     の


             す    ぎ
実現方法
■木構造
 単純に考えてこれ

 ▼ハッシュ木
   ・速そう
   ・だけどメモリを食いそう

  ▼キーワードの検出
   1. キーワード検出のためのハッシュ木を作る
   2. 対象の文章を最初から一文字ずつチェック
ハッシュ木

キーワード : やきにく、やきとり、やきにんにく
tree = {
  “や” => {
   “き” => {“に” => {“く” =>“EN”,
                   “ん” => { “に” => { “く...
キーワードの検出
 キーワード  やきにく、やきとり、やきにんにく
 対象の文章 ぼくはやきにくがすき

 「ぼ」「く」「は」 → 一致せず

 「や」 → tree.has_key?(“や”) #=> true

 「き」 → tree[“や...
実装
■ハッシュのキー
 ・UTF-8での一文字
 ・Railsだし
 ・本当は一バイトごとにしたほうがいい

■キーワードサーバ
 ・通信はRinda(dRuby)で実現
                                   ...
結果
■測定
 ・はてなのキーワード228,758語を使用
 ・6000字程度の文章を対象

 ▼結果
  ・ハッシュ木の作成 10.263402 秒
  ・メモリの消費量  142Mb
  ・キーワードの検出 0.010049 秒
  ・キー...
他の方法

■double array
 ・MeCabなどに使われている
 ・新しいキーワードの追加でarrayが壊れる
 ・ググるとgoogleの求人広告が!
 ・いつか試したい
 
おしまい

Thanks!
Upcoming SlideShare
Loading in …5
×

はてなダイアリーキーワードをつくってみたよ

2,104 views

Published on

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

  • Be the first to like this

No Downloads
Views
Total views
2,104
On SlideShare
0
From Embeds
0
Number of Embeds
45
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

はてなダイアリーキーワードをつくってみたよ

  1. 1. はてなダイアリーキーワード をつくってみたよ Tsukasa OISHI
  2. 2. はてなダイアリーキーワードとは ■はてなダイアリー   株式会社はてなが運営しているWeb日記 ■はてなダイアリーキーワード   はてなユーザが共有するキーワード  ▼キーワードごとに専用ページがある   ・キーワードの説明   ・関連商品、広告   ・キーワードが最近使われた日記の一覧   ・などなど  ▼自動リンク    日記中にキーワードが現れると、専用ページへのリンク    を自動ではる   
  3. 3. はてなダイアリーキーワードをつくりたい ■野良ブログでもはてなダイアリーキーワードを使いたい タグやカテゴリを記事ごとに指定するのが メンドくさくなってきた  ▼はてなのAPIがある   ・楽チン   ・でもつまんない  ▼つくってみよう   ・技術者のはしくれだし   ・なによりおもしろそう   ・意地でもRubyでやってみる(Rubyistだもの)
  4. 4. キーワードの自動リンク ■自動リンクの方法  ▼日記の保存時に、リンク処理を施してからDBへ    ・パフォーマンスの低下が抑えられる    ・新しいキーワードが登録されたときの対応が大変 ・日記を編集したいときも面倒  ▼日記の表示時に、リンク処理を施してからViewへ    ・パフォーマンスが低下するかも   ・新しいキーワードが登録されても大丈夫
  5. 5. キーワードを探し出す ■はてなでの登録キーワード数   228,758語のキーワード (2008/8/23 16:56) ■すごく重そう 日記の中から228,758語のキーワードのどれが 使われているのかを探し出さなきゃ   
  6. 6. 正規表現 ■文章の検索といえば正規表現 228,758語のキーワードを探し出す正規表現なんて あるの?  ▼あった  ・はてなが用意していた ・2730kbの正規表現 ▼試してみる   ・6000字程度の文章   ・0.810735940933228秒 
  7. 7. オートマトン ■正規表現では遅い  そもそも正規表現の仕組みはどうなっているのだろう   ▼非決定性オートマトン(NFA)     ε /a+/     a   ・繰り返しを考慮しなければならないから大変   ・非決定性があるなら決定性もあるはず
  8. 8. 決定性オートマトン(DFA) ■決定性オートマトンを考える  ・キーワード検出は一意に状態遷移が決まる か た 食 べ も の す ぎ
  9. 9. 実現方法 ■木構造  単純に考えてこれ  ▼ハッシュ木    ・速そう    ・だけどメモリを食いそう ▼キーワードの検出    1. キーワード検出のためのハッシュ木を作る    2. 対象の文章を最初から一文字ずつチェック
  10. 10. ハッシュ木 キーワード : やきにく、やきとり、やきにんにく tree = { “や” => { “き” => {“に” => {“く” =>“EN”, “ん” => { “に” => { “く” => “EN” } } }, “と” => { “り” => “EN” } } } } }
  11. 11. キーワードの検出 キーワード  やきにく、やきとり、やきにんにく 対象の文章 ぼくはやきにくがすき  「ぼ」「く」「は」 → 一致せず  「や」 → tree.has_key?(“や”) #=> true  「き」 → tree[“や”].has_key?(“き”) #=> true  「に」 → tree[“や”][“き”].has_key?(“に”) #=> true  「く」 → tree[“や”][“き”][“に”].has_key?(“く”) #=> true        tree[“や”][“き”][“に”][“く”] == “EN” 検出! 「が」「す」「き」 → 一致せず
  12. 12. 実装 ■ハッシュのキー  ・UTF-8での一文字  ・Railsだし  ・本当は一バイトごとにしたほうがいい ■キーワードサーバ  ・通信はRinda(dRuby)で実現   キーワードサーバ [:req, “I love Ruby”] [:req, nil] Tuple space [:res, nil] [:res, “I love <a>Ruby</a>”]
  13. 13. 結果 ■測定  ・はてなのキーワード228,758語を使用  ・6000字程度の文章を対象  ▼結果   ・ハッシュ木の作成 10.263402 秒   ・メモリの消費量  142Mb   ・キーワードの検出 0.010049 秒   ・キーワードの追加 10e-6 秒 ■実際に見てみる http://www.kaeruspoon.net/keywords
  14. 14. 他の方法 ■double array  ・MeCabなどに使われている  ・新しいキーワードの追加でarrayが壊れる  ・ググるとgoogleの求人広告が!  ・いつか試したい  
  15. 15. おしまい Thanks!

×