SlideShare a Scribd company logo
1 of 15
Download to read offline
はてなダイアリーキーワード
   をつくってみたよ

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

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

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

 ▼キーワードごとに専用ページがある
  ・キーワードの説明
  ・関連商品、広告
  ・キーワードが最近使われた日記の一覧
  ・などなど

 ▼自動リンク
   日記中にキーワードが現れると、専用ページへのリンク
   を自動ではる
  
はてなダイアリーキーワードをつくりたい

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

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

 ▼つくってみよう
  ・技術者のはしくれだし
  ・なによりおもしろそう
  ・意地でもRubyでやってみる(Rubyistだもの)
キーワードの自動リンク

■自動リンクの方法

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

 ▼日記の表示時に、リンク処理を施してからViewへ
   ・パフォーマンスが低下するかも
  ・新しいキーワードが登録されても大丈夫
キーワードを探し出す

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

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

  
正規表現

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

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


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

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


  ・繰り返しを考慮しなければならないから大変
  ・非決定性があるなら決定性もあるはず
決定性オートマトン(DFA)

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

             か    た

   食    べ    も     の


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

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

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

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

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

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

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

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

 「く」 → tree[“や”][“き”][“に”].has_key?(“く”) #=> true
       tree[“や”][“き”][“に”][“く”] == “EN” 検出!

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

■キーワードサーバ
 ・通信はRinda(dRuby)で実現
                                                              キーワードサーバ
     [:req, “I love Ruby”]                 [:req, nil]


                             Tuple space


        [:res, nil]                        [:res, “I love <a>Ruby</a>”]
結果
■測定
 ・はてなのキーワード228,758語を使用
 ・6000字程度の文章を対象

 ▼結果
  ・ハッシュ木の作成 10.263402 秒
  ・メモリの消費量  142Mb
  ・キーワードの検出 0.010049 秒
  ・キーワードの追加 10e-6 秒

■実際に見てみる
 http://www.kaeruspoon.net/keywords
他の方法

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

Thanks!

More Related Content

More from Tsukasa Oishi

はてブ砲をくらったときのお話
はてブ砲をくらったときのお話はてブ砲をくらったときのお話
はてブ砲をくらったときのお話Tsukasa Oishi
 
奥さんとプログラミングを両立させる方法
奥さんとプログラミングを両立させる方法奥さんとプログラミングを両立させる方法
奥さんとプログラミングを両立させる方法Tsukasa Oishi
 
Iphoneアプリ開発におけるデザインパターン
Iphoneアプリ開発におけるデザインパターンIphoneアプリ開発におけるデザインパターン
Iphoneアプリ開発におけるデザインパターンTsukasa Oishi
 
かんたんな検索エンジンをつくってみました
かんたんな検索エンジンをつくってみましたかんたんな検索エンジンをつくってみました
かんたんな検索エンジンをつくってみましたTsukasa Oishi
 
食べログで動いている自作ライブラリのお話
食べログで動いている自作ライブラリのお話食べログで動いている自作ライブラリのお話
食べログで動いている自作ライブラリのお話Tsukasa Oishi
 
Miyazaki Resistanceを作ってみたよ
Miyazaki Resistanceを作ってみたよMiyazaki Resistanceを作ってみたよ
Miyazaki Resistanceを作ってみたよTsukasa Oishi
 
Tokyotyrantについて
TokyotyrantについてTokyotyrantについて
TokyotyrantについてTsukasa Oishi
 

More from Tsukasa Oishi (8)

はてブ砲をくらったときのお話
はてブ砲をくらったときのお話はてブ砲をくらったときのお話
はてブ砲をくらったときのお話
 
奥さんとプログラミングを両立させる方法
奥さんとプログラミングを両立させる方法奥さんとプログラミングを両立させる方法
奥さんとプログラミングを両立させる方法
 
Iphoneアプリ開発におけるデザインパターン
Iphoneアプリ開発におけるデザインパターンIphoneアプリ開発におけるデザインパターン
Iphoneアプリ開発におけるデザインパターン
 
かんたんな検索エンジンをつくってみました
かんたんな検索エンジンをつくってみましたかんたんな検索エンジンをつくってみました
かんたんな検索エンジンをつくってみました
 
食べログで動いている自作ライブラリのお話
食べログで動いている自作ライブラリのお話食べログで動いている自作ライブラリのお話
食べログで動いている自作ライブラリのお話
 
Miyazaki Resistanceを作ってみたよ
Miyazaki Resistanceを作ってみたよMiyazaki Resistanceを作ってみたよ
Miyazaki Resistanceを作ってみたよ
 
Tokyotyrantについて
TokyotyrantについてTokyotyrantについて
Tokyotyrantについて
 
Tdd
TddTdd
Tdd
 

Recently uploaded

Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...Toru Tamaki
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptxsn679259
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video UnderstandingToru Tamaki
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイスCRI Japan, Inc.
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Hiroshi Tomioka
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルCRI Japan, Inc.
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Gamesatsushi061452
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsWSO2
 

Recently uploaded (11)

Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 

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