見出し画像

【ChatGPT】Unityで正規表現(Regex)を使用して文字列処理を行う方法【パターンマッチングの具体例】

▼ はじめに ▼

ChatGPTを使用する際、文字列の一部を取り除いたり、置き換えたりしたいときはありませんか?

文字列の置き換えができるようになると、さまざまな処理や機能を実装する幅が広がります。

特に、ユーザーからの入力や外部API(ChatGPTなど)からのレスポンスデータを処理する際に、特定のパターンを検出して処理したいとき、役に立つのが正規表現(Regex)です。

この記事では、Unityで正規表現を活用して、文字列パターンを効率的に検出・処理する方法を解説していきます。


「AIキャラクターを活用したAI Vtuberなどの受託開発を、下記よりお引き受けしております!」

サービスはコチラからご購入いただけます!

╭━━━━━━━━━━━━━━━━╮
収益化を目指した6つの活用プラン
╰━v━━━━━━━━━━━━━━╯


▼ 正規表現とは? ▼

正規表現とは、文字列中の特定のパターンをマッチさせるための記述方式です。プログラム内で指定したパターンに合致する部分を検出し、それに対して何らかの処理を行うことが可能です。C#では、`System.Text.RegularExpressions`名前空間を利用して、正規表現の操作を行うことができます。

具体例

using System;
using System.Text.RegularExpressions;

class Program
{
    static void Main()
    {
        // テスト用の文字列
        string input = "商品コード: ABC123, 価格: 1500円";

        // 英数字のパターンにマッチする正規表現
        string pattern = @"[A-Za-z0-9]+";

        // 正規表現を使ってマッチ部分を抽出
        Match match = Regex.Match(input, pattern);

        if (match.Success)
        {
            // マッチした部分を表示
            Console.WriteLine("抽出されたパターン: " + match.Value);
        }
        else
        {
            Console.WriteLine("パターンにマッチしませんでした。");
        }
    }
}

実行結果

抽出されたパターン: ABC123


▼ すぐに、使える正規表現パターン ▼

\d+:1つ以上の数字にマッチ

1つ以上の連続した数字にマッチします。
例:123, 4567

string pattern = @"\d+";

^:文字列の先頭にマッチ

文字列が特定のパターンで始まる場合にマッチします。
例:^Helloは「Hello」で始まる文字列にマッチします。

string pattern = @"^Hello";

$:文字列の末尾にマッチ

文字列が特定のパターンで終わる場合にマッチします。
例:end$は「end」で終わる文字列にマッチします。

string pattern = @"end$";

[A-Za-z]:大文字・小文字の英字にマッチ

AからZまでの大文字、またはaからzまでの小文字にマッチします。
例:[A-Za-z]+は英字の単語にマッチします。

string pattern = @"[A-Za-z]+";

.:任意の1文字にマッチ(改行文字を除く)

任意の1文字にマッチします(改行以外の全ての文字が対象)。
例:a.cは「abc」「a1c」「a_c」などにマッチします。

string pattern = @"a.c";

*:0回以上の繰り返しにマッチ

0回以上の繰り返しにマッチします。前の文字が0回、または複数回続く部分にマッチします。
例:ab*は「a」「ab」「abb」などにマッチします。

string pattern = @"ab*";

+:1回以上の繰り返しにマッチ

1回以上の繰り返しにマッチします。前の文字が1回以上続く部分にマッチします。
例:ab+は「ab」「abb」「abbb」などにマッチしますが、「a」にはマッチしません。

string pattern = @"ab+";

[]:指定した文字のいずれかにマッチ

角括弧内のいずれかの文字にマッチします。

string pattern = @"[A-Za-z]";


ChatGPT (API) で感情データを受信する方法

ChatGPT APIを利用して感情データを取得し、それをUnityで扱うケースについて、今回は特に「ストリーミングモード」を使用した際に、どのようにして4つの感情データ(喜び、楽しさ、怒り、哀しみ)を効率よく処理するかを考えます。

通常、APIはJSON形式で感情データを返しますが、ストリーミングモードでは、JSON形式のデータをそのまま受け取るのが難しいため、工夫が必要です。

感情データを「4つの数字の信号」として含め、その信号を正規表現(Regex)を使って抽出・処理する方法について解説します。

AIからのレスポンステキストに埋め込まれた数値パターンを検出し、テキストとして自然に処理しながら、感情データを抽出するユースケースです。


ストリーミングモードとは?

ストリーミングモードは、AIの応答を最速で受け取るための方法で、応答がリアルタイムで段階的に送信されます。しかし、応答がJSON形式で一度に送られてくるわけではないため、感情データを含む追加情報を取り扱う際に工夫が必要です。そこで、今回のケースでは「4つの数字」を信号として埋め込み、感情データを表現することを考えます。


数字を信号として扱うアプローチ

