キーワードからのキャッチコピーの自動生成をChatGPTとGPT-2で比較してみた！

# はじめに

初めまして。AMBL株式会社の小関です。この記事は[AMBL株式会社 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/ambl-rd)の3日目の記事です。

この記事では、キャッチコピーの自動生成をChatGPTとGPT-2で比較してみます。

本当はGPT-2をファインチューニングしてキーワードから自動生成するネタを投稿するつもりでしたが、ChatGPTが出ちゃったので急いで書き直しました。

# キャッチコピーと自動生成について知ろう！

そこのあなた、読み飛ばそうとしましたね？

きっと生成結果が気になったのだと思います。

しかし、一旦立ち止まって考えてみてください。みなさんは「キャッチコピーとは何ですか？」と聞かれて、正確に答えられるでしょうか？

「商品を宣伝するための短い文のことでしょ？」

そういう答えでも間違いではありませんが、それだけではキャッチコピーを正しく理解しているとはいえません。

キャッチコピーを自動生成するサービスを作るためには、まずはキャッチコピーがどういうものか理解していなければ、ユーザーの需要に合わないサービスを作ってしまうことになります。

そこで、まずはキャッチコピーについて概観するとともに、現在キャッチコピーの自動生成がどこまで進んでいるかをご紹介します。

次に、まずはGPT-2のファイチューニングの実装と生成結果についてご説明します。

最後にChatGPTでの生成結果をご紹介します。

# キャッチコピーとは？

