概要
「せっかく書くならバズりたい」とQiita投稿者なら思うこともあるかもしれません.
なので過去のバズった記事を参考に, ChatGPTにタイトル文を添削してもらうコードを書きました・
(ChatGPTで遊びたいと思っていたことですし......)
全体の流れ
全体としては
- QiitaAPIを用いてバズった記事の収集
- 類似文章抽出(入力したタイトルに関係の有りそうな記事の抽出)
- ChatGPTによるタイトルの添削
といった流れで進めていきます.
QiitaAPIを用いてバズった記事の収集
まず初めにQiitaAPIを通じてバズった(「あとで読む」が100以上の)記事を最新10,000件ほど取得しました.
token = "himitsu"
def getTitles(page):
url = 'https://qiita.com/api/v2/items'
headers = {'Authorization': 'Bearer {}'.format(token)}
query_params = {# クエリパラメータの設定
'page': page, # ページ番号
'per_page': 100, # 1ページあたりの件数(最大100まで指定可能)
'query' : 'stocks:>100' #あとで読むの件数が100件以上
}
response = requests.get(url, params=query_params, headers=headers)
data = response.json()
return [item['title'] for item in data]
titles = []
for i in tqdm(range(1,100)):
titles += getTitles(i)
これを実行することで, Qiitaのバズったタイトル一覧が取得できます.
類似文章抽出(入力したタイトルに関係の有りそうな記事の抽出)
本来なら, この10000件全てをChatGPTのプロンプトに突っ込みたいところですが, ChatGPTには文字数(トークン)制限があります.
そのため, 入力した(添削してほしい)タイトルと関連性の深いものtop50を抽出しました.
詳細としては, 学習済みモデルで「添削してほしいタイトル」「バズったタイトル一覧」それぞれをベクトル化します.
次にこのベクトル間のcos類似度が高いものtop50を抽出します.
ChatGPTによるタイトルの添削
プロンプトは↓のようにしました。もっと良い手法とかあったら教えてください
prompt = PromptTemplate(
input_variables=["titles_buzz", "title"],
template="""{titles_buzz}
上記の内容はバズった技術記事のタイトル一覧です。
この内容を踏まえ、よりバズりやすいようタイトルを直すことをしてください
あなた:符号化を楽にするツールについて→文字列のエンコード・デコードを瞬殺するencodeMaxを作りました
お気に入りのfont-family→個人的なかわいいCSSのfont-familyランキングを発表
{title}→""",
)
下2行は, 事前にいくつか具体例を事前に示すfew-shot learningという手法です.
title = "ここをよしなにする"
titles_buzz = "ここに関連度の高い記事タイトル50をかく"
llm = OpenAI(temperature=0)
chain = LLMChain(llm=llm, prompt=prompt)
print(chain.run(title=title, titles_buzz=titles_buzz))
実際に添削してもらった
自分の過去の記事をChatGPTに添削してもらいました.
オリジナル | 添削後 |
---|---|
二択を繰り返すことで新しい本と出逢えるwebアプリを作った | 「選ぶのが面倒なら二択で決めちゃおう!新しい本と出逢えるwebアプリを作りました」 |
【水曜日のダウンタウン】所持金5連続UP企画で適当に声をかけるとどうなるか、手計算で検証してみた | 【水曜日のダウンタウン】所持金5連続UP企画で適当に声をかけるとどうなるか、実践検証してみた |
文章がどの作家に似ているか判別するモデルを作った話 | 作家の筆致を分析するAIモデルを開発しました!自分の文章がどの作家に似ているかチェックしてみよう |
変分オートエンコーダでそっくりな漢字ランキングを作った | 新しいオートエンコーダで漢字のそっくり度をランキング化してみた! |
OpenCVで写真をドット絵調にする | OpenCVで写真をドット絵風に変換する方法を解説!手軽にオシャレなアート作品を作ろう |
Wordleで最適解での平均手数を概算してみた | Wordle攻略!最短手数で解くための平均手数を概算してみました【数式解説付き】 |
トンパ文字をスタンプ感覚で送れるプログラムを作った | LINEでトンパ文字を簡単に送信!スタンプ感覚のトンパ文字プログラムを作りました |
あみだくじの横線は何本引くべきか | あみだくじの横線の本数を決める方法を解説します |
物理学で理解するグラフフーリエ変換 | グラフ理論と物理学を融合した、離散フーリエ変換の理解を深める方法を紹介します |
譜面からDance Dance Revolutionの難易度を推し量るモデルをDNNで作った | Dance Dance Revolutionの難易度を簡単に推測するモデルをDNNで実装しました! |
全体的に, 軽い文章でキャッチーになっていますね.
恥ずかしくて自分ではかけない文章です.
たまに文意を取り違えているものもありますが, タイトル決めの参考になりそうです.
最後に
本来は, こういったことはもうちょっとちゃんとした自然言語処理(スタイル変換?)でやったほうがいいんだろうなと考えています.
機会と時間があればそちらも挑戦してみたいです.