Solrで日本語版Wikipediaのインデックスを作った場合のサイズをTokenizerの設定毎に調べる

はじめに

Solrで日本語の文書を扱う場合に考えなくてはならないことの一つに、Tokenizerをどれにするか、があります。ざっくり言うと、n-gram(だいたいは2-gram)にするか、形態素解析にするか、です。
それぞれの長所、短所はこんな感じです。

n-gram

長所

  • 検索漏れが少ない
  • 未知語に強い

短所

  • nより短いキーワードを扱えない
  • インデックスサイズが大きくなる
  • 検索結果のノイズが多い

形態素解析

長所

  • 検索結果のノイズが少ない
  • インデックスサイズを小さくする余地が大きい

短所

  • 未知語に弱い
  • 入力キーワードに対する完全一致検索が難しい

双方の長所・短所に出てきたインデックスサイズがどれくらいの差になるのかを日本語版Wikipediaを対象に調べてみました。

SolrにWikipediaを投入する

Wikipediaのダンプデータをダウンロード

https://dumps.wikimedia.org/jawiki/
の latest から jawiki-latest-pages-articles.xml.bz2 をダウンロードして展開しておきます。

configset準備

_default をベースに設定ファイルを用意します。

cp -r server/solr/configsets/_default server/solr/configsets/wikipedia 

wikipedia/conf/solrconfig.xml に以下を追加

<lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-dataimporthandler-.*\.jar" />

<requestHandler name="/dataimport" class="solr.DataImportHandler">
  <lst name="defaults">
    <str name="config">solr-data-config.xml</str>
  </lst>
</requestHandler>

Wikppediaインポート用の DataImportHander の設定 solr-data-config.xml を
https://wiki.apache.org/solr/DataImportHandler#Example:_Indexing_wikipedia
を参考にして作成

<dataConfig>
  <dataSource type="FileDataSource" encoding="UTF-8" />
  <document>
    <entity name="page"
                processor="XPathEntityProcessor"
                stream="true"
                forEach="/mediawiki/page/"
                url="data/jawiki-latest-pages-articles.xml"
                transformer="RegexTransformer,DateFormatTransformer">
      <field column="id"        xpath="/mediawiki/page/id" />
      <field column="title"     xpath="/mediawiki/page/title" />
      <field column="revision"  xpath="/mediawiki/page/revision/id" />
      <field column="user"      xpath="/mediawiki/page/revision/contributor/username" />
      <field column="userId"    xpath="/mediawiki/page/revision/contributor/id" />
      <field column="text"      xpath="/mediawiki/page/revision/text" />
      <field column="timestamp" xpath="/mediawiki/page/revision/timestamp" dateTimeFormat="yyyy-MM-dd'T'hh:mm:ss'Z'" />
      <field column="$skipDoc"  regex="^#REDIRECT .*" replaceWith="true" sourceColName="text"/>
    </entity>
  </document>
</dataConfig>

configsetをアップロード

(cd server/solr/configsets/wikipedia/conf && zip -r - *) |curl -X POST --header "Content-Type:application/octet-stream" --data-binary @- "http://localhost:8983/solr/admin/configs?action=UPLOAD&name=wikipedia"

コレクション”wikipedia”を作成

curl 'http://localhost:8983/solr/admin/collections?action=CREATE&name=wikipedia&numShards=1&replicationFactor=1&collection.configName=wikipedia&wt=xml'

インポート開始

管理画面からインポート開始

各Tokenizerの設定

以下の4種類の設定で試してみます。
今回は手っ取り早く上記の手順の「configsetの準備」のところで managed-schema ファイルを編集しています。

CJK bigram

managed-schema の変更箇所

(略)
<pre>
    <fieldType name="text_cjk" class="solr.TextField" positionIncrementGap="100">
      <analyzer>
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <!-- normalize width before bigram, as e.g. half-width dakuten combine  -->
        <filter class="solr.CJKWidthFilterFactory"/>
        <!-- for any non-CJK -->
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.CJKBigramFilterFactory"/>
      </analyzer>
    </fieldType>
