TextRetrieval と 検索エンジン1-1 Natural Lanaguage Content Analysis & 1-2 テキストアクセス

# はじめに
コロナで、在宅勤務が始まりました。（実は、2月末から）通勤時間もなくなり、変わりに何か始めようと思って、[coursera の text retrieval and search engine](https://ja.coursera.org/learn/text-retrieval) というコースを受講することにしました。
このコースを選んだのは、仕事柄 Apache Solr をよく使うので、検索エンジンという物を、体系的に学ぶにはちょうどいいのでは・・・？と思ったからです。

ただボーッとみただけでは自分の知識にならないので、コースで学んだことを自分の言葉で説明できるようになろうと思い、qiita で記事にしてみることにしました。

６週間にわたるコースだったので、何回かに分けて、最初から順に簡単に説明していきます。（続かないかもしれません・・・苦笑）
そのため、流れは、上記コースのシラバスに従います。（従いますが、スキップすることもあるかもしれません。。。）

私の言葉は、曖昧でわかりにくいことがあるかもしれませんし、
理解が及ばず間違っていることもあるかもしれません。



そんなモノでもよろしければ、お付き合いくださいませ。m(_ _)m

# 1-1 Natural Language Content Analysis 
検索エンジンといえば、Google を思い浮かべる方が多いと思いますが、
Google や、ElasticSearch、Apache Solr などが、知名度（と対象ユーザー）の違いはあれど、有名な検索エンジンです。
検索エンジンは、しばしば、Natural Language Processing（以下、NLP）のアプリケーションとして紹介されることがあります。ですが、NLPのアプリケーションといえば、SiriやOK,Google でしょうか？

検索エンジンは、Siriや OK,Google よりも昔からあるNLPのアプリケーションです。
[AltaVista](https://en.wikipedia.org/wiki/AltaVista) や [inktomi](https://en.wikipedia.org/wiki/Inktomi) などが、1995年あたりから、存在します。
おおよそ、25年前から、検索エンジンは人間が書いたドキュメント・コンテントを扱います。
より早く、人が欲しいドキュメントを届けるために、人間使う言語（Natural Language）の分析は、検索エンジンにとって重要な課題の一つなのです。

## NLPは難しい！
NLPは、一般的に次のような処理をすることをいいます。

- Lexical Analysis (part-of speech tagging)　品詞タグ付け
    - 単語辞書を元に、各単語が何の品詞をもつのかを判定するタスク
- Syntactic Analysis (Parsing) 構文解析
    - 文章がどんな構造をしているか判定するタスク
- Semantic Analysis 意味解析
    - 文章がどんな意味を持っているのかを判定するタスク
- Inference 推論
    - すでに知っていることから未知のことを予測するタスク
- Pragmatic Analysis 語用論解析
    - 言語表現とそれを用いる使用者や文脈との関係を解析するタスク　（[wikipedia より](https://ja.wikipedia.org/wiki/%E8%AA%9E%E7%94%A8%E8%AB%96)）
    - 何かを成し遂げるために、言葉を発するわけなので、なぜそのようなことを言ったのか予測するタスク

自然言語は、人間同士のコミュニケーションを効率的に行うためにできています。
その結果として、話してと聞き手、両者の間にある`共通の常識(common knowledge)`や`曖昧性(ambiguities)`を残したままやりとりを行います。聞き手や読み手が正しく解釈するであろうと期待し、その期待に答え合うのが、人間のコミュニケーションなのですね！

しかし、足し算や掛け算、等しいかそうじゃないかを判断することしかできないコンピュータにとって、人間が、残したままにする聞き手や読み手への期待に答えることができないのです。
だから、コンピュータにとってNLPは、難しいのです。

例えば、コンピュータにはこんなことが難しいのです。

- 単語レベルの曖昧性（word-level ambiguity）
    - 英語だと、"text"って名詞か動詞か、単語から判断できません。(Ambiguous POS)
    - 英語だと、"root"って"根っこ"なのか、"数学の√"なのか判断できません。(Ambiguous sense)
- 構造レベルの曖昧性 (syntactic ambiguity)
    - "Natural Language Processing" と "Language Processing is natural" は同じでしょうか？(Modification)
    - "A spy saw the cop with the gun" スパイと警察官どちらが銃を持っていますか？ (PP Attachment)
-  照応の曖昧性 (Anaphora Resolution)
    -  "Mike tells Bob to buy a computer for himself"
        - himself は Bob なのか？ Mikeなのか？
        - 余談：英文を読む時も、Anaphora Resolution は苦労しますよね・・・。
        - 余談：英語の単数形複数形・三単元のsなどは、この曖昧性を減らすためにある文法だと個人的には思っています。（たかがsされどs）
      
- 前提の理解(Presupposition)
    - 「彼はボルダリングをやりたい」という文章は、彼は何らかの理由で今ボルダリングがやれないという意味が伴っています。
    

日本語は、主語があったり無かったり、文脈自由文法なので、これ以外にも主語の推測が必要だったり、PP Attachment も明らかに難しいです。

余談：日本語で文章を書いていると、簡単に「なぜやってみようかと思ったかというと、、、検証してみることにしました。」という摩訶不思議なことが起きてしまいます。←私もよくやって指摘されます。

## NLPの精度
さて、英語でもNLPが難しいことは理解していただけたかと思います。
では、さまざまな曖昧性を相手に、現在のNLPはどのくらいの精度が出せるのでしょうか？

- Lexical Analysis (part-of speech tagging)　品詞タグ付け　
    - 97% くらいの精度です。
    - 日本語ですと、[Kuromoji](https://www.atilika.com/ja/kuromoji/) が Solr や Elasticsearch で解析するときによく使われますが、結構精度が良いです。
    - 「すもももももももものうち」も、下の写真のようにきれいに品詞タグ付を行います。
![Screen Shot 2020-05-09 at 1.02.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75208/496d746a-4489-cdc5-1bd4-5244951f509b.png)


- Syntactic Analysis (Parsing) 構文解析
    - 大体、~ 90% ぐらいのようです。
    - 長い文章の方が精度が落ちる傾向にあります。
- Semantic Analysis 意味解析
    - 特的のドメインに対しては、entity を抽出したり、そこそこの精度で行えるそう。
- Inference 推論 
    - 基本的に、難しいです。
    - 精度は、そのドメインに依存します。
- Pragmatic Analysis 語用論解析
    - めっちゃ、難しい・・・。
        - 人間にも難しい・・・。

基本的に、SNSデータは、精度が落ちます。（まぁ、自由につぶやきますからね・・・。）
これらの結果は、ニュース記事を使って測定した結果らしいです。

この講義は、ちょっと昔の講義なので、[今はもう少し精度](http://nlpprogress.com/english/part-of-speech_tagging.html)が上がっているかもしれませんが、
Inference や Pragmatic Analysis (語用論解析)　などは、依然として精度が出せていないと思います。。。。。


## 何ができないか
- 100% 正しい POS tagging はできないとされています。
    - He turned `off` the highway v.s he turned `off` the fan. 
- 100% 正しい Syntactic Analysis はできないとされています。
    - PP Attachment の問題が解決できません。
- 的確な意味解析はできないとされています。
    - 「ジョンはレストランを所有しています(John owns a restaurant.)」の"own"を的確に定義できるでしょうか？


より一般的な自然言語処理を行おうとすればするほど、精度を出すが、難しいく浅くなってしまいます。ドメインを絞れば、高精度な自然言語処理が行えますが、それでは、scale up しません。

## テキスト検索のための NLP

- テキスト検索のために使われる NLP は、robust で効率的である必要があります。
    - そのため、浅くなりがちです。

- `Bag of Words` 表現は、多くの検索タスクを行う上で十分有用だったりします。（全てではありません。）
- いくつかのテキスト検索の技術は、NLPが直面する問題に対処できたりします。
       - `java` という単語だけだと、コーヒーかプログラミング言語か判断ができませんが、"java　applet"のように二つのキーワードによって、`コーヒーではないと判断`できます。
- でもね、`複雑な検索技術には、より深いNLP`が必要なんです。

# 1-2 テキストアクセス
## 関係あるテキストデータへのアクセス
一般的に、検索エンジンやリコメンドシステムは、すごい大まかですが、次のような位置付けにあります。

![SearchEngine_and_Text_Retrieval (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75208/5cece77a-e04e-9760-cc63-8fb143c1d6e5.jpeg)


検索エンジンやリコメンドシステムなどの`テキストインフォメーションシステム`は、どのようにすれば、ユーザーが関係あるテキスト(Relevant Text)にアクセスするのを助けてあげられるでしょうか？

これは、2つのモードがあります。
Pull モードと Push モードです。

- Pull モード　
    - 検索エンジンが該当します。
    - ユーザーが最初にアクションをとります。
        - Ok,Google や、Hi,Siri や キーワードをいれないとリスポンスが得られませんよね？
    - その場限りの情報ニーズ。
        - ユーザーの興味を予測するのがより難しくなります。
- Push モード
    - リコメンドシステムやニュースモニタリングなどが該当します
    - システムが、最初にアクションをとります。
    - 長期的な情報ニーズか、ユーザーについて詳しく知っている必要があります。
        - リコメンドしたときに、もう興味ないでは、困るのです。

Pull モードには、その中でもQuery StrategyとBrowsing Strategyに分けることができます。

- Quering
    - ユーザーがキーワードを入力します。
    - システムは、関係がありそうなドキュメントを返します。
    - ユーザーがどのキーワードを使うべきかわかっているときに有効。
- Browsing 
    - ユーザーは、必要な情報をドキュメントの構造を辿ることで、閲覧します。
    - ユーザーがどのキーワードが適切かわからないとき、ただ情報を閲覧したいだけのときなどに有用。

## Information Seeking 
一重に検索エンジンと言っても、どんなユーザーを対象とするのかで、Quering StrategyがいいのかBrowsing Strategyがいいのか異なります。

![SearchEngine_and_Text_Retrieval (4).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75208/722a343c-6434-12cf-5ab0-61bfdf87182d.jpeg)

PushモードとPullモードを掛け合わせることができれば、より賢い Information System ができるかもしれません。 


#終わりに

今回はここまで、、、。

:point_down:　続きできました！:point_down:
[TextRetrieval と 検索エンジン1-3 文書検索の問題 & 1-4 Text Retrievalモデル概要](https://qiita.com/28kayak/items/dca8dfed73d6626773f9)

楽しんでいただければ幸いです。

拝読ありがとうございました。