感情分析アプリ 〜Python＋Streamlit＋BERT〜


前回は「画像分類アプリ」を作成しました。  
👉 [前回の記事はこちら！](https://qiita.com/atm_sakura/items/3f3bc4fa9b9bb2cb1df4)

今回は、テキストを以下の8つの感情に分類するアプリを作成しました！

- 喜び
- 悲しみ
- 期待
- 驚き
- 怒り
- 恐れ
- 嫌悪
- 信頼

---

##  学んだこと

- Hugging Face Transformers の使い方
- モデルの精度改善に向けた試行錯誤の流れ（ベースライン→BERT→重みづけ）

---

##  開発環境と使用ライブラリ

| 項目 | 内容 |
|------|------|
| OS | Windows 11 |
| Python | 3.12.7 |

### 使用ライブラリ

| ライブラリ名 | 用途 |
|--------------|------|
| streamlit | Web UI作成 |
| transformers | Hugging Face のトークナイザー・事前学習モデル（BERT）の読み込みと推論 |
| torch | PyTorch を使用したモデルの推論処理 |

---

##  モデル構成と学習内容

- **学習モデル**：BERT（`tohoku-nlp/bert-base-japanese-v3`）

### 学習データのクラス分布

| 感情 | ラベル | 件数 |
|------|--------|------|
| 喜び | 0 | 11059 |
| 悲しみ | 1 | 7354 |
| 期待 | 2 | 7317 |
| 驚き | 3 | 4401 |
| 怒り | 5 | 2837 |
| 恐れ | 6 | 1440 |
| 嫌悪 | 4 | 488 |
| 信頼 | 7 | 104 |

---

##  精度比較（ロジスティック回帰 vs BERT）


### ロジスティック回帰

| クラス | Precision | Recall | F1-score | Support |
|-------|-----------|--------|----------|---------|
| 0     | 0.39      | 0.71   | 0.50     | 1049    |
| 1     | 0.34      | 0.33   | 0.33     | 722     |
| 2     | 0.49      | 0.43   | 0.45     | 766     |
| 3     | 0.33      | 0.13   | 0.19     | 489     |
| 4     | 0.00      | 0.00   | 0.00     | 42      |
| 5     | 0.22      | 0.02   | 0.03     | 288     |
| 6     | 0.50      | 0.01   | 0.01     | 137     |
| 7     | 0.00      | 0.00   | 0.00     | 7       |
| **Accuracy** |       |        | **0.39** | 3500    |
| **Macro Avg** | 0.28 | 0.20   | 0.19     | 3500    |
| **Weighted Avg** | 0.38 | 0.39 | 0.35     | 3500    |

---

### BERT（重みづけなし）

| クラス | Precision | Recall | F1-score | Support |
|-------|-----------|--------|----------|---------|
| 0     | 0.9436    | 0.9210 | 0.9322   | 1089    |
| 1     | 0.9154    | 0.9142 | 0.9148   | 734     |
| 2     | 0.8954    | 0.9389 | 0.9166   | 720     |
| 3     | 0.8966    | 0.9424 | 0.9189   | 451     |
| 4     | 0.8400    | 0.7500 | 0.7925   | 56      |
| 5     | 0.8640    | 0.8514 | 0.8577   | 276     |
| 6     | 0.8322    | 0.7702 | 0.8000   | 161     |
| 7     | 1.0000    | 0.3077 | 0.4706   | 13      |
| **Accuracy** |       |        | **0.9086** | 3500 |
| **Macro Avg** | 0.8984 | 0.7995 | 0.8254 | 3500 |
| **Weighted Avg** | 0.8974 | 0.8946 | 0.8948 | 3500 |

---

### BERT（重みづけあり）

| クラス | Precision | Recall | F1-score | Support |
|-------|-----------|--------|----------|---------|
| 0     | 0.9445    | 0.8613 | 0.9010   | 1146    |
| 1     | 0.8999    | 0.8950 | 0.8974   | 733     |
| 2     | 0.8590    | 0.9341 | 0.8950   | 698     |
| 3     | 0.8926    | 0.9211 | 0.9066   | 469     |
| 4     | 0.9565    | 0.8800 | 0.9167   | 50      |
| 5     | 0.8155    | 0.8840 | 0.8484   | 250     |
| 6     | 0.8387    | 0.9155 | 0.8754   | 142     |
| 7     | 0.8182    | 0.7500 | 0.7826   | 12      |
| **Accuracy** |       |        | **0.8946** | 3500 |
| **Macro Avg** | 0.8781 | 0.8801 | 0.8779 | 3500 |
| **Weighted Avg** | 0.8974 | 0.8946 | 0.8948 | 3500 |


---

##  モデル別・F1スコア比較グラフ

![f1_score_comparison.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4065772/552bf7bd-1e75-462e-8ebe-7b21d502c6ae.png)
![](f1_score_comparison.png)



---

##  Webアプリの概要

前回と同様のものを使用します。

入力された日本語の文章を、以下の8感情に分類して表示します。

```
・喜び　・悲しみ　・期待　・驚き
・怒り　・恐れ　　・嫌悪　・信頼
```

実行すると以下のような結果が得られます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4065772/eadc9d0a-5c1d-45be-a967-0d2f1417e2ab.png)





## 最後に

前回に引き続き、自然言語処理の実践を進める中で、感情分類の奥深さとモデル改善の面白さを改めて実感しました。

## 本記事のコード

https://github.com/Jatm1019/ai_application_sentiment_bert