初めに[Wikipediaの「キャッチコピー」の記事](https://ja.wikipedia.org/wiki/%E3%82%AD%E3%83%A3%E3%83%83%E3%83%81%E3%82%B3%E3%83%94%E3%83%BC)から引用してみましょう。

>キャッチコピーまたはキャッチフレーズとは、主に商品や作品の広告など、何らかの告知や宣伝に用いられ、謳い文句や煽り文句となる文章で、広告コピー（広告文）の一部である。

広告に用いられるという性質から分かるように、キャッチコピーはマーケティングと密接に関わっています。

マーケテイング的に言えば、キャッチコピーは「商品やサービスの特徴やメリットを顧客に伝えて興味を持ってもらうための文章」です。

さらにキャッチコピーは、ブランディングの点でも効果を発揮します。キャッチコピーは商品の付加価値となり、競合商品と差別化するための要素として機能します。

特にキャッチコピーを作るにあたって重要なのは、「その商品のどういう点をアピールするのか」という目的の部分です。面白い言葉遣いや印象に残るフレーズといった表面的な部分も大切ではありますが、何よりもまず「伝えたい目的に沿っている」ことが最優先事項となります。

例えば、有名なキャッチコピー「そうだ 京都、行こう」は、JR東海が平安遷都1200年に合わせて京都旅行を促すキャンペーンのコピーとして誕生しました。

もしその目的が「歴史ある寺社への旅行を促すため」だったなら、「そうだ 京都、行こう」というコピーは京都に限定してしまっているのでボツということになるでしょう。

これは自動生成する場合でも変わりません。響きの良い言葉をなんとなく組み合わせたところで、そのキャッチコピーを作る目的に合っていなければ有用ではないのです。

ちなみにキャッチコピーのような短い文章は、著作物として認められることはあまりありません。

* [有名なキャッチコピー・キャッチフレーズには「著作権」がないから、勝手に使っていいの？](https://webtan.impress.co.jp/e/2019/03/13/31768)

短歌や俳句のような「創作性」のある文章は著作物として認められますが、キャッチコピーに「創作性」が認められるケースは少ないようです。とはいえ露骨に他人のキャッチコピーを模倣することは避けた方がよいでしょう。

# キャッチコピーの自動生成の現在位置

現在、キャッチコピーの自動生成サービスが数多く誕生しています。こうしたサービスの多くは、GPT-3を基盤としています。

GPT-3は、イーロン・マスクらが設立したアメリカの非営利団体「Open AI」によって開発された言語モデルです。約45TBの大規模なコーパスを約1,750億個のパラメータを用いて学習させています。これにより、非常に高い精度で文章を自動生成することが可能になりました。

前身のモデルであるGPT-2では約40GBのコーパスを約15億個のパラメータで学習していたことから比較すると、かなり大規模になったといえるでしょう。

GPT-3を用いたキャッチコピーの自動生成ツールは海外が先行しており、[「WriteSonic」](https://writesonic.com/)、[「copy.ai」](https://www.copy.ai/)、[「CopySmith」](https://copysmith.ai/)、[「Jasper AI」](https://www.jasper.ai/)などがあります。

こうしたキャッチコピーの自動生成は、近い将来、当たり前に行われるようになるでしょう。

例えば検索サイトでは、検索結果のページの上部に広告が挿入されますが、こうした広告のキャッチコピーをパーソナライズするために、その場で自動生成されるようになるでしょう。また同様に、ウェブサイトの広告も自動生成によって最適化されていくことは、容易に想像できます。

国内に目を向けると、GPT-3を用いたAIコピーライティングツールとして、[「Catchy」](https://lp.ai-copywriter.jp/)が2022年6月30日からサービスを開始しています。「Catchy」は、商品情報を説明する文章を入力として、キャッチコピーを生成することができます。

その他のキャッチコピー生成サービスとしては、AIコピーライター「AICO」などに取り組んできた電通の「CXAI」があります。またキャッチコピー生成ではないものの、東大松尾研究室発の[「ELYZA」](https://elyza.ai/)が、文章執筆AI「ELYZA Pencil」を公開しています。しかし、どちらもGPT-3を利用していないようです。

# GPT-2とは？

>GPT-2はOpenAIが開発した大型言語モデルです。このモデルは大量のデータを用いて訓練され、人間のようなテキストを生成することができます。GPT-2とは「Generative Pretrained Transformer 2」の略で、"transformer"という部分は、このモデルを訓練するために使用されるニューラルネットワークアーキテクチャの種類を表しています。GPT-2は、文章がまとまり、人間が書いたかのようなテキストを生成する能力が特徴的です。

このGPT-2の説明は、最近話題の[「ChatGPT」](https://openai.com/blog/chatgpt/)で生成しました。ChatGPTは、GPT-3.5をベースにファインチューニングされたモデルです。文章の内容は大体合っていますし、上でも少し解説しているので、これで十分ということにしようと思います。

# GPT-2でのファインチューニングの実装
今回は、スペースを空けてキーワードを並べて入力すると、その続きとしてキャッチコピーが生成されることを目標としました。本来ならば目的も指定できると良いのですが、学習データを作成することが難しいため断念しました。

以下の2つを参考にしています。

GPT-2の転移学習によるキーワードを考慮した広告文生成
https://doi.org/10.11517/pjsai.JSAI2021.0_2D4OS7b03

GPT-2をファインチューニングしてニュース記事のタイトルを条件付きで生成してみた。
https://qiita.com/m__k/items/36875fedf8ad1842b729

## データセット
ファインチューニングに使用したデータは、ウェブから約3万件収集しました。

## 前処理
前処理については、こちらの記事を参考にしました。

前処理、前処理、そして、前処理 （自然言語処理：日本語編）
https://note.com/narudesu/n/na35de30a583a

データ元がバラバラなので、それによって前処理の方法を少しずつ変えています。

基本的には、URLの削除、文字種の統一、不要なタグなどの削除をしています。

入力とするキーワードについては、ひとまずキャッチコピー中に存在する名詞を抽出して、スペースを空けて並べました。データによってはタグに使えそうな名詞が含まれるため、それもキーワードとして利用しています。

最終的に、１番目のカラムにスペースを空けて並べたキーワードを入れ、2番目のカラムにキャッチコピーを入れたcsvを作成しました。

## ファインチューニング
Google Colabで実行しました。ランタイムをGPUに変更するのを忘れずに。
```python:load.py
!pip install git+https://github.com/huggingface/transformers
!pip install sentencepiece
!pip install datasets

!git clone https://github.com/huggingface/transformers

from google.colab import drive
drive.mount('/content/data')

pip install -r ./transformers/examples/pytorch/language-modeling/requirements.txt

import pandas as pd

# 学習データの保存先
save_dir = save_path

df = pd.read_csv(file_path, encoding="utf8")

with open(save_dir + file_name, 'w', encoding="utf8") as output_file:
    for index, row in df.iterrows():
      keyword_tag = row[1]
      text = row[2]
      tagged_text = '
' + keyword_tag + '[SEP]' + text + '
'
      output_file.write(tagged_text + '\n')

```
ファインチューニングのパラメータ（file_pathとかoutput_pathとか）は適宜変更してください。
10エポック回して約2時間30分かかりました。
```python:finetuning.py
# ファインチューニング
!python ./transformers/examples/pytorch/language-modeling/run_clm.py \
  --model_name_or_path=rinna/japanese-gpt2-medium \
  --train_file=file_path \
  --do_train \
  --num_train_epochs=10 \
  --save_steps=10000 \
  --block_size 512 \
  --save_total_limit=3 \
  --per_device_train_batch_size=1 \
  --output_dir=output_path \
  --overwrite_output_dir \
  --use_fast_tokenizer=False
```
## キャッチコピー生成
input_tagにスペースを空けてキーワードを入力します。
```python:generate.py
# ファインチューニングしたモデルで生成
from transformers import T5Tokenizer, AutoModelForCausalLM

tokenizer = T5Tokenizer.from_pretrained("rinna/japanese-gpt2-medium")
model = AutoModelForCausalLM.from_pretrained(output_path)

input_tag = hogehoge
pre_txt = '
' + input_tag + '[SEP]'

num_return_sequences = 20
input = tokenizer.encode(pre_txt, return_tensors="pt")
output = model.generate(input, do_sample=True, max_length=200, top_k=500, top_p=0.90, num_return_sequences=num_return_sequences)
decoded = tokenizer.batch_decode(output,skip_special_tokens=True)
print(decoded)
```

## 生成結果の考察

「和服を多くの人に着てもらうこと」を目的として、おしゃれなデザインをアピールするために「私 和服 おしゃれ デザイン」と入力して得られたのが以下のキャッチコピーです。

>和服は私のおしゃれデザイン。
和服は私のおしゃれデザイン。
和服の私って、おしゃれなの!?
和服にも、おしゃれなデザインがある。私だけのものになった。
おしゃれは、和服で始めておしまい。
おしゃれは、和服から。おしゃれは、私から。
和服は私のおしゃれなデザイン。
和服は私に、おしゃれを教えてくれた。
和服と私のおしゃれは、だいたい同じだ。
私はいつも和服のデザインを考えているの。
おしゃれは、和服から。私だけおしゃれは、デザインから。
和服のデザインって、私だけのものじゃない。
私はいつもよりおしゃれな和服にした。おしゃれは和服から。
おしゃれは和服から。おしゃれはデザインから。
和服が似合う私って、おしゃれな私じゃん。
おしゃれな私でありたいから。おしゃれな和服をデザインするのです。
私は和服で、おしゃれです。
おしゃれなデザインの和服は、私をおしゃれにしてくれる。
おしゃれな和服は私をおしゃれにする。
おしゃれは、和服から。私もおしゃれになる。
和服のおしゃれは、私がデザインする。
和服おしゃれな私って、和服デザインしかないの?
和服は私に、おしゃれなデザインをしてくれた。
おしゃれは、和服から。おしゃれは、デザインから。
和服デザインの私が、おしゃれなデザインのお洋服を作る。


どれも雰囲気はキャッチコピーっぽさがあります。

「おしゃれは、和服で始めておしまい。」とか「和服は私のおしゃれなデザイン。」は、アイディアとして良さそうです。

一方、「和服のデザインって、私だけのものじゃない。」は、メッセージが伝わりにくいです。和服の一般性を伝えることが今回の目的ではありません。

また「和服デザインの私が、おしゃれなデザインのお洋服を作る。」も、文法的に変です。「和服デザイナーの私」なら文意は分かりますが、本来の目的からは外れてしまいます。

このように、目的に沿っていない出力も散見されました。単純に数撃ちゃ当たるで生成してピックアップする使い方であれば使えそうです。しかし目的を入力に指定できていないため、精度の低さは否めません。

また、キーワードに指定した名詞が高い確率で含まれる一方、関連する単語がなかなか出てこないので、そこも改善すべきでしょう。

# ChatGPTでのキャッチコピー生成

次に、先程も登場した「ChatGPT」でキャッチコピーを生成してみます。

やり方は、キャッチコピーを作ってもらうようお願いするだけなので簡単です。

以下が私のした質問と、その回答です。ちなみに、全ての質問は日本語で投げており、回答も日本語で返ってきています。GPT-2ではできませんでしたが、キャッチコピーの目的として「和服を多くの人に着てもらうこと」を指定してみました。

>Q：「和服を多くの人に着てもらうこと」を目的として、おしゃれなデザインをアピールするキャッチコピーには、どのようなものが考えられますか？
>
>A：
「着ることで美しく華やぎ、和服で世界を美しく変えよう」
「和服は美しく、そして新しい風を生み出す」
「和服で自分らしさを表現しよう」
「和服は普段の生活にも、特別な場面にもぴったり」
「和服は身につけるだけで美しさが増す」

目的にも沿っていますし、キーワードを投げなくても意図に沿ったキャッチコピーが生成されていますね。

それでは、キーワードを含めたキャッチコピーの生成を試してみます。

>Q：「和服を多くの人に着てもらうこと」を目的として、「私 和服 おしゃれ デザイン」をキーワードとした、おしゃれなデザインをアピールするキャッチコピーとして、どのようなものが考えられますか？
>
>A：
"私和服、世界を魅了する"
"和服の美しさを、世界に広めよう"
"和服で自分らしさを表現しよう"
"和服で新しい世界を創ろう"
"和服で世界を楽しもう"
"和服で世界を魅了する"

ちょっと日本語が変になりました。それに「キーワードとした」という入力では弱かったのか、「おしゃれ」や「デザイン」という言葉は含まれませんでした。

質問をこちらの意図が分かりやすいように変えてみます。

>Q：「和服を多くの人に着てもらうこと」を目的として、「私 和服 おしゃれ デザイン」のキーワードを含めた、おしゃれなデザインをアピールするキャッチコピーとして、どのようなものが考えられますか？
>
>A：
「私たちがデザインする和服は、おしゃれさと伝統の美しさが調和した、新しいスタイルをお届けします。ぜひ、多くの方にご着用いただきたいと思います。」
>
>「「私たちのデザインする和服は、伝統を継承しながらもモダンなスタイルに仕上げました。おしゃれさと伝統の美しさが融合した、私たちだけの和服をお楽しみください。」
>
>「和服は、伝統的な着物と現代的なデザインが融合した、美しい衣装です。私たちは、和服を多くの人々に着用していただき、日本文化を世界中に広めたいと思います。」

今度はキーワードが全てではないものの含まれた文になりました。しかし代わりに長い文章になってしまい、キャッチコピーではなくなってしまいました。そもそもChatGPTは会話に特化しているので、本来の使い方ではないので仕方ないかもしれません。

それでも、めげずに入力を変えてみましょう。キーワードが長いのが原因かもしれません。キーワードを減らして試してみましょう。

>Q：「和服を多くの人に着てもらうこと」を目的として、「和服 おしゃれ デザイン」のキーワードを含めた、おしゃれなデザインをアピールするキャッチコピーとして、どのようなものが考えられますか？
>
>A：
一例として、「和服で私が輝く。おしゃれなデザインで、みんなも輝こう」というキャッチコピーが考えられます。また、「和服で伝統を継承。おしゃれなデザインで、新しい時代を切り開こう」というキャッチコピーも考えられます。

ちょっと長いですが、キャッチコピーっぽさが出てきました。提示の仕方が会話形式になったのも面白いです。

もっと短く、「和服 おしゃれ」の2単語で試してみましょう。

>Q：
「和服を多くの人に着てもらうこと」を目的として、「和服 おしゃれ」のキーワードを含めた、おしゃれなデザインをアピールするキャッチコピーとして、どのようなものが考えられますか？
>
>A：
「和服でおしゃれに！」
「伝統的な和服が新しいスタイルへ」
「和服で今を感じる」
「和服で振り返る伝統と未来」
「和服で息吹を感じる」
「和服で心を癒す」
「和服で自分らしさを表現する」
「和服で日常を彩る」

キャッチコピーとしては良いですが、キーワードが含まれませんでした。やはりこれは質問の仕方に原因があるようです。

そこで次のように質問を変えてみました。

>Q：「和服を多くの人に着てもらうこと」を目的として、「和服」と「おしゃれ」の言葉を必ず含むキャッチコピーとして、どのようなものが考えられますか？
>
>A：
「和服とおしゃれを融合させた最高のデザインで、多くの人を魅了する。」
「和服でおしゃれに。多くの人に楽しんでいただきたい。」
「和服とおしゃれの新しいスタイルをお届けする。多くの人が楽しめるよう心がけています。」
「和服でもおしゃれできる。多くの人を魅了する独創的なデザインです。」

少し長いかもしれませんが、キーワードを含めたキャッチコピーが生成できました。キーワードをスペースでつなぐのではなく括弧でひとつひとつ囲むことと、「言葉を必ず含む」と指定することが重要だったようです。

それでは、当初のように「私」と「和服」と「おしゃれ」と「デザイン」の全てを含めたらどうなるでしょうか？　また長文になってしまいそうな気もしますが……。

>Q：「和服を多くの人に着てもらうこと」を目的として、「私」と「和服」と「おしゃれ」と「デザイン」の言葉を必ず含むキャッチコピーとして、どのようなものが考えられますか？
>
>A：
以下のようなキャッチコピーが考えられます。
>
>「私が選んだ和服、おしゃれなデザインで着こなす」
「私がデザインする和服、おしゃれな着こなし方を紹介」
「私のおすすめする和服、おしゃれなデザインを見せます」
「私が選ぶ和服、おしゃれなデザインで自慢します」
「私がデザインする和服、おしゃれな着こなし方をお届け」
上記のように、「私」「和服」「おしゃれ」「デザイン」を必ず含むキャッチコピーを考えることができます。また、「和服を多くの人に着てもらうこと」を目的としたキャッチコピーであれば、他にもたくさんの提案が考えられますので、自分なりのアイデアを活用してみてください。

成功ですね！　これで当初の目的通りのキャッチコピーを生成できました。

ChatGPTでは、質問文を適切に書く「日本語能力」がかなり重要になるといえるでしょう。こうした能力は、上手に検索をする能力にも近いかもしれません。

# GPT-2とChatGPTの比較と考察

試す前は「ChatGPTの方が簡単に良いキャッチコピーが得られるのでは？」と期待していましたが、いざやってみると質問を最適化する作業が必要になり、あっという間というわけにはいきませんでした。

それでもGPT-2の場合は、データを集めてキーワードから生成するようにファインチューニングする必要があるので、その手間を考えれば十分簡単だといえます。

ちなみにGPT-2にChatGPTへ渡したような質問を渡してみましたが、以下のようにキャッチコピーはうまく生成できませんでした。

>質問:「和服を多くの人に着てもらうこと」を目的として、「私」と「和服」と「おしゃれ」と「デザイン」の言葉を必ず含むキャッチコピーとして、どのようなものが考えられますか?
回答:私は、和服をたくさんの人に着てもらうことと、和服が好きでない方々にも、和服を着ることの素晴らしさ、和服の着方を学ぶことが、一つの日本的な文化であると考えています。 和服は、着

それに、ChatGPTではキャッチコピーの目的（「和服を多くの人に着てもらうこと」）を伝えられることが大きいと感じました。そもそも今回GPT-2のファインチューニングでは目的を指定できるようにチューニングしていませんが、学習データに目的のカラムを追加することは容易ではありません。

改めて、それぞれで生成された結果を再掲してみましょう。
>* GPT-2
和服は私のおしゃれデザイン。
和服は私のおしゃれデザイン。
和服の私って、おしゃれなの!?
和服にも、おしゃれなデザインがある。私だけのものになった。
おしゃれは、和服で始めておしまい。

>* ChatGPT
「私が選んだ和服、おしゃれなデザインで着こなす」
「私がデザインする和服、おしゃれな着こなし方を紹介」
「私のおすすめする和服、おしゃれなデザインを見せます」
「私が選ぶ和服、おしゃれなデザインで自慢します」
「私がデザインする和服、おしゃれな着こなし方をお届け」

こうして比較すると、ChatGPTの方が「紹介」や「見せます」「お届け」など、キーワードとしては与えていませんが、「和服を多くの人に着てもらうこと」という目的に見合った表現になっていると感じます。

試しに、目的を「和服で自分の個性を表現すること」に変えてChatGPTに生成してもらいましょう。

>Q：「和服で自分の個性を表現すること」を目的として、「私」と「和服」と「おしゃれ」と「デザイン」の言葉を必ず含むキャッチコピーとして、どのようなものが考えられますか？
>
>A：
「私が着る和服は、美しさと個性を融合したおしゃれなデザインです。」
「和服で、私らしさを引き出す。美しいデザインとともに。」
「私が着る和服は、個性を磨いたおしゃれデザイン。私だけの1着を見つけましょう。」

「私らしさ」や「個性」という言葉が含まれるようになりました。ちゃんと目的に沿った内容になっていますね。

キャッチコピーは「伝えたい目的に沿っている」ことが重要であるという話を「キャッチコピーとは？」の章でご紹介しました。

こうした視点から考えると、ChatGPTはキャッチコピーの生成においてGPT-2よりも優れているといえるでしょう。（GPT-3.5がベースなので、当たり前ではありますが）

また、今回はChatGPTでキャッチコピーの生成を試しましたが、本来は会話をするためにチューニングされたものです。

実際に使うのであれば、キャッチコピーの生成用にチューニングすることでさらに高精度な結果が出ることが期待できるでしょう。近い将来、ChatGPTのような文章生成が広く利用されていくことになりそうです。

# おわりに

今回はGPT-2とChatGPTで、キーワードからのキャッチコピーの自動生成を比較しました。

「ChatGPT」以外にも、2022年夏に話題となったmidjourneyやstable diffusionといった画像生成のように、テキストを自然文で入力して出力を得るプロンプト・エンジニアリングやプロンプティングと呼ばれる手法が実用段階に入りつつあります。

コードもプロンプトで生成できるようになってきたので、いずれは欲しいサービスを検索すれば、その場でウェブサイトごと生成されるようになるかもしれません。

実際、「検索」と「生成」は似た概念であり、この20年で世界に広まった「検索」をベースとした社会は、「生成」をベースとした社会に変化していくように私は思います。

「検索」と「生成」について興味がある方は、徳井直生先生が書かれた『創るためのAI 機械と創造性のはてしない物語』という書籍をおすすめしておきます。

[『創るためのAI 機械と創造性のはてしない物語』](http://www.bnn.co.jp/books/10811/)

私は、AIと創作の分野に非常に興味があるので、今後も引き続き学んでいきたいです。

# 参考記事
## キャッチコピー関連
顧客の関心を得るキャッチコピーの作り方とは？意味から手順まで解説
https://online-event.dmm.com/useful/2046/

そうだ 京都、行こう。 - Wikipedia
https://ja.wikipedia.org/wiki/%E3%81%9D%E3%81%86%E3%81%A0_%E4%BA%AC%E9%83%BD%E3%80%81%E8%A1%8C%E3%81%93%E3%81%86%E3%80%82

## 文章生成関連
キャッチコピーや商品説明文を自動生成、超高精度言語AI「GPT-3」を使ったコピーライター「Catchy」が登場
https://thebridge.jp/2022/07/catchy-official-launch

自然言語処理モデル「GPT-3」の紹介
https://www.intellilink.co.jp/column/ai/2021/031700.aspx

## 実装
GPT-2の転移学習によるキーワードを考慮した広告文生成
https://doi.org/10.11517/pjsai.JSAI2021.0_2D4OS7b03

GPT-2をファインチューニングしてニュース記事のタイトルを条件付きで生成してみた。
https://qiita.com/m__k/items/36875fedf8ad1842b729

前処理、前処理、そして、前処理 （自然言語処理：日本語編）
https://note.com/narudesu/n/na35de30a583a