![見出し画像](https://assets.st-note.com/production/uploads/images/84860289/rectangle_large_type_2_2d7eb3c44cf5364c92adda512f337591.png?width=1200)
BERTを使って、ふわっとした説明でドラえもんのひみつ道具を検索するアプリを作った
↑ Hugging Face Spaceで公開しているので遊んでみてください!
テレビ朝日のひみつ道具カタログによると、ドラえもんのひみつ道具はおよそ1300種類もあります(テレビ朝日, 2020)!!。その中から欲しいひみつ道具を探すのは大変ですよね。
ということで、「こういうひみつ道具が欲しいなー」というふわっとした説明を打ち込むだけでそれらしいひみつ道具を検索してくれる、自然言語処理アプリを作ってみました。
動作例
"小さいカメラが飛ぶ"
![](https://assets.st-note.com/img/1660651333607-aIgPPantQX.png?width=1200)
"スパイ衛星"、"あっちこっちテレビ"が上位に来ました。確かに。
"ふりかけると水を色々な性質にできる"
![](https://assets.st-note.com/img/1660651431565-cyKKQZir4R.png?width=1200)
"水加工用ふりかけ"が来ました。素晴らしい!!
のび太達が海岸に行って、このひみつ道具を使って大きな城を建てていた回、とても面白かった記憶があります。
自然言語処理モデルSentence BERTについて
このアプリでは"Sentence BERT"というNLPモデルを使っています。BERTは5年ほど前に開発された比較的新しいものでありますが、文脈を理解することに長けていたりと、優秀なNLPモデルとして有名です。
その優秀さから、BERTはGoogle検索の検索エンジンでも使われていたりします。
余談ですが、なので、Google検索では、文章で検索した方が満足する結果が得られることがよくあります。実際、私も"コスパがいい海鮮丼"と検索したり、この ↓ メチャクソ泣ける世紀の神アニメについて、題名は忘れたけどもう一度観たいと思って、(今回の話題とは全然関係ないけどぜひ観て!あと以下よりちょいネタバレ入ります)
a lonely girl in a spaceship is drawing and dreaming in it.
って検索したら最上位にヒットしてそっから1時間くらい号泣したり、色々助かっております。
本アプリの仕組み
そんなBERTの一員であるSentence BERTを使って、以下のような仕組みで本アプリを作りました。
Sentence BERTは、文章を読み込んで、ベクトル形式のデータ(ここでは"特徴量"としましょう)を出力します。この時、読み込んだ文章の文脈が似ているほど、出力されたベクトルは近い向きを向くようになっています。この性質を検索エンジンとして応用します。
![](https://assets.st-note.com/img/1660653039020-cAMicDu23U.jpg?width=1200)
データベースとして、ひみつ道具それぞれの名前と説明文を用意しておきます。また、その説明文をSentence BERTで特徴量に変換しておきます。
ユーザーがふわっとした説明文を入力したら、そのテキストもSentence BERTで特徴量に変換します。
各ひみつ道具の特徴量とユーザーによる特徴量とで内積を取ります。内積が大きいということは、両者が近い向きを向いているということなので、内積が大きかったひみつ道具順に候補として並べていきます。
以上です。たったこれだけの処理で、結構イケる検索エンジンを作れてしまうのです!
なお、ひみつ道具のデータはテレビ朝日より拝借致しました。
また、Sentence BERTのモデルとして、sonoisa様がHugging Faceで公開されている学習済みモデルsonoisa/sentence-bert-base-ja-mean-tokens-v2を拝借致しました。
ほかにもいろいろ作れる?
文章の文脈を読み取れるという強みから、BERTは検索エンジンにうってつけのNLPモデルであると思います。なので、ドラえもんのひみつ道具以外にも、様々な検索アプリを作れると思います。
例えば、既にあるものとしては、sonoisa様による、ふわっとした説明でいらすとやを検索できるアプリ"Irasuto_search"があります。結構便利です。
あとは、観たいストーリーに似ているアニメ、花言葉、俳句、星の名前の由来などなど、色々と思いつきますね!
今後について
BERTの学習済みモデルは色々公開されていまして、こういったメチャクソデカな奴もおります。あの"JKりんな"の企業もいます!
私のアプリの"Sentence BERT"の部分をこの2つに入れ替えたりして色々動作を確かめてみました。結果としては、どうもこの2つはあまり上手くひみつ道具検索をできていない感じでした…。これらのモデルはRoBERTaというもので、BERTの一員ではあるのですがSentence BERTより古い子でして、性能も劣るのでしょうね。
やはり今のところは、検索エンジンにはSentence BERTであるsonoisa/sentence-bert-base-ja-mean-tokens-v2を使うのが最もいいという結論でおります。でもネットで調べてみると色々な所で学習済みモデルが頒布されていますので、それぞれ試し、検索エンジンに最も向いているNLPモデルを探していこうと思います。
Gradioの設計について
ちょっと本筋からはそれますが、私のアプリはGradioというフレームワークでフロントエンドを作り、Hugging Face Spaceでホストしています。これ、かなり便利です。Pythonのフロントエンドでお困りの方、ぜひ調べてみて下さい。
本アプリを作るにあたって、設計を少しこだわってみました。このことについてはまた後ほど詳しい記事にするつもりですが、ざっくり言うと、アプリを大きく"フロントエンド"と"バックエンド"の2つに分けます。MVCモデルのVCとMで分けている感じでしょうか。
![](https://assets.st-note.com/img/1660654592597-FhaW1i0NYq.png?width=1200)
フロントエンドでは、
画面のレイアウトを整える
ユーザーからの入力を受け取る
バックエンドに処理させる
バックエンドの処理の結果のデータを整える
バックエンドの処理の結果を表示する
ことに注力し、バックエンドでは
NLPモデルとかを処理して、結果を返す
ことに注力してもらいます。
あと、バックエンドはインターフェースにしておいて、それへの参照をフロントエンドに渡す形にしています。
Sentence BERTはクソデカなモデルなので、私の実機上では動かすのに時間がかかります。実機上でフロントエンドの開発に集中したい時は、Sentence BERTなんぞは起動せず、代わりにテキトーな処理結果をシュパっと返すダミーをimplementしておけば、幸せになれます。
本番環境ではもちろん、我らがSentence BERT様を起動するバックエンドに切り替えます。
こうすれば保守性も高いいい感じのアプリになりまーす。