GoogleトレンドとChatGPTを使って今年の漢字を決めてみた
まえがき
2024年の今年の漢字は 「金」 だそうです。
パリオリンピック、新紙幣、裏金問題、佐渡金山の世界遺産登録など、調べてみると確かに「金」という漢字に相応しい出来事が多かったようにも思います。
しかし、今年の漢字はあくまで応募の票数によって決まるものなので、もう少しデータに基づいた結果も見てみたいなと思いました。
そこで、Googleトレンドで2024年の注目キーワードを抽出し、それをChatGPTに投げることで連想される漢字を出力してもらい、スコアリングして今年の漢字ランキングを見てみようと考えました。
STEP1 Googleトレンドから各月の注目キーワードをCSVダウンロードする
Googleトレンドの「調べる」のメニューから遷移すると、注目されている検索クエリを見ることができます。
期間を指定することができるので、今回は1月~12月までの各月ごとにCSVをダウンロードしてみました。
最初は年間でダウンロードしようかと思ったのですが、各月に絞ったほうが多くのキーワードを対象にできるのではないかと思ったのでこうしています。
ダウンロードされたCSVには検索クエリの増加率の数値も記載されています。
これは1月のみ抜粋した例です。パルワールドや能登半島地震のクエリが急上昇していたようですね。
RISING
パル ワールド,急激増加
能登 地震,急激増加
能登 半島 地震,急激増加
能登 半島,急激増加
石川 県 地震,"4,250% 増加"
アジア カップ,"3,650% 増加"
芦原 妃名子,"2,400% 増加"
桐島 聡,"2,150% 増加"
新 空港 占拠,"1,600% 増加"
山本 直 寛,"1,450% 増加"
相沢 友子,"1,300% 増加"
全身 挫滅,"1,200% 増加"
百田 夏 菜子,"1,150% 増加"
年賀状 お年玉,"1,050% 増加"
輪島 市,950% 増加
地震,800% 増加
七草粥,750% 増加
地震 速報,750% 増加
さよなら マエストロ,650% 増加
大塚 里香,650% 増加
大相撲,600% 増加
不 適切 に も ほど が ある,600% 増加
光る 君 へ,550% 増加
箱根 駅伝,500% 増加
サッカー 日本 代表,500% 増加
pytrendsという非公式APIもあるそうで、最初はそれで取得しようと考えていたのですが、pytrendsは特定のキーワードを指定してトレンドを調べることはできるものの、該当月全体での全般的なトップキーワードを調べることはできないようでした。
なので、今回は仕方なく手動ダウンロードしました。
また、この段階でスコアリングの加工もすることにしました。
ちょうど検索クエリの増加率のデータがあるので、これをスコアに変換します。
ChatGPTに加工のPythonプログラムを書いてもらいました。
import re
def score_increase_value(increase_str):
# スコアリング方法:
# "急激増加" → スコア = 10000
# "X,XXX% 増加" → カンマを外して数値化
increase_str = increase_str.strip()
if "急激増加" in increase_str:
return 10000
else:
# "% 増加"を含む場合は、その前の数字を抽出
# 例: "4,250% 増加" → "4250" → 4250
match = re.search(r'([\d,]+)% 増加', increase_str)
if match:
num_str = match.group(1).replace(",", "")
try:
val = int(num_str)
return val
except ValueError:
return 0
return 0
あとは月の値をperiodのカラム、スコアをscoreのカラム、検索クエリをkeywordsのカラムに入れて完成です。
period,score,keywords
2024-01,10000,パル ワールド
2024-01,10000,能登 地震
2024-01,10000,能登 半島 地震
2024-01,10000,能登 半島
2024-01,4250,石川 県 地震
2024-01,3650,アジア カップ
2024-01,2400,芦原 妃名子
2024-01,2150,桐島 聡
2024-01,1600,新 空港 占拠
2024-01,1450,山本 直 寛
2024-01,1300,相沢 友子
2024-01,1200,全身 挫滅
2024-01,1150,百田 夏 菜子
2024-01,1050,年賀状 お年玉
2024-01,950,輪島 市
2024-01,800,地震
2024-01,750,七草粥
2024-01,750,地震 速報
2024-01,650,さよなら マエストロ
2024-01,650,大塚 里香
2024-01,600,大相撲
2024-01,600,不 適切 に も ほど が ある
2024-01,550,光る 君 へ
2024-01,500,箱根 駅伝
2024-01,500,サッカー 日本 代表
STEP2 ChatGPTに各キーワードから連想される漢字を出力してもらう
せっかくなので、最近公開されたo1を使ってみることにしました。
o1はIQ120を超えるテスト結果も出ているとのことだったので、期待...
プロンプトは下記の通りにしてみました。
次のCSVデータ(2024年1月~12月までの話題キーワードとスコア)を参照して下さい。
[ここに STEP1で作成したcsvの内容をペースト]
上記のキーワード一覧について、各キーワードから連想される常用漢字を最大3つまで考えてください。
必ず常用漢字の範囲から選んでください。
抽出した漢字を、それぞれ別カラムとして付与してください。カラム名は kanji_1, kanji_2, kanji_3 とします。
漢字は最大3つで、1つや2つになる場合もあり、その際は空欄を残しても構いません。
出力はCSV形式とし、オリジナルのカラム(period,score,keywords)に加え、kanji_1,kanji_2,kanji_3のカラムを追加した行を出力してください。
そして出力されたものがこちら。
period,score,keywords,kanji_1,kanji_2,kanji_3
2024-01,10000,パル ワールド,世,友,遊
2024-01,10000,能登 半島 地震,能,登,震
2024-01,4250,石川 県 地震,石,川,震
2024-01,3650,アジア カップ,亜,州,杯
2024-01,2400,芦原 妃名子,芦,原,妃
2024-01,2150,桐島 聡,桐,島,聡
2024-01,1600,新 空港 占拠,新,空,港
2024-01,1450,山本 直 寛,山,本,直
2024-01,1300,相沢 友子,相,沢,友
2024-01,1200,全身 挫滅,全,身,滅
2024-01,1150,百田 夏 菜子,百,田,夏
2024-01,1050,年賀状 お年玉,年,賀,玉
2024-01,950,輪島 市,輪,島,市
2024-01,800,地震,震,,
2024-01,750,七草粥,七,草,粥
2024-01,750,地震 速報,震,報,速
2024-01,650,さよなら マエストロ,別,音,指
2024-01,650,大塚 里香,大,塚,里
2024-01,600,大相撲,大,相,撲
2024-01,600,不 適切 に も ほど が ある,不,適,程
2024-01,550,光る 君 へ,光,君,
2024-01,500,箱根 駅伝,箱,根,駅
2024-01,500,サッカー 日本 代表,日,本,代
うーん......どうでしょう?
正直、この出力結果はちょっと微妙かも...と思ってしまいました。
「パルワールド」はまだ仕方ないにしても、「サッカー日本代表」は"蹴"や"球"などが入っていても良いかなと思いますし、「七草粥」なんてそのままですよね...
こういった連想能力はまだあまり高くないのかもしれませんね。(漢字なので尚更)
とはいえ、他の月だと割と頑張っているものもありました。以下一例です。
2024-02,140,マッシュル,筋,鍛,魔
2024-05,70,サーティワン,菓,氷,甘
2024-05,80,ゴジラ 1.0,巨,怪,
2024-09,600,かぐや 様 は 告 ら せ たい スロット,告,賭,台
また、残念ながらo1モデルは現時点ではWeb検索の機能に対応していないようです。
一応GPT4oのモデルで「検索機能を使って調べた上で考えてください」という指示を追加して検索機能を使って試してみたのですが、結果はあまり変わらなかったので、今回はo1モデルの内容を使っていきます。
STEP3 登場した漢字ごとのスコアを合算してソートする
STEP2で作成されたCSVを漢字ごとのデータに加工します。
複数のキーワードで登場している漢字については登場したキーワードごとのスコアを加算していく形で算出しています。
import csv
import glob
import os
from collections import defaultdict
def main():
kanji_scores = defaultdict(int)
input_dir = r"CSVが保存されているディレクトリのパス"
print("Current working directory:", os.getcwd()) # カレントディレクトリ確認
# ディレクトリ内のCSVファイルを全て取得
csv_files = glob.glob(os.path.join(input_dir, "*.csv"))
print("Found CSV files:", csv_files) # 取得できたファイル一覧を表示
for csv_file in csv_files:
print("Processing file:", csv_file)
with open(csv_file, "r", encoding="utf-8") as f:
reader = csv.DictReader(f, skipinitialspace=True)
for row in reader:
# 必要なカラムが存在するか確認
if "score" not in row or "kanji_1" not in row or "kanji_2" not in row or "kanji_3" not in row:
print("Required columns not found in", csv_file)
continue
score_value = row["score"]
# スコアが整数に変換可能かチェック
try:
score = int(score_value)
except ValueError:
print("Invalid score value:", score_value, "in file:", csv_file)
continue
for k_col in ["kanji_1", "kanji_2", "kanji_3"]:
kanji = row[k_col].strip()
if kanji: # 空欄でなければ加算
kanji_scores[kanji] += score
# kanji_scoresをスコア順にソート
sorted_kanji = sorted(kanji_scores.items(), key=lambda x: x[1], reverse=True)
print("Number of kanji found:", len(sorted_kanji))
# 新しいCSV出力
output_path = os.path.join(os.getcwd(), "step3_output.csv")
print("Output path:", output_path)
with open(output_path, "w", newline="", encoding="utf-8") as f:
writer = csv.writer(f)
writer.writerow(["kanji_word", "this_year_kanji_score"])
for k, s in sorted_kanji:
writer.writerow([k, s])
print("CSV has been saved.")
if __name__ == "__main__":
main()
この処理で出力されるのがこちら。
kanji_word,this_year_kanji_score
五,66800
球,33030
中,21800
山,21580
震,18680
日,15960
美,15500
輪,14400
田,13200
車,12950
// 以下省略
漢字ごとに登場キーワードのスコアを合算した結果を得ることができました。
これにて目的達成です。
終わりに
結果としては 「五」 が今年の漢字1位ということになりました。
やはりパリ五輪のキーワードが多くトレンド入りしていたのが理由でしょうね。
次いで 「球」 が2位でしたが、これは大谷選手の活躍で野球関連のクエリが多かったり、バレーボールやサッカーなど他の球技種目も多く注目されていたのでランクインとなったようです。
個人的には「金」の方が今年の漢字っぽいかな...と思ってしまいましたが、お手軽に検索データに基づいたランキングを調べることができてスッキリしたので、ヨシとしましょう。
それにしても、非エンジニアでもこういったAIによるコード生成で作業効率化ができるようになったのは本当に革命だと思います...
進化が加速しているAI技術ですが、果たしてシンギュラリティはいつ訪れるのか...2025年も楽しみですね。