Rubyでもキーワード自動リンクを実装する

ウノウラボ by Zynga Japan: PHPとMecabでキーワード自動リンクを実装する
こちらの記事を参考に。


MeCab にはRuby バインディングも用意されているので
Ruby では以下のように記述することができる。

#!/usr/bin/ruby
$KCODE='u'
require 'MeCab'

# autolink dictの位置は自分の環境にあわせて変更
m = MeCab::Tagger.new("-d /usr/local/lib/mecab/dic/autolink")

str = '京都についてGoogleとYahooで検索した。'

puts m.parse(str)


これだけではなんなので、少し悩んだところを。
ウノウラボ by Zynga Japan: PHPとMecabでキーワード自動リンクを実装する では
2. 自動リンク用辞書の作成 で以下のようなCSV を用意している。

Google,0,0,-5878,http://www.google.com/
Yahoo,0,0,-4472,http://www.yahoo.com/
ChaSen,0,0,-5878,http://chasen.org/
京都,0,0,-3200,http://www.city.kyoto.jp/


独自辞書のためにCSV ファイルを作成する場合、
各項目(特に右から二番目)にどのような値を指定すればいいだろうか。
これはウノウラボ by Zynga Japan: PHPとMecabでキーワード自動リンクを実装する の参考リンクにあった
MeCab の辞書構造と汎用テキスト変換ツールとしての利用 にケーススタディとして解説されている。

* url.csv
単語としてキーワード, 品詞としてキーワードに対応する URL を書きます. 連接の状態は1状態で十分なので, 左文脈/右文脈IDともに 0 とします. コスト値は長いキーワードが優先されるよう設定します. 例えば以下のような関数を使うとよいでしょう.

cost = (int)max(-36000, 400 * (length^1.5)) 

url.csv

Google,0,0,-5878,http://www.google.com/
Yahoo,0,0,-4472,http://www.yahoo.com/
ChaSen,0,0,-5878,http://chasen.org/
京都,0,0,-3200,http://www.city.kyoto.jp/


コストの算出はこんな感じで。

def cost(keyword)
   [-36000, -(400 * keyword.split(//).size ** 1.5).to_i].max
end