【Streamlit】テキスト分類モデルのデモアプリ

Streamlit
この記事は約16分で読めます。

こんにちは、JS2IIUです。今回は、入力されたテキストのカテゴリを予測するアプリを作ってみます。機械学習によるモデルを使ったカテゴリ分類を行います。よろしくお願いします。

1. はじめに

この記事では、機械学習でテキストの内容を分類するデモアプリをPythonとStreamlitを使って作成していきます。

たとえば、「これはスパムメールです」といった文章を入力すると、それが「スパム」か「スパムではない」かを自動的に予測してくれるようなアプリです。

今回は、簡単な機械学習モデルを使って、Streamlitで直感的なUIを作り、誰でも試せる形にしてみましょう!

2. テキスト分類モデルとは?

テキスト分類とは、文章(テキストデータ)をあらかじめ定められたカテゴリに分類するタスクのことです。
代表的な例には以下のようなものがあります:

  • スパムメール vs 通常メールの分類
  • ニュース記事のジャンル分け(スポーツ、政治、エンタメなど)
  • SNS投稿の感情分析(ポジティブ、ネガティブなど)

今回は、簡単な「ニュースのジャンル分類」を行うミニモデルを構築し、それをWebアプリ化します。

3. Streamlitとは?

Streamlit(ストリームリット)は、PythonコードだけでシンプルなWebアプリが作れるオープンソースフレームワークです。

データの可視化、モデルのデモ、フォームの作成などが驚くほど簡単にできます。しかもHTMLやJavaScriptの知識は不要です。

Streamlitのインストール

まずはターミナルやコマンドプロンプトで以下を実行します:

Bash
pip install streamlit

4. アプリの構成とコード解説

それでは、実際にStreamlitアプリを作っていきましょう!

🔸全体の流れ

  1. テキストを入力するフォームを表示
  2. モデルで予測処理を行う
  3. 結果を画面に表示

🔹Step 1:必要なライブラリをインポート

Python
import streamlit as st
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
import pandas as pd

🔹Step 2:サンプルデータとモデルを準備

今回は、シンプルな学習データを使ってモデルをその場で学習させます。
実際には学習済みモデルを使うのが一般的ですが、理解のために中身を見ながら進めます。

Python
# 学習用のサンプルデータ
data = {
    "text": [
        "The team won the championship",         # スポーツ
        "The government passed a new law",       # 政治
        "A new movie was released this week",    # エンタメ
        "Player scores the winning goal",        # スポーツ
        "Parliament discusses new bill",         # 政治
        "Famous actor announces retirement"      # エンタメ
    ],
    "category": [
        "sports", "politics", "entertainment", "sports", "politics", "entertainment"
    ]
}

df = pd.DataFrame(data)

# 特徴量のベクトル化
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(df["text"])
y = df["category"]

# モデルを学習
model = LogisticRegression()
model.fit(X, y)

ここで作成した変数dfの中身を見てみましょう。本当はもっと多くのデータで学習させたいところですが、今回は簡単のために少ないデータで学習します。

Plaintext
                                 text       category
0       The team won the championship         sports
1     The government passed a new law       politics
2  A new movie was released this week  entertainment
3      Player scores the winning goal         sports
4       Parliament discusses new bill       politics
5   Famous actor announces retirement  entertainment

🔹Step 3:Streamlitアプリを構築する

次に、StreamlitでアプリのUIを作成します。

Python
st.title("テキスト分類モデルのデモアプリ")

# テキスト入力欄
user_input = st.text_area("テキストを入力してください", height=150)

# ボタンを押すと予測
if st.button("カテゴリを予測"):
    if user_input.strip() == "":
        st.warning("テキストを入力してください。")
    else:
        # 入力テキストをベクトル化
        input_vector = vectorizer.transform([user_input])
        prediction = model.predict(input_vector)[0]

        # 結果表示
        st.success(f"予測カテゴリ:**{prediction}**")

5. 実行してみよう!

🔸ファイルを保存して起動

上記のコードを text_classifier_app.py という名前で保存し、以下のコマンドで実行します:

Bash
streamlit run text_classifier_app.py

ブラウザが自動で開き、アプリが起動します。
テキストを入力してボタンを押すと、予測されたカテゴリが表示されるはずです!

たまたまうまく行った例を載せていますが、それほど賢くありません。ニュース記事を使って試してみましたが、予測は外れることの方が多かったです。

コード全体の詳細説明

Python
import streamlit as st
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
import pandas as pd

# 学習用のサンプルデータ
data = {
    "text": [
        "The team won the championship",         # スポーツ
        "The government passed a new law",       # 政治
        "A new movie was released this week",    # エンタメ
        "Player scores the winning goal",        # スポーツ
        "Parliament discusses new bill",         # 政治
        "Famous actor announces retirement"      # エンタメ
    ],
    "category": [
        "sports", "politics", "entertainment", "sports", "politics", "entertainment"
    ]
}

df = pd.DataFrame(data)

# 特徴量のベクトル化
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(df["text"])
y = df["category"]

# モデルを学習
model = LogisticRegression()
model.fit(X, y)

st.title("テキスト分類モデルのデモアプリ")

