[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":"阪急梅田駅"}]
  }}

(「阪急梅田駅」の住所が無いのは元データがそうなっているからです)

コメント