MIT App Inventorでテキストのクラス分けを行う

## はじめに
ここでは，MIT App Inventorでのテキストのクラス分けを行います．GoogleのNatural Language APIを使用します．
アプリでテキストのクラス分けを行うことができれば，アプリの幅が格段と広がりそうですね！

テキストのクラス分けをNatural Language APIで行うが，MIT App Inventorから直接アクセスする方法が見つからなかったため，GoogleのCloud Runを経由してテキスト分類を行います．


## アプリの概要
アプリに文章を入力し，ボタンをクリックすると文章がCloud Run, Natural Language APIを使用して，文章のカテゴリがレスポンスします．このレスポンスをアプリのスクリーンに表示します．


## Natural Language API
GoogleのNatural Language APIとは？
>[Natural Language API](https://cloud.google.com/natural-language?hl=ja)
>GoogleのMLを使用して非構造化テキストから分析情報を引き出す。
>Natural Language API
>Natural Language API の高度な事前トレーニング済みモデルでは、デベロッパーがアプリケーションに自然言語理解（NLU）を簡単に適用し、感情分析、エンティティ分析、エンティティ感情分析、コンテンツ分類、構文解析などの機能を利用できるようになります。

## Natural Language コンテンツの分類
Natural Language コンテンツの分類とは？
Method: documents.classifyText

>[Natural Language コンテンツの分類](https://cloud.google.com/natural-language/docs/classifying-text?hl=ja)
>コンテンツ分類は、ドキュメントを分析し、ドキュメント内で見つかったテキストに適用されるコンテンツ カテゴリのリストを返します。ドキュメント内のコンテンツを分類するには、classifyText メソッドを呼び出します。

[Method: documents.classifyTextドキュメント](https://cloud.google.com/natural-language/docs/reference/rest/v2/documents/classifyText)

:::note info
classifyTextはv2を使用します．
:::


## Cloud Run
GoogleのCloud Runとは？
>[Cloud Run](https://cloud.google.com/run?hl=ja)
>フルマネージドのプラットフォームでアプリやウェブサイトをすばやく構築

## Designer画面
![Designer画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/863b4a6f-ed3e-4370-bc6d-b22fbc66b405.png)

|機能|内容|
|:-:|:-:|
|TextBox1|テキスト分類する文章を入力する箇所．|
|send|ボタン，文章を入力したらクリックし，テキスト分類を行う．|
|reset|ボタン，Label1とListView1のテキストをクリアする．|
|Web1|CloudRunにリクエストを送る．|

## blocks画面
### 変数
・CloudRunURL
CloudRunへリクエストを送るURL．
![CloudRunURL](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/0473e899-4421-1550-b5a4-5d0e9e179ec7.png)

・classList
レスポンスで帰ってきたカテゴリをリストに格納する．
![classList](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/2bc10d36-b173-ebcc-3afb-fc33ac823b57.png)

### ボタンクリック
・wheb send. Click
CloudRunへリクエストを送信する．
![blocks (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/e9c1c07f-74a0-9483-f770-6fb3f2e67434.png)

・when reset. Click
Label1とtextBox1，ListView1![blocks (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/3e914219-7403-0c09-b79e-9fccecb01121.png)
をクリアする．


### CloudRunからのレスポンス処理
・when Web1. Get Text
![blocks (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/8ac4d7e9-a9d9-57b2-8e03-d32acf042be1.png)


## コードの記述
Natural Language APIを使用できるようにし，Cloud Runにコードを記述します．
生成AIに書いてもらいました～～！AIってほんとに優秀ですね．

```main.py
import json
from flask import Flask, request, jsonify
import functions_framework
from googleapiclient.discovery import build
from google.auth import default

app = Flask(__name__)
app.json.ensure_ascii = False

# Google Natural Language API クライアントを作成
nl_service = None

@app.route('/classify_text', methods=['GET', 'POST'])  # GET と POST メソッドに対応
def classify_text():
    """文章のコンテンツを分類する"""
    global nl_service
    
    try:
        # リクエストから文章を取得
        if request.method == 'GET':
            text = request.args.get('text')
        elif request.method == 'POST':
            text = request.get_json().get('text')

        # 進捗状況を記録
        progress = {"step": "文章取得"}

        # Google Natural Language API クライアントを作成
        if nl_service is None:
            nl_service = get_nl_service()
            progress["step"] = "APIクライアント作成"

        # Google Natural Language API にリクエストを送信
        response = classify_text_with_api(text, nl_service)
        progress["step"] = "APIリクエスト送信"

        # 結果をJSON形式で返す
        return jsonify({'progress': progress, 'classification': response}), 200

    except Exception as e:
        return jsonify({"error": str(e)}), 500

@functions_framework.http
def main(request):
    """HTTPリクエストを処理する"""
    with app.app_context():
        return classify_text()

def get_nl_service():
    """Google Natural Language API のクライアントを作成する"""
    credentials, project_id = default()
    return build('language', 'v2', credentials=credentials)

def classify_text_with_api(text, nl_service):
    """Google Natural Language API を使用して、文章のコンテンツを分類する"""
    request_body = {
        "document": {
            "type": "PLAIN_TEXT",
            "content": text
        }
    }

    response = nl_service.documents().classifyText(body=request_body).execute()

    # Content Classification の結果を取得
    classification = response.get("categories", [])

    return classification
```

```requirements.txt
functions-framework==3.*
requests
google-api-python-client
google-auth-httplib2
```

## CloudRunからURLを貼り付け
CloudRunのURLをコピーして，ブロック画面の変数CloudRunURLに貼り付けます．
![スクリーンショット 2024-11-19 183638_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928359/9903d01d-c1de-3111-944d-350922f2f614.png)

## 終わりに
GoogleのNatural Language APIを使用することで簡単に長文をカテゴライズすることができた．
MIT App InventorでCloud Runを使用することでアプリ作成の幅が大きく広がります，GoogleにはたくさんのAPIが用意されておりこれらを使用することでいろいろなアプリを作成することができます．生成AIを頼ることでプログラミングがわからなくても，CloudRunを使用したアプリ作成を行うことができます．テキスト情報であればMIT App Inventorでブロックを作成するよりも，生成AIにプログラムを作成してもらい，CloudRunにアクセスす方がアプリ作成の効率が上がると思い始めました．