あなたの文章に合った「いらすとや」画像をレコメンド♪（機能概要編）

# どんなアプリ？

みんな大好き「[いらすとや](https://www.irasutoya.com)」さん。
でも、キーワードによる画像検索に苦労していませんか？

その苦労を解決するために、
文章を与えると、それに近い意味を持った「[いらすとや](https://www.irasutoya.com)」画像を探してレコメンドしてくれるアプリを作ってみました。
例えば、「暴走したAI」という文章を入力すると、その文章の意味に近い画像として次のものがレコメンドされます。

<img width="799" alt="暴走したAI.png" src="https://qiita-image-store.s3.amazonaws.com/0/26062/7d90cd39-0dc0-6ba3-1c8a-83eeef12b976.png">


注意して見ていただきたいのですが、**検索結果の説明文に「暴走」というキーワードはどこにも出てきません**。
でも、人間が読めば「暴走したAI」に意味合いが近いと判断する説明文が付いた画像が提示されています。

そう、今回作るのは、いわゆるキーワード型検索エンジンでは**ありません**。
言葉の意味をベクトルで表現する分散表現という機械学習技術（自然言語処理技術）を活用することで、与えられた文の意味に近い説明文を持った画像を探し出します。
つまり、**キーワードがマッチしなくても、文全体の意味が近ければ探すことができる**。これが本アプリの特徴です。

このアプリは、準備ができたらWebサービスにして公開しようかと思っています。
こういうアプリを維持の手間がかからず、安く、安全に公開するには、何を使うのがいいのでしょうか。
詳しい方、ご教示いただけましたら幸いです！


# シリーズの目次

1本の記事にするには内容が多いため、4回に分けて解説します。

1. 機能概要編（本記事）
1. [アルゴリズム解説編](https://qiita.com/sonoisa/items/775ac4c7871ced6ed4c3)
1. [応用編](https://qiita.com/sonoisa/items/27527c741ae93ddd6df4)
1. 言語処理100本ノックのその先編


# 機能概要編

初回の今回は、アプリの実行例をお見せすることで便利さを理解していただき、その後、おおまかな技術的な仕組みについて解説し、次回へと繋ぎます。

## 実行例

実際に文章を与えてみたときのレコメンド結果をいくつかご紹介します。
もちろん外すこともありますが、個人的になかなか妥当な結果が得られていると感じています。

### 実行例1:「想像以上に大きかった」
どれもそこそこ「想像以上に大きい」というニュアンスを捉えられているのではないでしょうか。
これをキーワード型検索エンジンで見つけるのは、なかなかの言い換え能力を要求するように思います。
人間の語彙力を拡張してくれる人間拡張アプリであるとも言えるでしょう（大げさ）。
<img width="1076" alt="想像以上に大きかった.png" src="https://qiita-image-store.s3.amazonaws.com/0/26062/06c233ab-68bc-8481-d110-81eb38a6a91f.png">


### 実行例2:「何て素敵なんだ」
素敵なものを見たときの感情を表現するイラストがレコメンドされていますね。
<img width="897" alt="何て素敵なんだ.png" src="https://qiita-image-store.s3.amazonaws.com/0/26062/fb482685-cc0a-9dd0-5beb-c67d466e023a.png">


### 実行例3:「これが欲しかった」
ハズレもありますが、4番目の感涙するネット民のイラストをこの文章で提示してくれるのは中々言葉を分かっているAIさんですね。
本アプリが欲しくなりましたでしょうか？
<img width="1083" alt="これが欲しかった.png" src="https://qiita-image-store.s3.amazonaws.com/0/26062/19b7628e-ba5a-f62f-2083-3e9cfc40081a.png">


### 実行例4:「的確な言葉を選ぶのが大変だよね」
キーワード型検索エンジンは的確な言葉を選ぶのが大変ですよね。
もちろん適材適所であり、キーワード型検索エンジンには、検出された根拠が明確であることや、大容量データを扱う枯れた基盤があるといった良い点があります。おっと、技術の話に脱線してしまいました。
<img width="1089" alt="的確な言葉を選ぶのが大変だよね.png" src="https://qiita-image-store.s3.amazonaws.com/0/26062/23264345-f9b5-fea8-9445-e7aa4be9f2d1.png">


### 実行例5:「いらすとやさんに惜しみない拍手を」
こんなアプリを作れるのは、ひとえに「[いらすとや](https://www.irasutoya.com)」さん（作者のみふねたかしさん）のお陰です。
本記事でも多数のイラストを利用させていただいております。
<img width="904" alt="いらすとやさんに惜しみない拍手を.png" src="https://qiita-image-store.s3.amazonaws.com/0/26062/1fae3152-c5f9-9246-615b-86fcf6aec139.png">



## 仕組みの概要

入門的なことから書くと大変なので、次の前提知識を持っている人を想定読者とさせてください。

- [言語処理100本ノック](http://www.cl.ecei.tohoku.ac.jp/nlp100/)は終えている。
- 頑張ればAAAI 2019のTutorial: [NEURAL VECTOR REPRESENTATIONS BEYOND WORDS：SENTENCE AND DOCUMENT EMBEDDINGS](http://gerard.demelo.org/teaching/embedding-tutorial/) を読むことができる。

本アプリの基本的なアイディアは次のとおりです。

1. 与えられた文や画像の説明文を、それぞれ文の分散表現（つまりはベクトル）に変換する。
1. 与えられた文と画像の説明文の意味の近さを、それぞれの文の分散表現を使って計算する（意味の近さ = 2つのベクトルのなす角の小ささ = コサイン類似度の大きさとする）。
1. コサイン類似度が大きい説明文を持つ画像トップN個を選ぶことで、与えられた文と意味が近い画像を発見できる。

模式図にすると、次のようになります。
シリーズの次回では、このアイディアの実装方法について解説いたします。
<img width="931" alt="アプリの仕組み.png" src="https://qiita-image-store.s3.amazonaws.com/0/26062/c20bc573-5452-10c1-962b-ff51be283447.png">


## 免責事項

著者は本シリーズ記事を掲載するにあたって、その内容、機能等について細心の注意を払っておりますが、内容が正確であるかどうか、安全なものであるか等について保証をするものではなく、何らの責任を負うものではありません。
本記事内容のご利用により、万一、ご利用者様に何らかの不都合や損害が発生したとしても、著者や著者の所属組織（新日鉄住金ソリューションズ株式会社（NSSOL）。なお、2019年4月から商号が日鉄ソリューションズ株式会社（NSSOL）に変わります）は何らの責任を負うものではありません。


## つづく
シリーズの[次回はアルゴリズムの解説編](https://qiita.com/sonoisa/items/775ac4c7871ced6ed4c3)です。
<img width="781" alt="つづく.png" src="https://qiita-image-store.s3.amazonaws.com/0/26062/071a0250-0d71-629c-ecec-a7d4ca3d616a.png">