# テキスト入力欄
user_input = st.text_area("テキストを入力してください", height=150)

# ボタンを押すと予測
if st.button("カテゴリを予測"):
    if user_input.strip() == "":
        st.warning("テキストを入力してください。")
    else:
        # 入力テキストをベクトル化
        input_vector = vectorizer.transform([user_input])
        prediction = model.predict(input_vector)[0]

        # 結果表示
        st.success(f"予測カテゴリ:**{prediction}**")

🔶 ステップ 1:必要なライブラリをインポート

Python
import streamlit as st
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
import pandas as pd
  • streamlit: Webアプリを作るためのライブラリ。
  • TfidfVectorizer: テキスト(単語)を数値ベクトルに変換するツール。
  • LogisticRegression: シンプルな分類モデル(教師あり学習)。
  • pandas: データを表の形(DataFrame)で扱うためのライブラリ。

🔶 ステップ 2:サンプルデータの準備

Python
data = {
    "text": [
        "The team won the championship",
        "The government passed a new law",
        "A new movie was released this week",
        "Player scores the winning goal",
        "Parliament discusses new bill",
        "Famous actor announces retirement"
    ],
    "category": [
        "sports", "politics", "entertainment", "sports", "politics", "entertainment"
    ]
}
df = pd.DataFrame(data)
  • text: 分類したい文章(英語のニュース記事の見出しのようなもの)。
  • category: それぞれの文章が属するカテゴリ(スポーツ・政治・エンタメ)。

pandas.DataFrame に変換することで、扱いやすい表形式のデータにしています。

🔶 ステップ 3:テキストのベクトル化

Python
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(df["text"])
y = df["category"]
解説:
  • TfidfVectorizer() は、文章中の単語を数値に変換してくれるクラスです。
  • .fit_transform() は、以下を同時に行います:
  1. 文章から単語を抽出(語彙を学習)
  2. 各文章を「単語の重要度ベクトル」に変換

これにより、機械学習モデルがテキストを数値的に理解できるようになります。

  • X:入力の特徴量(ベクトル)
  • y:正解のラベル(スポーツ・政治・エンタメ)

🔶 ステップ 4:分類モデルの学習

Python
model = LogisticRegression()
model.fit(X, y)
  • LogisticRegression():シンプルかつよく使われる分類アルゴリズムです。
  • .fit(X, y):特徴量 X と正解ラベル y を使ってモデルを学習します。

これで、「この単語が含まれていたらスポーツっぽい」「この語句は政治の可能性が高い」などをモデルが覚えます。

🔶 ステップ 5:Streamlit アプリの作成

Python
st.title("テキスト分類モデルのデモアプリ")
  • アプリのタイトルをブラウザ上に表示します。

🔶 ステップ 6:ユーザーからの入力を受け付ける

Python
user_input = st.text_area("テキストを入力してください", height=150)
  • テキストを入力する欄(複数行)を表示します。
  • ユーザーがここに文章を入力すると、user_input にその文字列が入ります。

🔶 ステップ 7:予測ボタンが押されたときの処理

Python
if st.button("カテゴリを予測"):
  • 「カテゴリを予測」というボタンが押されたときに、以下の処理が実行されます。

🔶 ステップ 8:空文字チェック

Python
    if user_input.strip() == "":
        st.warning("テキストを入力してください。")
  • ユーザーが何も入力していなかったら、警告を表示します。

🔶 ステップ 9:入力文のベクトル化と予測

Python
    else:
        input_vector = vectorizer.transform([user_input])
        prediction = model.predict(input_vector)[0]
  • ユーザーの入力文を vectorizer でベクトルに変換
  • model.predict() を使って、入力がどのカテゴリに属するかを予測

🔶 ステップ 10:予測結果の表示

Python
        st.success(f"予測カテゴリ:**{prediction}**")
  • 予測されたカテゴリ(たとえば "sports")を画面に表示します。

🔚 まとめ

このコードは、以下の機能をすべて備えた「最小構成のテキスト分類アプリ」です:

✅ テキストデータを機械学習用に変換(Tfidf)
✅ 学習用データでモデルをトレーニング
✅ Streamlitで入力フォームと予測機能を構築
✅ 入力文に対してリアルタイムでカテゴリを返す

6. 応用アイデア

今回のアプリをもとに、さらにいろいろと改良することもできます。

7. まとめ

本記事では以下のステップで、Streamlitを使ったテキスト分類アプリを作成しました:

  • テキスト分類とは何かを理解する
  • シンプルな機械学習モデルを作成する
  • Streamlitで直感的なUIを構築する
  • テキスト入力に応じて予測を行い、結果を表示する

Streamlitは、Pythonだけでサクッと動くプロトタイプを作れる非常に便利なツールです。機械学習やデータ分析の結果を他人と共有するのにも最適です。

8. 参考リンク

最後に書籍のPRです。
24年11月に第3版が発行された「scikit-learn、Keras、TensorFlowによる実践機械学習 第3版」、Aurélien Géron 著。下田、牧、長尾訳。機械学習のトピックスについて手を動かしながら網羅的に学べる書籍です。ぜひ手に取ってみてください。

最後まで読んでいただきありがとうございます。

コメント

タイトルとURLをコピーしました