$shibayu36->blog;

クラスター株式会社のソフトウェアエンジニアです。エンジニアリングや読書などについて書いています。

ElasticsearchのAnalyzerを理解するため全文検索の仕組みをシンプルに考える

 Elasticsearchを使おうとしているとAnalyzerという概念が出てくるが、このAnalyzerという概念は最初理解することが難しかった。全文検索の仕組みを理解すれば分かるだろうと思い、https://speakerdeck.com/johtani/elasticsearchru-men?slide=5http://www.atmarkit.co.jp/ait/articles/1111/18/news148.html の記事などを読んで勉強してみたものの、こちらもいろんな言葉が出てきて非常に混乱した。例えば転置インデックス、tf-idf、トークナイズ、ストップワードN-Gram、正規化などといった言葉が出てくる。

 いろいろ調べてみて整理すると、全文検索の技術には、なぜ検索ができるかの話以外に、類似度の話、検索を高速に行うための話、あいまいな検索に対応する話など、いろんな話題を含んでいるために理解が難しいのではと感じた。そこで、今回はなぜ検索ができるかをシンプルに自分の言葉でまとめることによって、理解を深め、Analyzerの概念も理解してみたい。

 ただし、僕自身は全文検索について専門ではないので、間違っていることがあれば指摘していただけると嬉しい。

なぜ検索できるかシンプルに考える

 自分で全文検索の仕組みをシンプルに言語化してみると、以下の3行にまとめられるのではと感じた。

  • まず文章を、前処理 -> トークン分割 -> トークンごとの後処理という3段階の処理にかけて、文章に含まれるトークン群を作る
  • 検索クエリを同じように、前処理 -> トークン分割 -> トークンごとの後処理という3段階の処理にかけて、検索クエリに含まれるトークン群を作る
  • あとは検索クエリに含まれるトークン群が、文章のトークン群に含まれているなら検索にヒットする


 これだけだとわかりづらいので例を使って考えてみる。例えば、「DVD版秒速5㌢メートルの感想ブログ」という文章があったとする。この時、全文検索をするなら、大文字小文字は関係なく検索にヒットさせたいし、半角全角も無視したい。また、助詞の「を」とかでヒットしても意味がなさそうなので省きたい。これらを満たすためには文章に対して次の処理を行いたいと思うだろう。

  • 前処理として、アルファベットは小文字化、全角文字は半角に、「㌢」などのワードも「センチ」に変換したい
  • 日本語検索ができるように、品詞単位でトークン分割したい
  • トークン分割した中から、助詞は意味なさそうなので省きたい

 文章のトークン群を作るイメージは以下のとおり。最終的に「dvd」「版」「秒速」「5」「センチメートル」「感想」「ブログ」というトークン群が得られた。

f:id:shiba_yu36:20160814121152j:plain


 次に検索クエリ側である。「秒速5センチメートル」という検索クエリも同じような処理にかけられる。これによって「秒速」「5」「センチメートル」というトークン群が得られる。この時、検索クエリの「秒速」「5」「センチメートル」は文章のトークン群の中に全て含まれる。そのため、検索にヒットする。

 別の例として、「感想 秒速5センチメートル」と検索したとする。この時ホワイトスペースの処理は別で行う必要はあるのだが、それを行うとすると「感想」「秒速」「5」「センチメートル」というトークン群が得られる。これも文章のトークン群に含まれるので、検索にヒットする。

 さらに「秒速5センチ」と検索したとする。この時「秒速」「5」「センチ」というトークン群が作られる。しかし、この時文章には「センチメートル」というトークンはあるものの、「センチ」というトークンは含まれないので検索にヒットしない。


 ここまで理解できれば、あとは前処理とトークン分割とトークンごとの後処理の組み合わせで自分の好きにトークン群を作れるということが分かる。それぞれの処理には例えば以下のようなものがある。

  • 前処理 : 辞書を使ったワード変換、HTMLタグの除去など
  • トークン分割 : 日本語の品詞での分割、N文字ごとの分割(N-gram)、ホワイトスペースでの分割など
  • トークンごとの後処理 : 必要ないトークンの除去、トークンをさらにN文字ごとに分割、漢字の読みがなをさらにトークンに追加など


 以上から、文章と検索クエリの両方共からトークン群を作り、検索クエリのトークン群が文章のトークン群に含まれていたら検索にヒットするということが分かった。もちろん応用として検索クエリのトークン群のうち一部が含まれていたらOKとか、トークンを変形させてあいまい検索にも対応するとかそのようなことも可能だろう。最後の例で「秒速5センチ」ではヒットしないと書いたが、トークン群の作り方によってはそれでもヒットさせるとかもできるだろう。

