サイトアイコン アマチュア無線局JS2IIU

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

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

1. はじめに

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

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

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

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

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

今回は、簡単な「ニュースのジャンル分類」を行うミニモデルを構築し、それを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

🔶 ステップ 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)

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

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

Python
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(df["text"])
y = df["category"]
解説:
  1. 文章から単語を抽出(語彙を学習)
  2. 各文章を「単語の重要度ベクトル」に変換

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

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

Python
model = LogisticRegression()
model.fit(X, y)

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

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

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

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

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

🔶 ステップ 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]

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

Python
        st.success(f"予測カテゴリ:**{prediction}**")

🔚 まとめ

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

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

6. 応用アイデア

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

7. まとめ

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

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

8. 参考リンク

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

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

モバイルバージョンを終了