【Visual Studio Code】VSCodeで日頃利用しているプラグインの紹介
Auto Close Tag

HTML End Tag Labels

Live Sass Compiler
vscode-icons
zenkaku

前回紹介した 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":"阪急梅田駅"}] }}
(「阪急梅田駅」の住所が無いのは元データがそうなっているからです)
梅酒といえばで有名な、あの!チョーヤ梅酒を自分で作ることが出来るという予約困難な梅体験専門店「蝶矢」に行ってきました。
今回は実際に体験した内容を、ご紹介していきたいと思います。
店内に入りますと店内奥に体験スペースがあり、作り方の説明POPや梅のヘタを取るピック等が用意されています。
壁には梅酒を作って1日目から7日目までの見本瓶が飾られています。
中身は本物!
スタッフの方の説明を聞きながら、ひとつひとつ試飲してオリジナル梅酒の材料を決めます。
砂糖と梅どちらも5種類から選べます。
梅の写真を撮り忘れたのでテキストでご紹介。
・完熟南高(かんじゅくなんこう)
・古城(こじろ)
・有機南高(ゆうきなんこう)
・鶯宿(おうしゅく)
・パープルクイーン
砂糖を選ぶときは完熟南高がベース、梅を選ぶときは氷砂糖がベースのシロップで試飲します。
そして最後にお酒を選びます。
こちらも写真を撮り忘れたのでテキストでご紹介。
・ウォッカ
・ブランデー
・ホワイトラム
・ジン
全て選び終わったら待ちに待った梅酒作りに入ります。
マイボトルシート記入後、材料を用意してもらい梅のヘタをほじほじしたら瓶に入れていきます。
砂糖と梅を入れ終わったら最後にお酒を入れて完成です!
完成した梅酒達です。
かわいー。
使用した瓶は箱付きで購入するのですが、購入した箱+瓶を持参すれば次回作りに来た時に再び購入する必要がなく何度でも繰り返し使えるそうです!
より美味しい梅酒にするために、沈殿した砂糖を梅に触れるように撹拌するという作業が2週間毎日必要となります。
私は過保護に1日3回ほど撹拌してお世話しています。
撹拌という工程を経て1ヶ月後に本当の梅酒が完成です!
梅体験専門店「蝶矢」には特別な梅酒が販売されています。
京都店で5本、鎌倉店で5本の1日限定10本のみ販売されている「蝶矢 限定熟成」という名の梅酒です。
3年以上の年月をかけて作られる特別な梅酒が運良く、残っていたので即決で購入しました。
早く飲んでみたいけど、特別という名の魔法にかかりいつまでたっても開封出来る気がしない。。
写真のセンス皆無なので、本来のかっこいいビジュアルは以下の記事をご覧ください。
https://www.choya.co.jp/news/1714/
梅体験専門店「蝶矢」とってもよかったです。
自分で選んで作れるのが楽しいのであっという間に時が過ぎます。
体験に行かれるか迷われている方は参考にしていただければ嬉しいです。
https://choyaume.jp/
Solr には Tagger Handler というテキストへのタグ付けの機能があります。
タグ付けはかなり幅の広い技術で、高度な自然言語処理を用いてアノテーションを与える手法もある一方で、辞書として与えられた単語を単純に抽出する手法もあります。Solr の Tagger Handler は後者です。
Tagger Handler ではSolrのインデックスを辞書として使い、Tagger Handler へ送られたテキスト内に含まれる辞書の単語をタグ付けして出力します。与えられたキーワードがインデックスされたドキュメントに含まれるかどうかを調べる検索処理と対照的ですが、要素の技術は共通しています。
Solr リファレンスには Tagger Handler のチュートリアルが含まれているので、それに沿って動作を確認してみます。
まず geonames というコレクションを作ります。
bin/solr create -c geonames
スキーマを API で定義します。
curl -X POST -H 'Content-type:application/json' http://localhost:8983/solr/geonames/schema -d '{ "add-field-type":{ "name":"tag", "class":"solr.TextField", "postingsFormat":"FST50", "omitNorms":true, "omitTermFreqAndPositions":true, "indexAnalyzer":{ "tokenizer":{ "class":"solr.StandardTokenizerFactory" }, "filters":[ {"class":"solr.EnglishPossessiveFilterFactory"}, {"class":"solr.ASCIIFoldingFilterFactory"}, {"class":"solr.LowerCaseFilterFactory"}, {"class":"solr.ConcatenateGraphFilterFactory", "preservePositionIncrements":false } ]}, "queryAnalyzer":{ "tokenizer":{ "class":"solr.StandardTokenizerFactory" }, "filters":[ {"class":"solr.EnglishPossessiveFilterFactory"}, {"class":"solr.ASCIIFoldingFilterFactory"}, {"class":"solr.LowerCaseFilterFactory"} ]} }, "add-field":{"name":"name", "type":"text_general"}, "add-field":{"name":"name_tag", "type":"tag", "stored":false }, "add-copy-field":{"source":"name", "dest":["name_tag"]} }'
Tagger Handler を API で設定します。
curl -X POST -H 'Content-type:application/json' http://localhost:8983/solr/geonames/config -d '{ "add-requesthandler" : { "name": "/tag", "class":"solr.TaggerRequestHandler", "defaults":{"field":"name_tag"} } }'
http://download.geonames.org/export/dump/cities1000.zip
からサンプルデータをダウンロードし、/tmp に展開しておきます。
サンプルデータを geonames コレクションに投入します。
bin/post -c geonames -type text/csv \ -params 'optimize=true&maxSegments=1&separator=%09&encapsulator=%00&fieldnames=id,name,,alternative_names,latitude,longitude,,,countrycode,,,,,,population,elevation,,timezone,lastupdate' \ /tmp/cities1000.txt
タグ付けの動作を確認します。
$ curl -X POST \ 'http://localhost:8983/solr/geonames/tag?overlaps=NO_SUB&tagsLimit=5000&fl=id,name,countrycode&wt=json&indent=on' \ -H 'Content-Type:text/plain' -d 'Hello New York City' { "responseHeader":{ "status":0, "QTime":1}, "tagsCount":1, "tags":[{ "startOffset":6, "endOffset":19, "ids":["5128581"]}], "response":{"numFound":1,"start":0,"docs":[ { "id":"5128581", "name":["New York City"], "countrycode":["US"]}] }}
リファレンスによると、Tagger Handler へのリクエストではインデックスのどのフィールドを辞書として扱うかを示す filed パラメータが必須となっていますが、このリクエストには field パラメータが含まれていません。その代わりに Tagger Handler の設定で以下を指定しているため、デフォルトで name_tag フィールドが使われます。
"defaults":{"field":"name_tag"}を指定しているため、デフォルトで name_tag フィールドが使われます。
複数のエンティティが含まれる場合も試してみました。
$ curl -X POST 'http://localhost:8983/solr/geonames/tag?overlaps=NO_SUB&tagsLimit=5000&fl=id,name,countrycode&wt=json&indent=on' -H 'Content-Type:text/plain' -d 'Hello New York City. Hello Los Angeles.' { "responseHeader":{ "status":0, "QTime":0}, "tagsCount":2, "tags":[{ "startOffset":6, "endOffset":19, "ids":["5128581"]}, { "startOffset":27, "endOffset":38, "ids":["3882428", "3801497", "3998147", "3998148", "8858843", "3705542", "3705544", "1705545", "5368361"]}], "response":{"numFound":10,"start":0,"numFoundExact":true,"docs":[ { "id":"3882428", "name":["Los Ángeles"], "countrycode":["CL"]}, { "id":"3801497", "name":["Los Ángeles"], "countrycode":["MX"]}, { "id":"3998147", "name":["Los Angeles"], "countrycode":["MX"]}, { "id":"3998148", "name":["Los Angeles"], "countrycode":["MX"]}, { "id":"8858843", "name":["Los Ángeles"], "countrycode":["MX"]}, { "id":"3705542", "name":["Los Ángeles"], "countrycode":["PA"]}, { "id":"3705544", "name":["Los Ángeles"], "countrycode":["PA"]}, { "id":"1705545", "name":["Los Angeles"], "countrycode":["PH"]}, { "id":"5128581", "name":["New York City"], "countrycode":["US"]}, { "id":"5368361", "name":["Los Angeles"], "countrycode":["US"]}] }}
“New York City” と “Los Angeles” の両方がヒットしました。様々な国の “Los Angeles” がタグとして出力されています。
Tagger Handler へのリクエストにはフィルタクエリを含めることができます。
$ curl -X POST 'http://localhost:8983/solr/geonames/tag?overlaps=NO_SUB&tagsLimit=5000&fl=id,name,countrycode&wt=json&indent=on&fq=countrycode:US' -H 'Content-Type:text/plain' -d 'Hello New York City. Hello Los Angeles.' { "responseHeader":{ "status":0, "QTime":0}, "tagsCount":2, "tags":[{ "startOffset":6, "endOffset":19, "ids":["5128581"]}, { "startOffset":27, "endOffset":38, "ids":["5368361"]}], "response":{"numFound":2,"start":0,"numFoundExact":true,"docs":[ { "id":"5128581", "name":["New York City"], "countrycode":["US"]}, { "id":"5368361", "name":["Los Angeles"], "countrycode":["US"]}] }}
先程のリクエストに fq=contrycode:US を追加することで、結果を US に限定できました。
Webデザインをメインにやってこられた方は、印刷物に苦手意識を持っている方も多いのではないでしょうか?私自身、紙での仕事は苦手意識が強くあります。
苦手意識の一つとして専門用語を曖昧にしているのも一つの要因かもしれません。
なので、ここで改めて確認しようと思います。
書籍や雑誌などのページものを開いた時に対になる、左右ページのこと。
新聞・雑誌などで、目立つように大きな活字を用いた見出し。
章全体を総括した見出し。
本文に入るまえのタイトルの下、近くにある、本編へ「誘導する、リードする」ための文章のこと。
本編、コンテンツの中心となる文章のこと。
文字の大きさは、大体11Q~13Qくらい。
写真・図版に添えられた説明文のこと。
(8Q、9Qなどの小さいQ数)
文字の大きさを示す日本独自の単位のこと。
(1Q = 0.25mm。4Qで1mm)
歯とは、文字と文字の間隔(字送り)や行と行の間隔(行送り)のサイズを表す日本独自の単位のこと。
(1H = 0.25mm。4Hで1mm)
ページ番号のこと。
本文を区切るために入れる、短めの文章。新聞・雑誌・書籍などで用いられる記事の先頭に本文とは異なった目立つ体裁で組まれた見出しのこと。
ページの上下の余白部分に印刷される書籍名、章節などの見出しのこと。
1章、2章、などの章立てや、記事のタイトルを小さめに入れる。
文字組みにおいて画像や本文の間に入れるアイキャッチ的な文字のこと。
コンテンツの内容をひきたたせる文章のこと。
「天」は誌面の上側をのこと。
「地」は下側のこと。
本・雑誌などの折り込まれている、内側のこと。
「ノド」の反対方向、本の外側のこと。
書籍などのページ紙面において、余白を除いた印刷面のこと。
天地左右の余白。印刷物の版面の周囲の余白のこと。
いかがでしたでしょうか。
以上、参考になれば幸いです。