Anaylzerについて考える

 ここでElasticsearchのAnalyzerに戻って考えてみる。すると、以上で説明したものに完全に対応していることが分かる。

 Analysis and Analyzers | Elasticsearch: The Definitive Guide [2.x] | Elastic を見ると、Analyzerの中にはCharacter filters、Tokenizer、Token filtersというものがある。この説明を見ると、前処理 = Character filters、トークン分割 = Tokenizer、トークンごとの後処理 = Token filtersとなっている。図で表すと先ほどとほぼ変わらず以下のとおりである。

f:id:shiba_yu36:20160815101616j:plain

 これにより、ElasticsearchのAnalyzerは文章からトークン群を作る処理を定義するものであり、それは3つのプロセスに分かれ、プロセスごとにやることを組み合わせることでいろんなトークン群を作ることができる、と理解することが出来た。

まとめ

 今回は全文検索の仕組みについて、自分の言葉でシンプルに考えてみるということをしてみた。またまとめてみたことでAnalyzerをさらに理解することが出来た。

 僕は全文検索について専門ではないので、間違っている部分もあるかもしれない。もし間違っていたら指摘してもらえると助かります。

論理的な文章の技術を学ぶため「理科系の作文技術」を読んだ

最近ブログで文章を書く時にどのように書けばよいか迷うことが多いため、久しぶりに「理科系の作文技術」を読んだ。昔はあまり文章を書いてない時に読んだのでピンと来ないことが多かったが、今回はブログをずっと書き続けていたおかげか、面白く感じるポイントが多かった。

論理的な文章を書くために重要な技術が学べるので、研究論文を書く人やブログを書く人、仕事で文章を書く人全てにおすすめできる。

特に面白いと感じたのは以下の3点だ。この点について自分の言葉でまとめてみたい。

  • 文書を書く前の準備作業
  • 序論に必要なこと
  • 意見を記述するときの書き方

文書を書く前の準備作業

この本では文書を書く前にまず準備作業をすることが大事だと述べている。もしそれを無視していきなり書きはじめると、文章の失敗の原因になることが多いようだ。


準備には次の段階を踏む。

  • 文書の役割の確認
  • 主題の選定
  • 目標規定文
  • 材料あつめ

まず文書の役割を確認しなければならない。その文書が誰に向けて書くものなのかによって前提は異なるし、公開の場で自分の意見を述べるものなのか、社内向けのマニュアルかなど、目的によっても書くべきことは異なる。

役割を確認したら主題を選定する。主題とはその文書で主として何を論じるのかというものである。基本的に1つの文書では1つの主題に集中すべきとされている。

その後、目標規定文を作る。目標規定文とは、自分は何を目標としてその文書を書くのか、そこで何を主張しようとするのかを熟考して、それを一つの文にまとめて書いたものである。

最後に材料集めをする。これはいろいろと調べながらメモをとるなり、図を書いてみたり、そういう作業である。


これらの作業の中で、僕は目標規定文の設定が重要と感じた。文章を書いたり、プレゼンテーションを準備したりする最中に、話が逸れてしまい、結局何を伝えたいのか分からないものになることがよくある。そのため、最初にこの文章で何を伝えたいかを一文ではっきりさせることにより、ゴールが決まり、一貫した文章を書くことができるのだろうと感じた。

序論に必要なこと

この本では、序論・本論・結びという構成で、どのように書くと良いか3章に書かれていた。その中で、序論に必要なことが述べられている部分が非常に面白かった。

この本では、序論には以下の二つが必要とされている。

  • (1)読者が本論を読むべきか否かを敏速・適格に判断するための材料を示す
  • (2)本論にかかる前に必要な予備知識を読者に提供する

(1)はつまり文章の要旨を最初に示すということらしい。最近流行っていたTL;DRもこれに近いと思う。

(2)の予備知識として、よく要求されるのは次のものであるようだ。

  • 本論の主題となる問題は何か
  • その問題をなぜ取り上げたか
  • その問題がなぜ重要か
  • 問題の背景はどんなものか
  • どういう手段によってその問題を攻めようとするのか


ここまで本で説明されていて、非常に参考になる内容ではあるが、しかしこれを読んでも序論をうまくまとめるのは難しい。序論がうまく書けないと、そもそも読んでもらえないことにつながるので、とにかく多くの文章を書きながら書く技術を洗練させていくしかないと感じた。

意見を記述するときの書き方

