Python PR

【Python】StreamlitとFastAPIで検索アプリをつくる

FessとStreamlitとFastAPIで全文検索アプリをつくる
記事内に商品プロモーションを含む場合があります

こんにちは。現役エンジニアの”はやぶさ”@Cpp_Learningです。全文検索エンジンや検索システムに興味があって勉強中です。

実践を兼ねた勉強として、検索アプリを作っています。

作り方などの備忘録として本記事を書きます。

今回つくる検索アプリの概要

今回つくる検索アプリを含むアーキテクチャの概要は下図の通りです。Webアプリ経由でユーザーが入力した検索語のリクエストを送信し、各APIから検索結果をJSONで受信します。

StreamlitとFastAPIで検索アプリをつくる

上図のWebアプリと全文検索APIについては、以下の記事で解説済みです。

Streamlitで全文検索アプリをつくる
Pythonで全文検索アプリをつくる -StreamlitとFessを活用-全文検索サーバーのFessとPythonライブラリのStreamlitを活用した「全文検索アプリ(Webアプリ)」の作り方を解説した記事です。...

なので、本記事のメインは以下になります。

本記事で学べる内容
  • 同義語辞書をつくる(既存のものを活用してもOK)
  • FastAPIで同義語検索APIをつくる
  • Webアプリ(Streamlit製)から同義語検索APIにリクエストを投げて、入力したキーワード(検索語)の同義語をJSONで受信

Sudachiで同義語辞書をつくる -SudachiDict-

Sudachiとは、Works Applicationsが開発・公開している形態素解析器です。

同義語辞書も公開しているので、同義語辞書ソース フォーマットを参考に独自の辞書を作成できます。登録に必要な最低限の情報は、同義語として登録する共通の「0:グループ番号」「8:見出し(語句)」です。例えば、以下の通りです。

023714,,,,,,,,画像処理,,
023714,,,,,,,,Image processing,,
023714,,,,,,,,コンピュータビジョン,,
023714,,,,,,,,computer vision,,
023714,,,,,,,,CV,,

ゼロから辞書をつくっても良いのですが、synonyms.txt に追加登録するのが簡単です。

2021/11/13時点で synonyms.txt に 23,713 の 同義語(グループ番号)が登録済なので、使わないのは勿体ない

スポンサーリンク

辞書を活用した同義語検索をつくる

独自の辞書が完成したら、以下のフローで同義語検索を行います。

辞書を活用した同義語検索アルゴリズム
  1. 辞書から検索語と一致する語句を検索
  2. 検索語のグループ番号を取得
  3. 同一グループ番号の語句(=同義語)を検索
  4. 各レコードから同義語(見出し)のみ抽出

Pythonで実装したものが以下です(Pandas使うのが楽です)。

61356   画像処理
61357   Image processing
61358   コンピュータビジョン
61359   computer vision
61360   CV
Name: heading, dtype: object

「画像処理」などのキーワードを入力すると「Image processing」などの同義語を検索して、出力します。このソースコードをAPI化します。

FastAPIで同義語検索APIをつくる

PythonでREST APIを作るなら、Webフレームワークの FastAPI がオススメです。

インストールから使い方まで公式サイトが丁寧に解説しているので、本記事では割愛して、直ぐにソースコードのmain.pyを公開します。

以下のコマンドでAPIサーバーを起動できます。

python main.py

ブラウザなどから http://127.0.0.1:8888/synonym/?q={keyword} というリクエストを投げると、{keyword}の同義語がJSONで返ってきます。例えば、画像処理というキーワードでリクエストを投げたときの様子が下図です。

StreamlitとFastAPIで検索アプリをつくる

または以下の記事を参考に VSCode からリクエストを投げて動作確認しても良いと思います。

Webアプリ開発に役立つVSCodeの拡張機能
Webアプリ開発に役立つVSCodeの拡張機能3選Webアプリ開発に役立つVisual Studio Codeの拡張機能を紹介した記事です。...

OpenAPI準拠のAPIドキュメントを自動生成

FastAPI の素晴らしい機能の一つにAPIドキュメントの自動生成があります。先ほど立てたAPIサーバに http://127.0.0.1:8888/docs というリクエストを投げると、OpenAPIに準拠したAPIドキュメントが Swagger UI によって表示されます。

FastAPIでOpenAPI準拠のAPIドキュメントを自動作成

今回生成したAPIドキュメント(openapi.json)は以下の通りです。

APIドキュメント(openapi.json)を見る

オフラインでOpenAPI準拠のAPIドキュメントを確認するときは、VSCode の拡張機能  Swagger Viewer を使うのがオススメです。

Streamlitで全文検索アプリをつくる

最後に前回作った全文検索アプリから今回作った同義語検索APIにリクエストを投げて、検索結果を受信することで「入力した検索キーワードの同義語を検索候補として表示する機能」をアプリに追加します。

自作アプリで全文検索および同義語検索をしている様子が以下です。

※冒頭と同じ動画です。

まとめ -StreamlitとFastAPIで検索アプリをつくる-

Pythonライブラリの Streamlit FastAPI を活用し、Pythonで全文検索アプリ(同義語検索による検索語候補の表示機能付き)を作りました。

FessとStreamlitとFastAPIで全文検索アプリをつくる

Webアプリ(Streamlit製)のソースコードを改良して、同義語検索を実現しても良かったのですが、同義語検索そのものは汎用的な処理なので、色んなアプリと連携しやすいようにAPIという形で提供する方が良いと考えました。

はやぶさ
はやぶさ
あとは単純に FastAPI を使てみたかった…というのもあります

アプリ作りはやっぱり楽しいですね♪

検索技術や自然言語処理の勉強を始めたばかりですが、今後も勉強した内容を本ブログで公開したいと考えていますので、今後もブログ「はやぶさの技術ノート」をよろしくお願いします。

PICK UP BOOKS

  • 数理モデル入門
    数理モデル
  • Jetoson Nano 超入門
    Jetoson Nano
  • 図解速習DEEP LEARNING
    DEEP LEARNING
  • Pythonによる因果分析
    Python