</pre>
(略)
<field name="title"     type="string"  indexed="true" stored="false"/>
<field name="revision"  type="pint"    indexed="true" stored="true"/>
<field name="user"      type="string"  indexed="true" stored="true"/>
<field name="userId"    type="pint"     indexed="true" stored="true"/>
<field name="text"      type="text_cjk"    indexed="true" stored="false"/>
<field name="timestamp" type="pdate"    indexed="true" stored="true"/>
(略)

Kuromoji (mode=normal)

辞書通りの分割
(例) 株式会社→「株式会社」

managed-schema の変更箇所

(略)
<pre>
    <fieldType name="text_ja" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="false">
      <analyzer>
        <tokenizer class="solr.JapaneseTokenizerFactory" mode="normal"/>
        <filter class="solr.JapaneseBaseFormFilterFactory"/>
        <filter class="solr.JapanesePartOfSpeechStopFilterFactory" tags="lang/stoptags_ja.txt" />
        <filter class="solr.CJKWidthFilterFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_ja.txt" />
        <filter class="solr.JapaneseKatakanaStemFilterFactory" minimumLength="4"/>
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
    </fieldType>
</pre>
(略)
<field name="title"     type="string"  indexed="true" stored="false"/>
<field name="revision"  type="pint"    indexed="true" stored="true"/>
<field name="user"      type="string"  indexed="true" stored="true"/>
<field name="userId"    type="pint"     indexed="true" stored="true"/>
<field name="text"      type="text_ja"    indexed="true" stored="false"/>
<field name="timestamp" type="pdate"    indexed="true" stored="true"/>
(略)

Kuromoji (mode=search)

複合語を細かく分割
株式会社→「株式」「会社」

managed-schema の変更箇所

        <tokenizer class="solr.JapaneseTokenizerFactory" mode="search"/>

それ以外は mode=normal と同じ。

Kuromoji (mode=extended)

mode=search + 未知語を 1-gram に分割

managed-schema の変更箇所

        <tokenizer class="solr.JapaneseTokenizerFactory" mode="extended"/>

それ以外は mode=normal と同じ。

結果

インデックスサイズ生成時間
CJK5.9GB35分
Kuromoji(normal)3.1GB76分
Kuromoji(search)3.1GB83分
Kuromoji(extended)2.1GB79分

ちなみに、日本語版Wikipedia全記事のテキスト部分のサイズをカウントしてみたところ、約1.4GBでした。

まとめ

Solrで日本語版Wikipedia全記事のインデックスを作成しました。2-gramのインデックスサイズは形態素解析インデックスの約2倍になりました。

Kuromoji(extended)は未知語を1-gramに分割する分他のモードよりもインデックスサイズが大きくなると予想していたのですが、逆に30%強も小さくなりました。ここはもうちょっと調べてみる必要がありそうです。

最近の飲み物事情

こんにちわ。
リエです。

寒い日もありますが、もうすっかり春ですね。
嬉しい反面、花粉が〜!!!という感じです。
わたしは花粉症ではないのですが、年中無休の鼻炎っ子なので、1年中鼻炎と戦っています。(なぜかアレルギー検査で何もでないの!去年鼻炎に耐えられなくてレーザー手術も受けたのに治らなかったの!)

