[Solr] Tagger Handler で日本語テキストにタグ付け
前回紹介した Tagger Handler を使って日本語のテキストタグ付けを試してみました。
まずコレクション(osaka_shisetsu_tagger)を作成します。
bin/solr create -c osaka_shisetsu_tagger
スキーマを API で設定します。
indexAnalyzer と queryAnalyzer の設定を日本語の形態素解析を使うものに変更しています。
Solr リファレンスに書かれている通り、 indexAnalyzer のフィルタチェーンの最後に ConcatenateGraphFilterFactory を指定するのがミソです。
curl -X POST -H 'Content-type:application/json' http://localhost:8983/solr/osaka_shisetsu_tagger/schema -d '{ "add-field-type":{ "name":"tag", "class":"solr.TextField", "postingsFormat":"FST50", "omitNorms":true, "omitTermFreqAndPositions":true, "indexAnalyzer":{ "tokenizer":{ "class":"solr.JapaneseTokenizerFactory", "mode":"search" }, "filters":[ {"class":"solr.JapaneseBaseFormFilterFactory"}, {"class":"solr.JapanesePartOfSpeechStopFilterFactory", "tags":"lang/stoptags_ja.txt"}, {"class":"solr.CJKWidthFilterFactory"}, {"class":"solr.StopFilterFactory", "ignoreCase":"true", "words":"lang/stopwords_ja.txt"}, {"class":"solr.JapaneseKatakanaStemFilterFactory", "minimumLength":"4"}, {"class":"solr.LowerCaseFilterFactory"}, {"class":"solr.ConcatenateGraphFilterFactory", "preservePositionIncrements":false } ]}, "queryAnalyzer":{ "tokenizer":{ "class":"solr.JapaneseTokenizerFactory", "mode":"search" }, "filters":[ {"class":"solr.JapaneseBaseFormFilterFactory"}, {"class":"solr.JapanesePartOfSpeechStopFilterFactory", "tags":"lang/stoptags_ja.txt"}, {"class":"solr.CJKWidthFilterFactory"}, {"class":"solr.StopFilterFactory", "ignoreCase":"true", "words":"lang/stopwords_ja.txt"}, {"class":"solr.JapaneseKatakanaStemFilterFactory", "minimumLength":"4"}, {"class":"solr.LowerCaseFilterFactory"} ]} }, "add-field":{"name":"name", "type":"text_ja"}, "add-field":{"name":"name_tag", "type":"tag", "stored":false }, "add-copy-field":{"source":"name", "dest":["name_tag"]} }'
TaggerRequestHandler の設定は英語のときと同じ。
curl -X POST -H 'Content-type:application/json' http://localhost:8983/solr/osaka_shisetsu_tagger/config -d '{ "add-requesthandler" : { "name": "/tag", "class":"solr.TaggerRequestHandler", "defaults":{"field":"name_tag"} } }'
タグ用のデータとして、いつもの大阪の施設情報を利用します。
以下のようなタグ区切りのデータです。
$ head -n 3 /tmp/osaka_shisetsu20140106_noheader.txt 158 34.6164938333333 135.438210722222 http://lodosaka.hozo.jp/class/施設情報 官公庁 国の機関 住之江区 軽自動車検査協会大阪主管事務所 軽自動車検査協会大阪主管事務所 住之江区南港東3-4-62 157 34.6190439722222 135.442191833333 http://lodosaka.hozo.jp/class/施設情報 官公庁 国の機関 住之江区 大阪陸運支局なにわ自動車検査登録事務所 大阪陸運支局なにわ自動車検査登録事務所 住之江区南港東3-1-14 381 34.6109641111111 135.491388722222 http://lodosaka.hozo.jp/class/施設情報 官公庁 国の機関 住吉区 住吉税務署 住吉税務署 住吉区住吉2丁目17番37号 http://www.nta.go.jp/osaka/guide/zeimusho/osaka/sumiyoshi/index.htm
各レコードの1番目(ID)、2番目(緯度)、3番目(経度)、4番目(URL)、8番目(施設名)、10番目(住所)をインデックスします。
タグとして利用するのは施設名です。
bin/post -c osaka_shisetsu_tagger -type text/csv \ -params 'optimize=true&maxSegments=1&separator=%09&encapsulator=%00&fieldnames=id,latitude,longitude,url,,,,name,,address,' \ /tmp/osaka_shisetsu20140106_noheader.txt
タグ付けしてみます。
$ curl -X POST 'http://localhost:8983/solr/osaka_shisetsu_tagger/tag?overlaps=NO_SUB&tagsLimit=5000&fl=id,name,address&wt=json&indent=on' -H 'Content-Type:text/plain' -d '昨日は阪急梅田駅で降りて梅田市税事務所で手続きをしました' { "responseHeader":{ "status":0, "QTime":0}, "tagsCount":2, "tags":[{ "startOffset":3, "endOffset":8, "ids":["5421"]}, { "startOffset":12, "endOffset":19, "ids":["11486"]}], "response":{"numFound":2,"start":0,"numFoundExact":true,"docs":[ { "id":"11486", "name":"梅田市税事務所", "address":["北区梅田1-2-2-700 大阪駅前第2ビル7階"]}, { "id":"5421", "name":"阪急梅田駅"}] }}
(「阪急梅田駅」の住所が無いのは元データがそうなっているからです)