この本では、理科系の文章では事実と意見を明確に分けて、正しく書き分けることは重要であると書かれている。その中で意見を記述するときの書き方が参考になった。


まず、意見は、「私は〜と考える」という書き方が基本である。例えば、「私はこれが最良の方法であると考える」などである。それを基本とした上で次のルールがある。

  • 意見の内容の核となることばが主観に依存する修飾語である場合には、基本形の頭(私は)と足(と考える)を省くことが許される
  • そうでない場合には頭と足を省いてはいけない

主観に依存する修飾語というのは、例えば「すぐれた」や「おいしい」などの言葉である。もしこれらの言葉があれば「私は」と「と考える」は省いても良い。しかしそれらの修飾語がなければ、頭と足を省いてしまうと、意見の記述が事実の記述に変わってしまうので、それはしてはいけないということのようだ。


意見の記述方法についてはこのように述べられていたが、意見の記述を正しく行うのは大切であると感じる。なぜなら、自分の意見を事実かのように述べて炎上しているのをよく見るからだ。

また逆に考えて、意見を正しく記述していない文章も多いだろうから、記事を読む側の立場として、その文が事実であるか意見であるかは常に考えなければならないと感じた。

まとめ

今回は「理科系の作文技術」を読んで、その中で面白かった内容について自分の言葉でまとめてみた。

ただ、文章の構成という観点では非常に参考になったが、もう少し細かい単位でどのような表現を使うと分かりやすい文章になるのかといったテクニックについては学ぶことが出来なかった。このことについては、以下の本が良さそうだったので続いて読んでみようと思う。

読書メモ

以下は自分が読んでいた時の読書メモである。参考のため貼っておく。

  • 仕事の文書を書く時には、事実と意見との区別を明確にすることがとくに重要である 7
  • 文章を書く前に、まず準備作業が必要 13 ☆
    • 文書が何のためのものか確認する 15
    • 主題(その文書で主として何を叙述するか、何を論じるのか)を選定する。1つの文書は1つの主題を 17
    • 目標規定文を書く。自分は何を目標としてその文書を書くのか、そこで何を主張するかを、一文にまとめて書いてみる 22
  • 基本的には序論・本論・結びという構成 34
  • 序論で必要なのは 35 ☆
    • 読者が本論を読むべきか否かを敏速・適格に判断するための材料を示し、
      • Abstractのようなもの。本文のサマリー
    • また本論にかかる前に必要な予備知識を読者に提供する
      • 本論の主題となる問題は何か
      • その問題をなぜ取り上げたか
      • その問題がなぜ重要か
      • 問題の背景はどんなものか
      • どういう手段によってその問題を攻めようとするのか
  • 書くときは概観から細部へ。まずおおづかみな説明を与えて読者に概観を示してから、細部の記述に入る 42
  • パラグラフとは、ある一つのトピックについてある一つのこと(考え)を言うものである 64 ☆
    • パラグラフには、そこで何を言おうとするか一口で述べるトピック・センテンスを含む
  • トピック・センテンスは、できればパラグラフの最初に書きたい 64
  • トピック・センテンスをパラグラフの最初に持ってくることを忠実に守るのは難しい 66
    • 先行するパラグラフとのつなぎの文を最初に書かなければならない場合がある
    • トピック・センテンスを第1文とするパラグラフばかりが続くと、文章が単調になる傾向がある
    • 日本語の文の組み立てがこれに向かない
  • 事実の記述での注意点 107
    • その事実に関してその文書のなかで書く必要があるのは何々かを十分に吟味せよ
    • ぼかした表現に逃げずに、できるだけ明確にかけ
    • 事実を記述する文はできるだけ名詞と動詞で書き、主観に依存する修飾語を混入させるな
  • 意見の記述は、「私は〜と考える」という形で書くのが基本 108
  • 意見の記述では 110 ☆
    • 意見の内容の核となることばが主観に依存する修飾語である場合には、基本形の頭(私は)と足(と考える)を省くことが許される
    • そうでない場合には頭と足を省いてはいけない

「幼馴染の自動販売機にプロポーズした経緯について。」読んだ

カクヨム初の書籍化作品ということで読んだ。

タイトルだけ見ると何を言ってるのかわからない感じだったけど、つまり自動販売機の精との恋愛物の話だった。今まで付喪神との恋愛みたいなのは見たことはなかったので新鮮。

もともとこの作品は、昔他のコンテストに応募していたけど、そこでは書籍化にならず、カクヨムに投稿したところ書籍化されたみたい。こういう感じでクリエーターが活躍できるところがどんどん増えたらなあと思う。

kakuyomu.jp