こんなわたしの鼻炎を心配して、大好きな知り合いの方から鼻炎に効くよと「べにふうき茶」というものを昨年いただきました。
本当に本当にありがとうございます(´;ω;`)
何より気持ちがすごく嬉しかったです!
もったいなくて中々開封しなかったのですが、(本末転倒ですよね;ダメなところだわ)最近毎日飲むようになりました

ちなみにべにふうきって何?という方に簡単にご説明。
〜べにふうきとは?〜
べにふうきは「茶農林44号」のことで1993年に野菜茶業研究所によって香りのいいダージリン系「枕Cd86」と「べにほまれ」と呼ばれる茶農林1号をかけ合わせて紅茶用に開発されたものです。結果的には紅茶としてはあまり注目されることはありませんでしたが、緑茶として加工することでメチル化カテキンが多く含まれ抗アレルギー効果があることに注目され、製品化され注目されるようになりました。紅茶とは加工法に違いがあるため、紅茶へ加工した際にはメチル化カテキンは含まれません。日本では紅茶の加工より緑茶の加工のほうが積極的なため、緑茶としての開発が進んだのです。
引用元:https://www.ochanosato.jp/chieinfo/ochanituite/0062/

わたしもいただくまで知りませんでしたが、アレルギーに効果があるそうです。
※あくまでお茶なので絶対にアレルギーに効果があるわけではありません。
医薬品ではありませんし、本記事は一個人の意見・感想となりますのでご了承ください。

味は普通の緑茶で美味しく飲めます。
いただいたべにふうき茶は粉末タイプなのですが、自分の好きな濃さにできるのでとても便利です。わたしは濃いめで飲むのがすき!
濃くした場合は少し時間が経つと粉末が沈殿してしまうので、スプーンを入れっぱなしにして時々混ぜながら飲んでいます。

まだ継続的に飲んでいるわけではないので、わたしのアレルギーに効果があるかはわかりませんが、もし効果がなくても味は好きなので続けて飲みたいなと思っています。

またレポートできたらと思います。
花粉症や鼻炎で悩んでいる方乞うご期待\(^o^)/

江戸堀周辺のランチおすすめ2

お昼は毎日外食のカツラです。

去年のこの時期ぐらいに会社周辺のランチおすすめを投稿したので2です。
https://blog.splout.co.jp/4672/

どうせ食べるなら美味しいものがいい!ということで今も新しいお店を開拓していっていますが、基本的には会社前が近くて楽なので週1、2ぐらいしか他の店に行っておりません。
その中でも定期的に行ってるおすすめのお店を2つ紹介します。

1つ目は「Bullet」

https://tabelog.com/osaka/A2701/A270102/27067203/

麻婆豆腐・週替わりランチ ともに1000円

ここら近辺のランチとしては価格は少し高めですが、麻婆が食べたくなったら迷いなくここに行きます!

前菜 周辺の店の前菜の中では一番好き
麻婆 そこそこ辛めで美味しい

また週替わりランチは他のお店と違って同じものがほとんど並びません!
なのでおいしそうな週替わりをこちらのインスタで見かけたら食べに行きます!
あと12時近辺は人が並んでることがあるので12時半過ぎに行くと大体さっと入れます。
https://www.instagram.com/bullet_higobashi/

2つ目は「asse plus」

https://tabelog.com/osaka/A2701/A270102/27010938/

本日のパスタランチが900円

こちら1つ目の「Bullet」に比べるとそこまで押すわけじゃないですが、パスタを食べたくなったらここに行くぐらいにはおすすめです。

前菜
メイン

以上、個人的にオススメなお店でした!

消費税増税で価格が高くなったらどうしようかと思案中…
最悪外食の頻度を下げてでも質は下げたくない今日この頃です。

Bluetooth5.1の妄想

Bluetooth5.1がでるようです。
Bluetoothは無線イヤホン等、普段何気なく使われている便利な無線テクノロジーです。
このテクノロジーの次期バージョンがでるとのことで何ができそうか妄想してみました。

まず、5.1になることで何が変わるのかですが、以下のようなものがあるようです。
・位置検知機能
・消費電力の節約
・接続にかかる時間の高速化

気になるのが位置検知機能
なんでも方向と距離がcm単位で検出できるようになるとか
これがあれば家の中で鍵や財布を無くさない・・・!
今までも近くにあるよー!というところまでは教えてくれるガジェットがありましたが、方向と距離までわかるようになるのは本当にいいですね!

ということで以下妄想を垂れ流し

どれだけ正確かスイカ割りで使ってみたい!
テクノロジーの無駄遣い感がすごい!

意外と使えそうだったら駅とかに設置して点字ブロックの代わりになったりしないだろうか。
故障とか怖いから無理か…

VRと組み合わせるともっと正確に細かいこともできるのでは…

タイムカプセルと一緒に埋めて紛失防止!
そもそもバッテリーがもたないか・・・

駐車場で自分の車の場所がわかるようにとか

施設で細かなナビゲーションとか

スマホでテルミンが流行る!

とりとめない妄想を垂れ流してみました。
何にしろ登場が待ち遠しい!

初めて風邪と自覚した日に読む話

こんにちわ。
リエです。

少し前の話ですが、2019年風邪始めしました。※もう治りました。
なんか喉がおかしいなぁと自覚してからあっという間に発熱→ダウン。という流れをたどったのですが、世はインフルエンザ(*以下インフル)が大流行中。
弱っているときは絶対インフルになる!ということで、自覚して風邪にかかってしまった日から最速で治し、かつインフルにもならないということに全力で取り組みました。

テレビやWebニュースでもインフル感染予防のことがよく取り上げられていますよね。今回は私が実際に試して効果があったものをご紹介します。
こんなん知ってるわという内容ばかりだと思いますが、ご了承ください。

部屋の湿度を50%に保つ

加湿器と濡れタオルを併用していましたが、湿度計で観察していると濡れタオルだけで約8%湿度があがったので濡れタオルだけで十分部屋の加湿はされます。
部屋の広さでタオルの枚数は調整したらいいと思います。
ただし、あまり部屋を加湿しすぎるとカビの原因になるのでご注意ください。

常飲料は緑茶にチェンジ

緑茶に含まれるカテキンが風邪やインフルなどのウイルスへの抵抗効果があるとされています。普段はルイボスティーを常飲していますが、風邪のときは緑茶を積極的に飲んでいました。

不要な外出は避ける

インフルは飛沫感染と接触感染でうつります。
なので体調が悪いときは不要な外出はせず、人との接触をなるべく避けました。

周りと自分を守るため外ではマスクをし、外したときは新しいマスクに取り替える

周りと自分を守るアイテム、それはマスク!
マスクは隙間があるとそこからウイルスが侵入するので、サイズは合ったものを使いましょう。あとプリーツの間にもウイルスが付着するので、プリーツは伸ばし顔にフィットさせることが大事らしいです。(TVからの受け売り)
そうするとくちばしマスク*って最強なんじゃ(´-`).。oO
*立体マスクのことです。わたしはくちばしマスクと呼んでいます。

