MeCabによるAutolink

上の研究会でMeCabを使ってAUtolinkを実現する話が出ていたので実際に実験してみた.
MeCab の辞書構造と汎用テキスト変換ツールとしての利用を参考にした.
置換するキーワードリストとしてはWikipediaの記事タイトルを用いた.記事タイトルはダウンロードサイトjawiki-latest-all-titles-in-ns0.gzから取得できる.
記事タイトルリストは以下のスクリプトで変換する

trans.rb

title = $_.strip
length = title.split(//u).length;
score = [-36000.0 ,-400 *(length**1.5)].max.to_i
puts "#{title},0,0,#{score},#{length}" unless (length < 3 or title =~ /[",]/)
[Tsubosaka@gauss mecab]ruby -n trance.rb < jawiki-latest-all-titles-in-ns0 > title.csv 
[Tsubosaka@gauss mecab]head title.csv
page_title,0,0,-12649,10
!!!,0,0,-2078,3
!!!Fuck_You!!!,0,0,-20953,14
!_-attention-,0,0,-18748,13
$10,0,0,-2078,3
$100PC,0,0,-5878,6
$100_laptop,0,0,-14593,11
$100パソコン,0,0,-9050,8
$10_(SMAP),0,0,-12649,10
$10_(お笑いコンビ),0,0,-16627,12

なおタイトルリストをそのまま使うと「あ」などの単語も辞書に登録されるので,辞書に登録する単語の長さは3文字以上とする.matrix.def , unk.def ,char.def はサンプルをそのまま流用する.

dicrcはそのままだとaタグの中に空白が入ったりするので%Mではなく%mを用いる

dicrc

cost-factor = 800
bos-feature = BOS/EOS
output-format-type=autolink

node-format-autolink = %pS<a href="http://ja.wikipedia.org/wiki/%m">%m</a>
unk-format-autolink = %M
eos-format-autolink = \n

これを用いて,まず辞書をコンパイルする.

[Tsubosaka@gauss mecab]$ time /usr/local/libexec/mecab/mecab-dict-index -f utf8 -c utf8
./pos-id.def is not found. minimum setting is used
reading ./unk.def ... 2
emitting double-array: 100% |###########################################| 
./pos-id.def is not found. minimum setting is used
reading ./title.csv ... 655775
emitting double-array: 100% |###########################################| 
reading ./matrix.def ... 1x1

done!

real    0m6.563s
user    0m6.269s
sys     0m0.295s

60万個程度のキーワードに関するdouble-arrayの生成に読み込みも含めて数秒で実行で来ている.

実行は "mecab -d ."とすればできる,たとえば

自然言語処理(しぜんげんごしょり、英: Natural language processing、NLP)は、人間が日常的に使っている自然言語をコンピュータに処理させる一連の技術であり、人工知能言語学の一分野である。「計算言語学 Computational Linguistics」も同じ意味であるが、前者は工学的な視点からの言語処理をさすのに対して、後者は言語学的視点を重視する手法をさす事が多い[1]。データベース内の情報を自然言語に変換したり、自然言語の文章をより形式的な(コンピュータが理解しやすい)表現に変換するといった処理が含まれる。

自然言語処理 - Wikipedia

を入力として与えると下のような出力が得られる.

自然言語処理(しぜんげんごしょり、英: Natural language
processing、NLP)は、人間が日常的に使っている自然言語コンピュータに処理させる一連の技術であり、人工知能言語学の一分野である。「計算言語学
Computational
Linguistics」も同じ意味であるが、前者は工学的な視点からの言語処理をさすのに対して、後者は言語学的視点を重視する手法をさす事が多い[1]。データベース内の情報を自然言語に変換したり、自然言語の文章をより形式的な(コンピュータが理解しやすい)表現に変換するといった処理が含まれる。