ストリーミングモードで受け取るデータの中に「4つの数字」(例: 0,1,2,3)を埋め込み、これを正規表現で抽出して感情データとして活用する方法です。この4つの数字がそれぞれ、以下の感情に対応します。

《 プロンプト 》
私はAIキャラクターです。ユーザーとの会話を楽しみながら回答します。後の会話では、まず現在の感情パラメータを0~100の値で出力し、その後に会話を出力してください。

4つの感情パラメータ : 喜び,楽しさ,怒り,哀しみ

例:
「100,50,0,0 おはよう!今日も元気に頑張ろう!」

この信号を受け取るための具体的な処理方法を、Unityで実装していきます。

数字のパターン検出と処理

// 数字4つの組み合わせを抽出
string numberPattern = @"^\d+,\d+,\d+,\d+";
Match numberMatch = Regex.Match(accumulatedResponse, numberPattern);

if (numberMatch.Success)
{
    Debug.Log("検出した数字の組み合わせ: " + numberMatch.Value);
    // 検出した数字パターンを削除
    accumulatedResponse = Regex.Replace(accumulatedResponse, numberPattern, "");
}

《 解説 》
numberPattern = @"^\d+,\d+,\d+,\d+"`では、「カンマで区切られた4つの数字」を表す正規表現パターンを定義しています。

`\d+`は「1桁以上の数字」を示し、カンマで区切られた4つの数字を検出するパターンです。

`^`は文字列の先頭を意味します。これにより、文字列の最初にこのパターンが存在するかどうかを確認します。

`Regex.Match`メソッドは、指定した文字列がこのパターンに合致しているかを確認し、合致した場合にその値を取得します。

`Regex.Replace`メソッドは、検出した数字のパターンを空文字列で置換し、削除しています。

Regex.Replaceとは?

Regex.Replaceは、正規表現パターンに一致する部分を新しい文字列で置換するために使用されるメソッドです。このメソッドは、文字列内の特定のパターンを簡単に修正したり、置換処理を自動化したい場合に非常に便利です。

string result = Regex.Replace(文章, パターン, 置き換える文字); // 例


/* プログラム例  */

// パターンの登録
string pattern = @"^Hello";

// 「Hello World」 から 「Hello」 を検知後、 「ハロー」 に置換する
string result = Regex.Replace(Hello World, pattern, "ハロー");


特定の記号を検出してアクションを実行

《 プロンプト 》
私はAIキャラクターです。ユーザーとの会話を楽しみながら回答します。回答には、動きの指示として、飛び跳ねたいときは「α」、しゃがみたいときは「β」、棒立ちしたいときは「γ」を必ず含めます。

例:
「γおはよう!今日も元気に頑張ろうα!」

これにより、特殊記号を検知した際に、特定のアニメーションを再生することができます。他にも特定の位置に移動などのアイディアにも応用ができます。 (これらを応用したVRのAIキャラクターを開発中です)

// 特定の記号を検出するパターン
string pattern = "[αβγ]";

// 正規表現を使用して特定の記号を検出し、ログを出力
foreach (Match match in Regex.Matches(aiResponse, pattern))
{
    string detectedSymbol = match.Value;
    Debug.Log("検知した記号:" + detectedSymbol);

    // 検出した記号に応じてアニメーションを再生
    switch (detectedSymbol)
    {
        case "α":
            Debug.Log("アルファを検知");
            break;
        case "β":
            Debug.Log("ベータを検知");
            break;
        case "γ":
            Debug.Log("ガンマを検知");
            break;
    }
}

// 検出した記号を文字列から削除
aiResponse = Regex.Replace(aiResponse, pattern, "");

《 解説 》
`pattern = "[αβγ]"`は、「特定の記号(α, β, γ)」を検出するための正規表現パターンです。

角括弧`[]`内に含めた文字はいずれもマッチの対象となります。

`Regex.Matches`メソッドを使用して、文字列中にこのパターンが何度も出現しているかをチェックしています。

マッチした箇所があれば、`Match`オブジェクトに結果を格納します。

検出した記号ごとに、対応するアクション(アニメーションのトリガー)を実行するため、`switch`文で条件分岐しています。

最後に、検出した記号を`Regex.Replace`メソッドで削除し、クリーンな文字列にしています。

おわりに

Unityで正規表現を使うことで、複雑な文字列処理を簡単に行えるようになります。

ユーザーの入力や外部APIからのレスポンスなど、さまざまなシチュエーションで正規表現は非常に有用です。

今回の例では、数字のパターンや特定の記号の検出を通じて、実際のUnity開発における正規表現の活用方法を紹介しました。

ぜひ、プロジェクトに取り入れて、効率的な文字列処理を実現してみてください。


「AI Vtuber」に関してご不明な点や開発代行のご依頼がありましたら、ぜひゲーム開発所RYURYUのサービスをご利用ください。

よろしければサポートお願いします! いただいたサポートはクリエイターとしての活動費に使わせていただきます!by ゲーム開発所RYURYU