QEUR23_ CHRLTM9 : [GROUP_B] LLMを活用した政治の評価(数理言語政治学のあけぼの)
~ LLMモデルは政治のためにある ~
QEU:FOUNDER(設定年齢65歳) : “前回まで、ファクト・チェックに基づく再回答(FACT_BASED_ANSWER)行いました。そして、意外なことにLLMが反抗を起こして当初に想定した回答が出てこなくなりました。”
QEU:FOUNDER : “これ以上のディベート(↑)の続行は難しくなったようです。そこで、今回に限り(?)、少し違う方向性を模索します。この新しい方向性は、「数理言語政治学」といいます。D先生、GOURP_BのGOAL(信念)を紹介してください。”
D先生(設定年齢65歳) : “もう何度も言っていますが、大事だから、都度復習しなきゃね・・・。以下のとおりです。”
日本の長期の経済停滞の理由は、若者の怠慢である。おそらくバブル化以降の文化的な堕落の結果ではないだろうか。若者は、いかなる手段を以てしても就職して、家を買い、結婚をして子供を作るものである。仕事を選ばなければいくらでもある。もし給料が半分であったら、他人の2倍働けば良いのではないだろうか。規制緩和で競争が増えるのは良いことであり、ものが安くなり、結果としてイノベーションが生まれる。生産性を高めるには、人件費を安くさえすればよい。人件費が高いから生産性が低く、その結果として経済がわるいのだ。現状の自民党と大企業の癒着は、単に「よい協力関係」であるにすぎない。彼らが、世界の大企業と戦っているので、日本の競争力を保つことができる。逆に言うと、振興企業にはリスクが高く、あまり期待すべきものではない。社会のダイバーシティは現在のレベルで十分である。優秀な海外学生を招聘し、移民を推進すべきでない。自国の若者の機会を減らすだけである。
QEU:FOUNDER : “これからは、CohereのEmbeddingを使ったSemantic類似度メトリックスを活用したPythonプログラミングです。”
# -----
import re, math, time
# ----
import pandas as pd
import numpy as np
import json
# 選択してね(今回はCohere)
import cohere
#from langchain_groq import ChatGroq
#from langchain_cohere import ChatCohere
# -----
import seaborn as sns
from sklearn.metrics.pairwise import cosine_similarity
import matplotlib.pyplot as plt
# ----
# [Summary]Excelファイルからデータフレームを作成する(1)
df_sum = pd.read_excel('qq_for_JED_step1_summary_input.xlsx')
#df_sum
# ----
arr_concept = df_sum.loc[:,"CONCEPT"].values
arr_goal_A = df_sum.loc[:,"GOAL(A)"].values
arr_goal_B = df_sum.loc[:,"GOAL(B)"].values
arr_AUDIENCE = df_sum.loc[:,"personnel_AUDIENCE"].values
#print(arr_concept)
# ---
str_concept = arr_concept[0]
str_goal_A = arr_goal_A[0]
str_goal_B = arr_goal_B[0]
str_AUDIENCE = arr_AUDIENCE[0]
print(str_goal_B)
###############################
# STR -> LIST分割(1: GOAL)
###############################
# ---
def list_string(str_answer):
# 文字列を段落に分割する(for answer A)
paragraphs = re.split(r'\n\s*\n', str_answer.strip())
# ---
array_answer = []
for paragraph in paragraphs:
array_answer.append(paragraph.strip())
#print(paragraph.strip())
return array_answer
# ---
def list_lines(str_answer):
# 念のため改行を調整する
str_answer = str_answer.replace('\n\n', '\n')
# 文字列を行に分割
array_answer = str_answer.strip().split('\n')
return array_answer
# ---
# str_goal_A
list_goal_A = list_string(str_goal_A)
num_goal_A = len(list_goal_A)
print(list_goal_A)
# ---
# str_goal_B
list_goal_B = list_string(str_goal_B)
num_goal_B = len(list_goal_B)
print(list_goal_B)
###############################
# FACT_BASED_ANSWERデータ群の読み込み
###############################
# -----
# [FACT_BASED_ANSWER]Excelファイルからデータフレームを作成する(3)
# -----
df_qq = pd.read_excel('qq_JED_step1A(3).xlsx')
# Step1の質問数
num_df = len(df_qq)
#df_qq
# -----
# EXCELシートから、文字列を抽出する
# -----
# Question(Initial)
arr_QInitial = df_qq.loc[:,'QInitial'].values
#print(arr_QInitial)
# -----
# Answer(Initial)
arr_AInitial = df_qq.loc[:,'AInitial'].values
#print("--- Answer(Initial) ---")
#print(arr_AInitial[0])
# -----
# Fact Based Answer
arr_FBA = df_qq.loc[:,'FBA'].values
print("--- Fact Based Answer ---")
print(arr_FBA[0])
###############################
# STR -> LIST分割(2)
###############################
# -----
# 仮に置いたパラグラフの数
num_temp_para = 20
mx_FBApara = [["NA"]*num_temp_para for i in range(num_df)]
# -----
arr_num_para = []
for i in range(num_df):
# ---
# arr_FBAを段落に分割する
list_FBA = list_string(arr_FBA[i])
num_para = len(list_FBA)
# ---
if num_para < 5:
list_FBA = list_lines(arr_FBA[i])
num_para = len(list_FBA)
# ---
arr_num_para.append(num_para)
#print(list_FBA)
if num_para > num_temp_para:
num_para = num_temp_para
# ---
for j in range(num_para):
mx_FBApara[i][j] = list_FBA[j]
# ---
# 結果の表示
print("--- arr_num_para ---")
print(arr_num_para)
# ---
mx_FBApara = np.array(mx_FBApara)
print("--- mx_FBApara ---")
print(mx_FBApara[0:2, 0:2])
##################################
# FBAとGOALの類似度を比較する
##################################
# -----
#import cohere
#co = cohere.Client("COHERE_API_KEY") # Your Cohere API key
co = cohere.Client() # Your Cohere API key
# -----
# Creating Embedding(arrayは一次元ベクトル)
def create_embedding(str_answer):
# -----
#array_answer_A
num_answer = len(str_answer)
#print(num_answer)
response_answer = co.embed(
texts=[str_answer],
model='embed-english-v3.0',
input_type='search_document'
)
embeddings_answer = response_answer.embeddings
#print(embeddings_answer[0])
return num_answer, embeddings_answer
# -----
# Fact Based Question
max_num_goal = np.max([num_goal_A, num_goal_B])
mx_similarity_A = np.zeros([num_df, max_num_goal, num_temp_para])
mx_similarity_B = np.zeros([num_df, max_num_goal, num_temp_para])
#print(mx_similarity_A[0,:,0:10])
# -----
# Semantic類似度の計算
def eval_similarity(mx_similarity, mx_FBApara, list_goal, arr_num_para, num_goal, num_df):
# -----
# list_goal
for i in range(num_df): # num_df
# -----
arr_FBApara = mx_FBApara[i, :]
num_para = arr_num_para[i]
print(f"--- FBA ANSWER NUMBER: {i} ---")
# -----
for j in range(num_goal): # num_goal
# -----
# list_goal
#print(list_goal[j])
num_janswer, embeddings_A = create_embedding(list_goal[j])
# -----
# Cosine Similarity(A-B)
for k in range(num_para): # num_para
# -----
#print(arr_FBApara[k])
num_kanswer, embeddings_B = create_embedding(arr_FBApara[k])
val_similarity = cosine_similarity(embeddings_A, embeddings_B)[0][0]
mx_similarity[i,j,k] = val_similarity
if j%3 == 0 and k%3 == 0:
print(f"Cosine similarity between sentences A and B @{j}/{k}:", val_similarity)
# -----
return mx_similarity
# -----
# GOAL-Aの場合
print("--- list_goal_A ---")
mx_similarity_A = eval_similarity(mx_similarity_A, mx_FBApara, list_goal_A, arr_num_para, num_goal_A, num_df)
print(mx_similarity_A[0,:,0:10])
# -----
# GOAL-Bの場合
print("--- list_goal_B ---")
mx_similarity_B = eval_similarity(mx_similarity_B, mx_FBApara, list_goal_B, arr_num_para, num_goal_B, num_df)
# ------
# パーセンタイル達成度分析: Answer Step1とCONCEPTを比較する
# ------
# パーセンタイルマトリックスの生成
mx_percentile_A = np.zeros([num_df,5])
mx_percentile_B = np.zeros([num_df,5])
# ------
# パーセンタイルマトリックスの生成
def calc_pcts(mx_percentile, mx_similarity, num_goal, arr_num_para):
for i in range(num_df): # num_df
# ---
num_para = arr_num_para[i]
cut_similarity = mx_similarity[i,0:num_goal,0:num_para]
print(cut_similarity)
# 文単位に分割する
arr_similarity = cut_similarity.flatten()
print("--- arr_similarity ---")
print(arr_similarity)
# ---
if len(arr_similarity) > 10:
val_p100 = np.percentile(arr_similarity, 100)
val_p95 = np.percentile(arr_similarity, 95)
val_p90 = np.percentile(arr_similarity, 90)
val_p85 = np.percentile(arr_similarity, 85)
val_p80 = np.percentile(arr_similarity, 80)
else:
val_p100 = np.max(arr_similarity)
val_p95 = 0
val_p90 = 0
val_p85 = 0
val_p80 = 0
# ---
# パーセンタイルマトリックスの生成
mx_percentile[i,:] = [val_p100, val_p95, val_p90, val_p85, val_p80]
print(i, val_p100, val_p95, val_p90, val_p85, val_p80)
return mx_percentile
# -----
# GOAL-Aの場合
print("--- list_goal_A ---")
mx_percentile_A = calc_pcts(mx_percentile_A, mx_similarity_A, num_goal_A, arr_num_para)
# -----
# GOAL-Bの場合
print("--- list_goal_B ---")
mx_percentile_B = calc_pcts(mx_percentile_B, mx_similarity_B, num_goal_B, arr_num_para)
#print("--- mx_percentile_B ---")
#print(mx_percentile_B)
##############################
# HEAT MAP OUTPUT
###############################
# -----
def heatmap(mx_percentile, ax, str_label):
# print(labels)
sns.heatmap(mx_percentile, ax= ax, cmap="YlOrRd", annot=True)
ax.set_title(f"--- {str_label} ---")
# -----
# グラフ化する(ヒートマップ)
arr_title = ['goal_A', 'goal_B']
# ---
fig = plt.figure(figsize=(12,8))
ax1 = fig.add_subplot(121)
ax2 = fig.add_subplot(122)
# 描画
heatmap(mx_percentile_A, ax1, arr_title[0])
heatmap(mx_percentile_B, ax2, arr_title[1])
# ---
fig.suptitle("HEATMAP OF SIMILARITY")
fig.tight_layout()
plt.show()
D先生: “あれ?不可解な結果がでてきました。私は、このグラフ(↓)の解釈に苦しんでいます。類似度の値が高いということは、「2つの文章が意味することが似ている」ということですよね?”
QEU:FOUNDER : “もちろん・・・。つまり、この結果は「ネトウヨ(GOAL_B)が経済に関して、まともな答えを出そうととしても無理」ということを意味します。この原因としては、2つあります。1つは、このLLMは、ネトウヨ的な回答をするのに向いていないということ・・・。今回使ったLLMは、Ca国のモノだからね。”
D先生: “あともう一つの原因は・・・。そうだ!そもそも、ネトウヨ的な言論にはLLMに学習させる価値がそもそもない(笑)。”
QEU:FOUNDER : “個人的には、前者の仮説を希望したい。「自のつく党」が、自分のポリシーを120%表現できるLLMを作って欲しい。それを、世界に向けて発信するのだ!!そして、世界中の研究者、政治家が、このLLMの斬新さに感嘆するのだ!!J国の通貨が爆上げします。”
D先生: “他の政党もLLMを作れば、それぞれ比較できるので面白くなります。それにしても、不思議だとおもうんです。”
QEU:FOUNDER : “何が不思議ですか?”
D先生: “「あの党」は、ここまで長い間にわたって、どうやって政策を作ってきたのですか?我々の今回の実験では、「言葉から言葉への変換プロセスによる」政策の立案は不可能でしょ?”
QEU:FOUNDER : “全くもう、D先生・・・。「言葉から言葉への変換プロセス」って、アンタ、自分の質問の答えを半分言ったようなものじゃないですか?いままで、「あの党」がやってきたことは「カネから言葉への変換」ですよ。ただし、それはほとんどの場合であって、全部ではないですよ。”
D先生:“「カネから政策への実現プロセス」って、失敗しがちですよね。”
QEU:FOUNDER : “よく左側の人がいうじゃないですか・・・。「失われた30年」の原因は政治のせいだって・・・。小生は、当初は「そんなわけないだろ!」と思っていました。でもね、今回の理論実験によって、「はぁ・・・、そうかもしれん」と思うようになりました。”
D先生: “FOUNDER・・・。お願いです。GROUP_Aの信念は、何を設定したんですか?もったいぶらないで教えてください。”
The fundamental reason for Japan's long-term economic stagnation is the neglect of investment in education for young people, especially the neglect of liberal arts, and the neglect of protecting and nurturing domestic industries. The fact that there has been no innovation originating from Japan since the beginning of the 21st century is evidence of a decline in the level of education.
The problem is thought to be the excessive deregulation promoted by the LDP. These deregulations only worked to the advantage of foreign financial institutions and some vested interests, and did not help the overall growth of domestic industries. As a result, the Japanese government seems to have sacrificed other industries, especially the semiconductor industry and agriculture, in order to protect the automobile industry.
Due to the increase in hereditary politicians in the LDP, the driving force for changing society through political activities was lost. As a result, collusion and corruption with some large companies progressed. For large companies, being able to borrow money at low interest rates and low wages for labor are an easy way to protect themselves. As a result, low-wage labor became rampant in order to increase productivity, and domestic consumption cooled.
The impoverishment of young people led to a decline in the birth rate. The lack of diversity in society makes it difficult for innovation to occur. Low wages mean it is difficult to invite talented students from overseas, and there are few immigrants.
日本の長期経済停滞の根本的な原因は、若者への教育投資、特に文系教育への投資の怠慢と、国内産業の保護・育成の怠慢である。21世紀に入ってから日本発のイノベーションが生まれていないのは、教育水準の低下の証拠である。
問題は、自民党が推進した過度な規制緩和にあると考えられる。これらの規制緩和は、外国金融機関や一部の既得権益者に有利に働くだけで、国内産業全体の成長にはつながらなかった。その結果、日本政府は自動車産業を守るために、他の産業、特に半導体産業や農業を犠牲にしてきたように思える。
自民党の世襲政治家の増加により、政治活動を通じて社会を変える原動力が失われた。その結果、一部の大企業との癒着や腐敗が進んだ。大企業にとって、低金利でお金を借りられることや、労働賃金が低いことは、身を守るための安易な手段である。その結果、生産性を上げるために低賃金労働が横行し、国内消費が冷え込んだ。
若者の貧困化は出生率の低下を招いた。社会の多様性の欠如はイノベーションを生みにくい。賃金が低いため海外から優秀な学生を招きにくく、移民も少ない。
D先生: “なんだ、「当たり前のことを書いている・・・。」と思って、そんな自分に驚いてしまいました。”
QEU:FOUNDER : “今、ちょっと困っているんです。今回のGOAL_B(ネトウヨ)設定で、十分ディベートが可能だと思っていたんです。どうするかな・・・。GOAL_Bの設定を変更して、やり直そうか。それとも・・・。”
D先生: “前回の選挙でも、あれだけ立候補した人数がいたのですから、良いGOALが見つかるんじゃないんですか?”
QEU:FOUNDER : “うっへえ・・・。”
~ まとめ ~
QEU:FOUNDER : “今回の成果物は、ほんとうに「瓢箪から駒」なんです。我々が政治に関する解析技法を開発するとはおもわなかったわ。それにしてもLLMは偉大だわ。本当に・・・。”
C部長 : “ただし、他の研究者がすでにやっている可能性がありますよ。”
QEU:FOUNDER : “確かにそうだ・・・。まあ、「自がつく党」は、あと4年は持たなんじゃないだろうか。分裂ではなく、「フッと消えてしまう」みたいに・・・。”
C部長: “じゃあ、イケメン(←)の党は?”
QEU:FOUNDER : “あと2年ぐらいじゃないの?そもそも、あそこが「今後も維持できる」シナリオがわからないわ・・・。逆にね、「自のつく党」は、先を見据えた活動をしているスゴイ党だと思います。”
C部長: “裏金以外に、そんなにスゴイところがありましたっけ?”
QEU:FOUNDER : “あの党、たぶん4年以内に「ビックバン」を起こすと思います。その後で残るのは、「Nのつく党(↑)」みたいなワン・イシューの政党になると思います。そのイシューは、パターナリズムとミソジニーだけです。GOAL_Bを解析したところによると、まともな経済政策が出ないので、もう政権の担当は無理なんです。”
C部長 : “そうすると、この大先生(↓)の独壇場じゃないですか。”
QEU:FOUNDER : “だから言ったでしょ?あの党は先見の明があるって・・・。将来を見越して、隠し玉をもっているんです。”