見出し画像

ChatGPTで自然言語処理のData Augmentationやってみた。

※ChatGPTと言っていますが、正確にはOpenAIの「code-davinci-003」というGPT-3のモデルを使っています。

ChatGPT、すごいですよね!
質問すれば、ある程度のことはいい感じの返答をしてくれますね。

例えば「〜と似た文章を作って。」メッセージをChatGPTに投げることで、似たような文章を生成できます。

 入力:

import openai

openai.api_key = key #keyはopenaiのページから取得してください。
model_engine = "text-davinci-003"

prompt = """

「MatrixFlowは、AIの開発に特化したノーコード開発のプラットフォームです。
画面上でブロックを動かすという視覚的な操作だけでAIを開発できます。
様々な課題や要望に応じたAIモデルのテンプレートが用意されているため、テンプレートを使って大まかな機能を実装することが可能です。
AIの活用方法としては、商品の売上予測や需要・在庫予測などが挙げられます。
過去の販売実績から将来の売上を予測したり、在庫の変動から必要在庫数の算出や無駄なコストを検知することが可能です。
小売業だけでなく、工業機械の異常検知、採用のマッチングを最適化するなど、あらゆる業界の課題を解決できるテンプレートが用意されています。
ノーコードでAIを開発した後、実際にデータを学習させる作業もMatrixFlow内で時短できるため、開発にかかる時間・労力を大幅に削減できます。
もちろん、ノーコードで開発したAIモデルにプログラミングで機能を追加したり、仕様を変えることも可能です。」

と似た文章を作って。

"""

completions = openai.Completion.create(
    engine=model_engine,
    prompt=prompt,
    max_tokens=1024,
    n=1,
    stop=None,
    temperature=0.5,
)


message = completions.choices[0].text
print(message)

出力:

MatrixFlowは、AI開発を効率化するノーコード開発プラットフォームです。
視覚的な操作でブロックを動かすことで、AIモデルを開発することができます。
テンプレートを使用して、商品の売上予測や需要・在庫予測など、様々な業界の課題を解決できるAIモデルを構築できます。
MatrixFlowでは、開発後にデータを学習させる作業も時短できるため、開発時間を大幅に短縮できます。
また、ノーコード開発したAIモデルにプログラミングで機能を追加したり、仕様を変更することも可能です。

元の文章には「効率化」という単語は入っていないが、生成した文章には入っています。これは周囲の単語列から「効率化」という単語が適切だと判断して差し込んだのでしょう。

つまりこれは。。。。あれに使える!

そう!Data Augmentationだ!!!!!データサイエンティストなら当然の発想だよなぁ!!

ということでやってみた。

次の関数を作り、訓練データの一部をデータ拡張します。

import openai

openai.api_key = key #keyはopenaiのページから取得してください。
model_engine = "text-davinci-003"

def generate_sim_doc(doc):
    prompt = """
    「{}」
    と似た文章を作って。
    """.format(doc)


    completions = openai.Completion.create(
        engine=model_engine,
        prompt=prompt,
        max_tokens=1024,
        n=1,
        stop=None,
        temperature=0.5,
    )


    message = completions.choices[0].text
    return message

データセットは毎度お馴染みの「ライブドアニュース」です。

データの準備

import polars as pl
from pathlib import Path
import re
import neologdn

def normalize(text):
    text = re.sub(r"http(s)?:\/{2}[\d\w-]+(\.[\d\w-]+)*(?:(?:\/[^\s/]*))*", "", text) #URLの除去
    text = re.sub(r"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\+0900", "", text) #日付の除去
    text = text.lower()
    text = neologdn.normalize(text)
    return text


dataset_dir = Path("/Users/tdual/Downloads//ライブドアニュース/text/")

text_dict = []
for p in dataset_dir.iterdir():
    if p.is_dir():
        label = p.name
        for text_path in p.glob("*.txt"):
            if text_path.name == "LICENSE.txt":
                continue
            with open(text_path) as f:
                t = f.read()
            t = normalize(t)
            d = {
                "filename": text_path.name,
                "label": label,
                "sentence": t
            }
            text_dict.append(d)
            
df = pl.DataFrame(text_dict)

とあえず、normalize関数を作って、その関数で綺麗にした文章でデータセット用のDataFrameを作っておきます。

df = df.sample(frac=1) #シャッフル

n_labels = len(df)

df_train = df[:int(n_labels*0.8)]
df_test = df[int(n_labels*0.8):]

df_train.write_csv('train.csv')
df_test.write_csv('val.csv')

n_trains = len(df_train) 
print(n_trains) # 5893

Data Augmentationを実施

df_da = pl.DataFrame(df_train[["label", "filename"]].to_dict())
df_da = df_da.with_columns(
    (df_da["filename"]+"_da").alias("filename")
)
df_da["sentence"] = df_train["sentence"].apply(lambda x: generate_sim_doc(x[:2000]))

かなり時間がかかり、10時間ほどかけても1500列程度しかData Augmentationができなかった。
今回は全てのtrainデータに対して実施せずに1500列程度に対して実施して、そのData Augmentationを含めて学習した場合と、何もしない場合で精度の比較をします。

データセットの情報についてまとめておきます。


MatrixFlowというノーコードAI構築サービスでは日本語テキストの分類ができるので、今回はMatrixFlowを使います。

今回はWord2Vecで単語を50次元のベクトル化した後に、平均を取ってニュース記事のベクトルを作ります。(SWEM-averっていうやつですね。)
その後に、そのベクトルをAutoFlow(AutoML機能)を使って分類します。
レシピは以下のようなレシピになります。

文書分類のレシピ

それぞれ、1時間程度で学習が終わりました。


【結果】
「Data Augmentation無し」の結果

Data Augmentation無し

「Data Augmentation有り」の結果

Data Augmentation有りの結果

「Data Augmentation無し」の正解率が85.2%で、「Data Augmentation有り」が87.2%だったので、良くなってますね!
これは実務でも使えそうですね。

【おまけ】
めっちゃ金かかった。


↓今すぐフォローすべきキラキラ アカウント

↓今すぐ登録すべきキラキラAIサービス

じゃあの。



いいなと思ったら応援しよう!