うがい・手洗い

これはもうマストですね。

むやみに病院へ行かない

この時期高熱がでるとインフルかもしれないと焦りますよね。
ですが、インフルじゃない場合は病院で新たに病原菌をもらう危険性があるので、少し様子を見てから病院へ行くのがいいと思います。(※あくまで個人の感想です)インフルの特徴である関節痛ですが、風邪で高熱が出たときも関節は痛くなります。でもあきらかインフルの関節痛は違うのです!インフル経験者なら絶対わかる話。

予防接種を受ける

弊社は福利厚生でインフルの予防接種を受けることができます。(ありがたい)
予防接種を受けたからといって絶対にインフルにかからないというわけではありませんが、重症化を伏せぐ効果もあるそうです。

マスクをしていない時のくしゃみの仕方

くしゃみをした時、どうやって抑えていますか?
ほとんどの人は手で抑えてしまうと思うのですが、それは間違いで、手で抑えてしまうとその後手が触れたところにウイルスが付着してしまうので、腕で抑えるのがベストだそうです。
これを聞いてからマスクなしでくしゃみをする時は腕で抑えるようになりました。


という感じで、一般的な予防法ですが、実践したら無事風邪は完治しインフルにもかかりませんでした。でもまだまだ普段大敵なので、引き続き予防に全力を尽くしたいと思います。