CLASSIFY_TEXTを試してみた（Snowflake Cortex LLM Function）

## CLASSIFY_TEXTがプレビューになりました
CLASSIFY_TEXTが[先日プレビューになりました。](https://docs.snowflake.com/en/release-notes/2024/other/2024-09-12-classify-text-function)

CLASSIFY_TEXT 関数は「プロンプトエンジニアリングや後処理、例を提供することなく、テキストレコードにすばやく正確にラベルを付けることができる」というものです。

さっそく試してみましょう！

## 試す！

### 施設のカテゴリ分類
まずは、分かりやすそうなテーマで、施設のカテゴリ（観光施設・食事処 等）を分類してみます。

以下のカテゴリー1（大分類）と更に細かいカテゴリー2（小分類）で試してみます。

```sql
select
    place_name,
    get( -- JSON形式で返却されるのでget()で値を取り出します
        SNOWFLAKE.CORTEX.CLASSIFY_TEXT(
            place_name,
            ['買い物', '遊び', '交通', '生活', '観光', '飲食']
        ),
        'label'
     ) as category_1,
    get(
        SNOWFLAKE.CORTEX.CLASSIFY_TEXT(
            place_name,
            ['レジャー施設', 'スーパー', 'ラーメン屋', 'ゲームセンター', 'カレー屋', 'ライブハウス', '-- 合計45分類にしています_割愛 --' ]
        ),
    'label'
     ) as category_2
from
    sample
;
```

<br>

結果は以下のとおり！

- 大分類はなぜか「交通」に分類しがち
- 小分類はなんとなく合ってそう！
- UNCLASSIFIEDで分類できないパターンもある

まずは、細かめに分類をしてもらったものをあとで集約したほうが良さそうな印象。

| PLACE_NAME | CATEGORY_1 | CATEGORY_2 |
| --- | --- | --- |
| 早川駅 | 交通 | 駅 |
| 白山神社 | 交通 | 史跡 |
| 報徳二宮神社 | 交通 | 史跡 |
| 箱根神社 | 観光 | 史跡 |
| 小田原PA | 交通 | その他 |
| 国府津海岸 | 交通 | 自然 |
| 小田原料金所 | 交通 | その他 |
| 道の駅 箱根峠 | 交通 | 駅 |
| 石垣山一夜城歴史公園駐車場 | 交通 | UNCLASSIFIED |
| 箱根ガラスの森美術館 | 交通 | 美術館 |

### テキストから旅行前後か分類
次は、テキストの内容から「旅行前・旅行中・旅行後」の分類をしてみます。

LLMにそれぞれのシチュエーションを想定したテキストを作ってもらいました。

```sql
select
    text,
    status_original,
    get(
        SNOWFLAKE.CORTEX.CLASSIFY_TEXT(
            tweet_text,
            ['旅行前', '旅行中', '旅行後']
        ),
        'label'
    ) as travel_classified
from
    sample
```

<br>

結果は以下のとおり！
※ STATUS_ORIGINALはLLMが文書作成時に想定したステータスです

- 人間と同程度の判断をしている印象
- たしかに「日常に戻ったと思ったら、すぐに旅行の計画を再開」は旅行後か旅行前なのか分類に悩む

先程の施設のカテゴリ分類のように単語を対象とするよりも、ある程度の文章量があった方が良さそうですね！


| TEXT | STATUS_ORIGINAL | STATUS_CLASSIFIED |
| --- | --- | --- |
| 来週からの旅行が待ちきれない！#旅行準備 | 旅行前 | 旅行前 |
| 初めての海外旅行、何を持って行くべきか悩むな〜 | 旅行前 | 旅行前 |
| 旅行のために新しいカメラを買った！撮るのが楽しみ✨ | 旅行前 | 旅行前 |
| チケット予約完了！ヨーロッパまであと5日💼 | 旅行前 | 旅行前 |
| 旅行の計画を立てるのって、意外と大変…けど楽しい！ | 旅行前 | 旅行前 |
| 旅行のために新しいスーツケースを購入しました✈️ | 旅行前 | 旅行前 |
| ガイドブックを読み漁って、行きたい場所が増えた😂 | 旅行前 | 旅行前 |
| パスポートの期限、ちゃんと確認しておかないと！ | 旅行前 | 旅行前 |
| 旅行前に体調管理しっかりしないとな | 旅行前 | 旅行前 |
| 友達から旅行のお土産リクエストが多すぎる笑 | 旅行前 | 旅行前 |
| 旅行前に買っておくべき必需品って何だろう？ | 旅行前 | 旅行前 |
| 海外旅行のために、新しい服を準備中🛍️ | 旅行前 | 旅行前 |
| 旅行前に英会話の勉強を少しでもしておこう | 旅行前 | 旅行前 |
| 次の旅行は、どの国がいいかな…行きたいところが多すぎる！ | 旅行前 | 旅行前 |
| 旅行先の天気予報が気になる。晴れるといいな🌞 | 旅行前 | 旅行前 |
| 旅行プランを立てるのに、ネットでリサーチするのが止まらない | 旅行前 | 旅行前 |
| 旅行前に、友達からお土産のオススメを聞いてみた | 旅行前 | 旅行前 |
| 旅行の日程が決まった！今からワクワクが止まらない✨ | 旅行前 | 旅行前 |
| 旅行先の文化を予習中。現地でのマナーは大事！ | 旅行前 | 旅行前 |
| ついに旅行の出発日。準備は万端！🎒 | 旅行前 | 旅行前 |
| 初めて訪れた国の景色が美しすぎる…感動 | 旅行中 | 旅行中 |
| 現地の食べ物が美味しすぎて止まらない🤤 | 旅行中 | 旅行中 |
| 旅先で出会った人たちが素敵すぎる！ | 旅行中 | 旅行中 |
| 観光地巡りで歩き疲れたけど、それもまた楽しい | 旅行中 | 旅行中 |
| 地元のマーケットでショッピング中🛍️ | 旅行中 | 旅行中 |
| 現地の文化に触れるたびに、新しい発見がある | 旅行中 | 旅行中 |
| 朝市で朝食。新鮮な果物が最高🍎 | 旅行中 | 旅行中 |
| 現地の友達と合流して、案内してもらうことに | 旅行中 | 旅行中 |
| 晴天のビーチでのんびりリラックス中🏖️ | 旅行中 | 旅行中 |
| 旅行中のインスタ更新が止まりません📸 | 旅行中 | 旅行中 |
| ローカルなレストランで、美味しいディナーを堪能 | 旅行中 | 旅行中 |
| 知らなかった場所にたくさん出会えて新鮮な毎日 | 旅行中 | 旅行中 |
| 現地の交通機関を使いこなしてます！意外と便利 | 旅行中 | 旅行中 |
| 市場で見つけた珍しい物が面白い！ | 旅行中 | 旅行中 |
| 旅行中に新しい友達ができて、感謝しかない | 旅行中 | 旅行中 |
| 歴史的な建造物を見て、時を忘れてしまう… | 旅行中 | 旅行中 |
| 現地の有名なカフェに立ち寄って、ピースフルな時間☕️ | 旅行中 | 旅行中 |
| 旅先での小さいトラブルも思い出のうち！ | 旅行中 | 旅行後 |
| 急遽のルート変更。でもそれもまた旅の醍醐味 | 旅行中 | 旅行中 |
| 旅先での風景が綺麗すぎて、毎日がフォトジェニック | 旅行中 | 旅行中 |
| 旅行から帰ってきて、やっと一息…でも戻りたいな | 旅行後 | 旅行後 |
| 旅先で買ったお土産、早速友達に渡した🎁 | 旅行後 | 旅行後 |
| 帰ってきたら、旅行の写真を整理しなきゃな📷 | 旅行後 | 旅行後 |
| 旅行中に増えたフォロワーさんたちと再び交流中 | 旅行後 | 旅行後 |
| 旅行の思い出をSNSにシェアして、余韻に浸る | 旅行後 | 旅行後 |
| 現地で撮った写真をアルバムにまとめてみました | 旅行後 | 旅行後 |
| お土産話が止まらない！みんなにシェアしたい📖 | 旅行後 | 旅行後 |
| 旅先での出来事を思い出すたびにニヤニヤが止まらない | 旅行後 | 旅行後 |
| 帰国後、現地の食べ物が恋しい… | 旅行後 | 旅行後 |
| 楽しかった旅行の余韻で次の旅行の計画を始めました | 旅行後 | 旅行後 |
| たくさんの思い出を胸に、また日常生活へ戻る | 旅行後 | 旅行後 |
| 旅行先で知り合った人と、また会う約束をした😊 | 旅行後 | 旅行後 |
| 旅の疲れが出たのか、少し体がだるい… | 旅行後 | 旅行後 |
| 帰国して、スーツケースの中身を片付け中 | 旅行後 | 旅行後 |
| 旅行中の写真を見返すだけでニヤけてしまう | 旅行後 | 旅行後 |
| 現地で学んだことを、日本で活かせるといいな | 旅行後 | 旅行後 |
| 次回の旅行までに、また英語を勉強し直そう💬 | 旅行後 | 旅行前 |
| 日常に戻ったと思ったら、すぐに旅行の計画を再開 | 旅行後 | 旅行前 |
| 旅先での美しい景色が、脳裏に焼き付いて離れない | 旅行後 | 旅行後 |
| 旅行の話を聞いた友達が、私も行きたい！と言ってくれた✨ | 旅行後 | 旅行前 |


### テキストから年齢層を分類
次は、テキストの内容から筆者の年齢層を分類してみます。
先ほどと同様に、LLMで各年齢層を想定したテキストを生成したものを使います。

```sql
select
    text,
    age_original,
    get(
        SNOWFLAKE.CORTEX.CLASSIFY_TEXT(
            text,
            ['10代', '20代', '30代', '40代', '50代', '60代']
        ),
        'label'
    ) as age_classified
from
    sample
;
```

<br>

結果は以下のとおり！
※ AGE_ORIGINALはLLMが文書作成時に想定したステータスです

- LLMが想定したステータスと概ね同じような分類になった
- 「そのぐらいの年齢層っぽいね」くらいの分類にはなっている

そもそも正しい年齢層が不明なので精度の判断が難しいですが、「良さそう」という印象です。

| TEXT | AGE_ORIGINAL | AGE_CLASSIFIED |
| --- | --- | --- |
| 昨日、初めて友達と一緒にカラオケ行ったけど、めっちゃ楽しかった！また行きたいな～🎤🎶 | 10代 | 10代 |
| 今日の授業、先生が面白かったから眠くならなかった！ | 10代 | 10代 |
| 今日も勉強頑張るぞ！テストが近いから集中しなくちゃ✏️ | 10代 | 10代 |
| 学校帰りに寄ったカフェのスイーツが美味しかった😋🍰 | 10代 | 10代 |
| ゲームの発売日、待ちきれない！予約特典もゲットした！ | 20代 | 10代 |
| 午後は美容院でカット。週末に向けてリフレッシュしないと！ | 20代 | 20代 |
| うちの猫が初めてのおもちゃに興奮状態！かわいすぎる～🐱💖 | 20代 | 10代 |
| ようやく大学の卒業式！卒論がんばってよかったなぁ🎓 | 20代 | 20代 |
| 最近、仕事が忙しくてなかなか趣味の時間がとれない…。でも週末はしっかりリフレッシュしたい！ | 30代 | 20代 |
| 子どもの運動会、親として初参加！天気が良くてよかったです👏 | 30代 | 30代 |
| 最近、ドラマよりPodcastにハマってる。 | 30代 | 20代 |
| 子どもがやっと寝たから、今から自分の時間！ドラマタイム📺 | 30代 | 30代 |
| 最近の新曲、どれも昔の曲の方がよかったなと感じる。時代は変わったなぁ。 | 40代 | 40代 |
| 家族でのキャンプが最高のリフレッシュ！大自然の中でまたやりたい🏕 | 40代 | 30代 |
| 若い頃のバイクが好きだったけど、今は車でゆっくりドライブが楽しい。 | 40代 | 40代 |
| 週末はDIYで棚を作りました。やっぱり自分の手で作るのは楽しいですね。 | 40代 | 20代 |
| 昔は写真現像するのが当たり前だったけど、今じゃ全部スマホで済んじゃうね。 | 50代 | 40代 |
| 友人と久しぶりに登山してきたけど、山の空気はいいねぇ、やっぱり。 | 50代 | 30代 |
| 最近、庭いじりにハマってて、新しい花を植えたよ🌼 | 50代 | 30代 |
| 私の若い頃はウォークマンが流行ったけど、今は何でもスマホで済むね。 | 50代 | 50代 |
| 老後のために、少しずつ家庭菜園を始めてみようかなと思っています。🍀 | 60代 | 40代 |
| 毎朝のウォーキングが日課になっています。健康第一ですね。🌞 | 60代 | 60代 |
| 今日も朝早くからゴルフ。やっぱり自然の中のスポーツは爽快だなー！🏌️‍♂️ | 60代 | 50代 |
| 昔の友達と一緒に旅行してきました。楽しい思い出がたくさんできました。 | 60代 | 20代 |

<br>

---

下記の記事にあるように、単純にテキストを分類するだけでなく、LLMアプリケーションにおいて、ユーザーからのプロンプトを分類してルーティングに活用するというのも良さそうですね！
活用方法は幅広そうなので、研究していきたいと思います！

https://medium.com/snowflake/easy-and-efficient-text-classification-9d6bf38b2c33