Python初心者が【自然言語処理】でカイグリーンを分析してみた
目次
はじめに
データ処理
テキスト分析
結果と考察
まとめ
1. はじめに
"サピエンス"と申します。
我々ホモ・サピエンスの中で最高に機能的な身体を持つ
ある方を尊敬してやまないことからこの名前での活動を始めました。
その方は…
誰もが一度は見たことがあるであろう
ポニーテールのボディビルダー
「カイ・グリーン」氏 48歳(24/07/12時点)
(本名 Kai Leslie Greene)
2016年開催アーノルド・クラシックでの彼のフリーポーズを初めて見たときの衝撃は今でも忘れられません。
「こんな風に人間って動くのか!
おしりの筋肉の稼働率100%!🤯」
👇これYouTubeで絶対見たことあるはず!?
彼の臀筋は人類で最も発達していると言っても過言ではありません。
この特徴ある身体に加え、彼の受け答えも非常に特徴的であります。
ずばり、
”質問に対して絶対ストレートに答えない!”
「誰を尊敬していますか?」という問いに対し、
普通なら「○○さんです!」と言いそうなところ、
カイグリーン氏は、
え!?
"誰を尊敬していますか?シュワちゃん等に認知されているという事実は今どんな喜びとして受け止めていますか?" という低俗な質問をしてすみません、とこちらが反省せざるを得なくなる爆笑必死のインタビューは下の動画を参照ください。(該当箇所 7:40以降)
今回はそんなカイグリーンさんを、
Python初心者のわたくしサピエンスが自然言語処理を使って
発言のパターンや感情の傾向を把握し、
カイグリーンの人物像をより浮き彫りにしていきます。
2. データの前処理
①読み込ませる元データの作成
「240715 KAI Replies.csv」(2024年7月15日時点最新ファイル)
趣味でカイグリーンさんの動画を見ながら、その独特な回答方法をテキストデータとしてエクセルに溜め込んでいた意味が身を結ぶ瞬間がやってきました。
60個の主要な動画からの発言データが収められています。
シート左から
「video title」「interviewer」「question」「responder」「replies」
というタイトルを設定。
②データの前処理
1. 元データの加工
発言データのクレンジングを行い、ノイズを除去しました。
・ピリオド・?・!がなければ、「.」を文末につける。
・文を一つずつのセルに分割し、各行に同じメタデータ(動画タイトル、質問者・質問内容など)を付与。
・csvファイル「'240715 KAI Replies SPLIT'」として書き出し
import pandas as pd
from textblob import TextBlob
from google.colab import files
import re
uploaded = files.upload()
# アップロードされたファイルの名前を取得
file_name = list(uploaded.keys())[0]
# CSVファイルの読み込み
df = pd.read_csv('240715 KAI Replies.csv', encoding='shift_jis')
# 回答内容をピリオドで分割し、各行に同じメタデータを付与する関数を定義
def split_answers(df):
# 新しいデータフレームを作成
new_rows = []
# 元のデータフレームの各行を順に処理
for index, row in df.iterrows():
# 回答内容が空の場合はスキップします
if pd.isna(row['replies']):
continue
# 回答内容をピリオド、改行、スペース、?、!で分割
split_answer = re.split(r'(?<!\w\.\w.)(?<![A-Z][a-z]\.)(?<=\.|\?|\!|\n)\s', row['replies'])
# 分割された各部分について新しい行を作成
for part in split_answer:
if part.strip(): # 対象部分が空欄でない場合に処理を行う
new_row = row.copy()
# ピリオド、?、!で終わっていない場合は、末尾にピリオドを追加
if not part.strip().endswith(('.', '?', '!')):
part += '.'
new_row['replies'] = part.strip()
new_rows.append(new_row)
return pd.DataFrame(new_rows)
# 関数を適用し新しいデータフレームを作成
new_df = split_answers(df)
# 新しいデータフレームをCSVファイルとして保存
output_file_name = '240715 KAI Replies SPLIT.csv'
new_df.to_csv(output_file_name, index=False)
# 作成したCSVファイルをダウンロード
files.download(output_file_name)
ではここからは主に「replies(回答内容)」の箇所へ自然言語処理を行い、
カイグリーンさんを解剖していきます。
テキスト分析
①頻出単語の分析
カイグリーンさんが我々に何を伝えようとしているのか、
回答の中で一番多く出現した単語は何なのか?
題して
Top 20 Most Common Words (トップ20の頻出単語)
import pandas as pd
import re
import nltk
from nltk.corpus import stopwords
from collections import Counter
import matplotlib.pyplot as plt
# 必要なNLTKデータをダウンロード
nltk.download('punkt')
nltk.download('stopwords')
uploaded = files.upload()
# アップロードされたファイルの名前を取得
file_name = list(uploaded.keys())[0]
# データの読み込み
file_path = '/content/240715 KAI Replies SPLIT.csv' # ファイルパスを指定
data = pd.read_csv(file_path)
# 列名の確認
data.columns
# 必要な列の選択
data = data[['replies']]
# テキスト前処理関数
def preprocess(text):
text = re.sub(r'\d+', '', text) # 数字の除去
text = re.sub(r'[^\w\s]', '', text) # 句読点の除去
text = text.lower() # 小文字化
tokens = nltk.word_tokenize(text) # トークン化
tokens = [word for word in tokens if word not in stopwords.words('english')] # ストップワードの除去
return tokens
# 前処理の適用
data['cleaned_text'] = data['replies'].apply(preprocess)
# すべてのトークンを結合
all_tokens = [token for sublist in data['cleaned_text'] for token in sublist]
# 頻出単語のリストを作成
word_freq = Counter(all_tokens)
# 上位20個の頻出単語を抽出
most_common_words = word_freq.most_common(20)
# 単語とその頻度を表示
print(most_common_words)
# 単語頻度分布の可視化
words, counts = zip(*most_common_words)
plt.figure(figsize=(12, 8))
plt.bar(words, counts)
plt.title('Top 20 Most Common Words')
plt.xlabel('Words')
plt.ylabel('Frequency')
plt.xticks(rotation=45)
plt.show()
[('know', 945), ('im', 312), ('think', 262), ('really', 262), ('things', 167), ('like', 166), ('um', 161), ('lot', 150), ('dont', 150), ('get', 148), ('able', 139), ('na', 138), ('want', 137), ('well', 136), ('back', 132), ('see', 132), ('time', 130), ('say', 123), ('thats', 122), ('would', 113)]
わっかりずらい笑!
■「know」が出てきたのは確実に、カイグリーンさんの口癖
「you know…」からきていますね。
これ、元エクセルに貼るときも大変でした。
これを連発するので、ある程度消していたんですけどね、実は。
■「really」これも頻発しますね。
「really, really, really」など感情が高ぶると使う傾向が高い印象です。
その他は日常会話の中でも普通に使われる動詞や副詞、助動詞が多く出てきてしまっているので、ある程度言葉を削除してみます。
# 拡張ストップワードリスト
additional_stopwords = {
'know', 'im', 'really', 'think', 'um', 'like', 'get', 'lot', 'dont', 'able',
'want', 'well', 'back', 'see', 'say', 'time', 'thats', 'na', 'would', 'you', 'your',
'just', 'can', 'also', 'one', 'ive', 'going', 'us', 'even', 'much', 'many', 'right',
'way', 'go', 'make', 'two', 'years', 'year', 'every',
'always', 'something', 'nothing', 'never', 'ever', 'still', 'good', 'bad', 'day',
'days', 'now', 'first', 'see', 'look', 'got', 'may', 'might', 'used', 'and', 'or',
'but', 'if', 'because', 'as', 'until', 'while', 'of', 'at', 'by', 'for', 'with',
'about', 'against', 'between', 'into', 'through', 'during', 'before', 'after', 'above',
'below', 'to', 'from', 'up', 'down', 'in', 'out', 'on', 'off', 'over', 'under',
'again', 'further', 'then', 'once', 'here', 'there', 'when', 'where', 'why', 'how',
'all', 'any', 'both', 'each', 'few', 'more', 'most', 'other', 'some', 'such', 'no',
'nor', 'not', 'only', 'own', 'same', 'so', 'than', 'too', 'very', 's', 't', 'can',
'will', 'just', 'don', 'should', 'now', 'youre', 'theres', 'man', 'come',
'gon', 'take', 'mean', 'trying', 'need', 'mind', 'oh', 'wan', 'little', 'said', 'yeah', 'thing', 'things'
}
stop_words = set(stopwords.words('english')).union(additional_stopwords)
するとどうでしょう!
[('work', 99) ('people', 99), ('believe', 86), ('life', 70), ('working', 64), ('goal', 64), ('important', 62), ('training', 61), ('focus', 60), ('thinking', 58), ('bodybuilder', 57), ('mind', 54), ('stage', 52), ('better', 52), ('become', 51), ('done', 50), ('champion', 49), ('new', 47), ('muscle', 47), ('opportunity', 47)]
1位「WORK(ワークアウト)」
2位「PEOPLE(人々)」
3位「BELIEVE(信じる)」
「WORK」
英語で筋トレをすることを「workout (ワークアウト)」と言います。
カイグリーンさんは「work」を"筋トレをする"という意味以外で、
(人生での)”タスクをこなす”という意味でも使用することがあります。
まさに A.K.A. "Mr. Getting It Done"(別名 "やり遂げる男")
と言われる理由もここに見られます。
彼にとって、ボディビルは人生における"仕事"なのです。
「PEOPLE」
これはカイグリーンさんがアドバイス的発言をする際に、
「"人"(people)は○○と言う/考える/をする/を行うかもしれないが、、、」と表現することが多いことが起因しているでしょう。
”人と自分は違い、自分にとって何が大事なのか、それを突き詰めることで
真のゴールにたどり着ける”というブレないスタンスが彼からは見えます。
第三者視点で物事を客観的に捉え、物語を語るように受け答えをすることが多いのも、”質問に答えていない”と受け取られることが多い理由かもしれません。(本当は答えているんですけどね。質問の中核を突きすぎており、質問者が理解できていない、または望んでいた浅い答えが得られなかったことに不満を抱いているだけかもしれません。)
「BELIEVE」
"信じること。信じることなくしては何もなし得ない。"
2009年、カイグリーンにとって初のミスターオリンピア出場に向けて、
ラスベガスの安モーテルとジムを行き来するだけの7週間にも及ぶ狂気の直前合宿の終わりに撮られた映像の中で、この言葉を残しています。
それからはこの言葉は彼の代名詞ともなっており、我々自身の中に眠る
"信じる力"のパワーを彼は伝え続けています。
単独セミナー"BELIEVE"では、幼少の頃の実親からの虐待や、ボディビルを知るきっかけとなった少年院時代など、カイグリーンさんが”信じる力”を養った様々なエピソードを垣間見ることができます。👇
②感情分析
続いてはカイグリーンさんの発言における感情を分析していきます。
• ポジティブ、ネガティブ、ニュートラルな発言の割合
• 感情の変化とその解釈
を行います。
使用するライブラリは下記になります。
nltk:自然言語処理の基本的なライブラリ
textblob:感情分析を行うためのライブラリ
import pandas as pd
import nltk
from textblob import TextBlob
import matplotlib.pyplot as plt
# 必要なNLTKデータをダウンロード
nltk.download('punkt')
# データの読み込み
file_path = '/content/drive/My Drive/240715 KAI Replies SPLIT.csv' # ファイルパスを指定
data = pd.read_csv(file_path)
# 必要な列の選択
data = data[['replies']]
# 欠損値を除去または空文字列で置換
data['replies'] = data['replies'].fillna('')
# データの表示
print(data.head())
# 感情分析関数
def analyze_sentiment(text):
blob = TextBlob(text)
sentiment = blob.sentiment.polarity
if sentiment > 0:
return 'positive'
elif sentiment < 0:
return 'negative'
else:
return 'neutral'
# 回答の感情分析
data['emotion'] = data['replies'].apply(analyze_sentiment)
# ポジティブ、ネガティブ、ニュートラルな発言の割合を計算
answer_sentiment_counts = data['emotion'].value_counts(normalize=True) * 100
print("Sentiment distribution in responses:\n", answer_sentiment_counts)
# 回答の感情分布を可視化
plt.figure(figsize=(10, 6))
answer_sentiment_counts.plot(kind='bar', color=['green', 'red', 'gray'])
plt.title('Emotional Distributuion')
plt.xlabel('Emotion')
plt.ylabel('Percentage')
plt.tight_layout()
plt.show()
positive 51.799346
neutral 36.150491
negative 12.050164
感情分析の結果、
ポジティブな感情を含む発言が全体の50%以上を占めることが判明しました。
ネガティブな感情を含む発言は12%、
ニュートラルな発言は36%。
ポジティブな感情が多いことから、彼の発言は多くの人に希望や前向きな気持ちを与えているでしょう。
面白いのはニュートラルも30%以上を占めていることです。
彼は「オリンピアへの復帰」に関する質問など、答えたくないことを聞かれた際に回答内容がニュートラルになる傾向があります。
そう、
”質問に対して絶対ストレートに答えない!” 癖が逆に
発言をニュートラルしているのです。
「オリンピアへの復帰」に関してですが、
ところで皆さん、スキンヘッドで丸々と発達した筋肉をもつ
ミスターオリンピア7冠のフィリップ・ヒースさん(別名 The Gift)
をご存知でしょうか?
カイグリーンさんとフィリップさんは2006年のColorado Proからのライバル関係にあり、フィリップさんはボディビル界隈にぽっと出てきて早々、
人々の注目を浴び優勝をかっさらいました。その時カイさんは14位。
カイ・グリーン↑ フィリップ・ヒース↓
フィリップさんのミスターオリンピア初出場は2011年。
この年はオリンピア四冠の先輩ジェイ・カトラーさんとの師弟関係ドラマ、世代交代ドラマのショーでした。
そんな中、カイさんは3位。
(2011年のフリーポーズはYoutubeでもかなりレアな存在ですので是非↓)
ジェイさんがいなくなったその後も
2012年、2013年、2014年とフィルさん1位、カイさん2位が続き、
「ミスターオリンピアって、フィルさんが王者というエンターテイメント兼ドラマでは?」 と気づいたカイさんは2015年からぱったりオリンピアには出なくなりました。
不参加の理由は2024年現在も謎のまま。
↑カイグリーンの主張もわかるし、デイブさんの主張も分かる。↓
そんな因縁深きライバルや、オリンピアへの復帰に関して問われた時、
カイさんが必ずいうのは、
I don't want to say(speak) anything negatively about 〇〇
(〇〇について悪く言うようなことはしたくない)
直接的な回答内容になることを回避する天才です。
まぁ、ネガティブになっていいことは無いですよね。
自身にとって大事なことは何かを見極めて、ポジティブな思考で全力で突き進むだけですね!
そんなポジティブマインド全開のカイさんの回答の中にはどんなフレーズが
多いのか。
次の分析で見ていきましょう!
③N-gram分析
N-gram分析からは、カイグリーンさんが頻繁に使用するフレーズや言い回しを明らかにしていきます。
import pandas as pd
import re
import nltk
from nltk.corpus import stopwords
from gensim import corpora
from gensim.models.ldamodel import LdaModel
from collections import Counter
from nltk.util import ngrams
# 必要なNLTKデータをダウンロード
nltk.download('punkt')
nltk.download('stopwords')
# データの読み込み
file_path = '/content/drive/My Drive/240715 KAI Replies SPLIT.csv' # ファイルパスを指定
data = pd.read_csv(file_path)
# 「回答内容」列を選択
data = data[['replies']]
# 欠損値を除去または空文字列で置換
data['replies'] = data['replies'].fillna('')
# テキスト前処理関数
def preprocess(text):
text = re.sub(r'\d+', '', text) # 数字の除去
text = re.sub(r'[^\w\s]', '', text) # 句読点の除去
text = text.lower() # 小文字化
tokens = nltk.word_tokenize(text) # トークン化
tokens = [word for word in tokens if word not in stopwords.words('english')] # ストップワードの除去
return tokens
# 前処理の適用
data['cleaned_text'] = data['replies'].apply(preprocess)
# トークンの結合
all_tokens = [token for sublist in data['cleaned_text'] for token in sublist]
# 3-gramの抽出
trigrams = ngrams(all_tokens, 3)
trigram_freq = Counter(trigrams)
# 上位10個の3-gramを表示
most_common_trigrams = trigram_freq.most_common(10)
print("Top 10 Trigrams:\n", most_common_trigrams)
# 4-gramの抽出
fourgrams = ngrams(all_tokens, 4)
fourgram_freq = Counter(fourgrams)
# 上位10個の4-gramを表示
most_common_fourgrams = fourgram_freq.most_common(10)
print("Top 10 Fourgrams:\n", most_common_fourgrams)
3-gramの結果
Top 10 Trigrams:
[(('im', 'gon', 'na'), 31), (('got', 'ta', 'give'), 8), (('really', 'really', 'really'), 7), (('desired', 'end', 'result'), 7), (('gon', 'na', 'get'), 7), (('got', 'chance', 'see'), 6), (('lot', 'times', 'people'), 6), (('really', 'wan', 'na'), 6), (('wan', 'na', 'make'), 6), (('well', 'know', 'think'), 5)]
3-gramの結果
1. im gon na
2. got ta give
3. really really really
4. desired end result
5. gon na get
6. got chance see
7. lot times people
8. really wan na
9. wan na make
10. well know think
1. im gon na や 2. gotta give、5. gonna get、 6.got chance see、
8. really wanna、 9.wanna make、10. well know thinkは、
喋り始めの言葉であり、「意志を感じるフレーズ」と捉えられます。
未来に向けて計画を立てたり、行動を起こすことを示す言葉で、
カイさんは常に前向きで目標志向であり、自分の目標や計画について話すことが多いことが伺えます。
①頻出単語の分析でも扱った、「really really really」は確かに結果として出てきましたね!
でも、「really」と言う表現を多用するのはあまり良くない、などのテーマは英語の勉強をしていると出くわします。
desired end result という言葉が多用されているのも、カイグリーンならではですね。
ただの結果ではなく、自分が望んだ結果であることが大事であるというメッセージが読み取れます。
では、4つにしてみたらどうなるか?
4-gramの結果
Top 10 Fourgrams:
[(('got', 'ta', 'give', 'shout'), 5), (('two', 'three', 'four', 'five'), 4), (('three', 'four', 'five', 'six'), 4), (('definitely', 'pro', 'one', 'day'), 4), (('pro', 'one', 'day', 'gets'), 4), (('one', 'day', 'gets', 'together'), 4), (('identify', 'bodybuilder', 'means', 'recognize'), 4), (('wan', 'na', 'make', 'sure'), 4), (('give', 'shout', 'george', 'farah'), 3), (('represent', 'idea', 'limitless', 'possibilities'), 3)]
4-gramの結果
1. got ta give shout
2. two three four five
3. three four five six
4. definitely pro one day
5. pro one day gets
6. one day gets together
7. identify bodybuilder means recognize
8. wan na make sure
9. give shout george farah
10. represent idea limitless possibilities
1. got ta give shout (out to)は 他者に感謝の意を表すフレーズです。
9. give shout george farahの「George」とは2011年のNewYork Proからカイさんにつく専属の男性のトレーニングコーチです。
ヒーローインタビューではサポートしてくれた人々に対する感謝のコメントを欠かさず行うカイさん。彼の謙虚さと感謝の心が示されています。
↑2位になっても気丈な振る舞いのカイさん
多くの方のGuruとなったGeorgeさん↓
「7. identify bodybuilder means recognize」と
「10. represent idea limitless possibilities」はカイさんが最も伝えたいメッセージの冒頭部分です。
「ボディビルダーとは「成長」を意味し、「無限の可能性」を持つ我々は
その事実を認識し、その可能性を賢く使い「desired end result」を目指し進むべし。」
identify bodybuilder means recognize や represent idea limitless possibilities は、彼の哲学や価値観を反映しています。彼はボディビルディングを通じて無限の可能性を探求していると言って良いでしょう。
N-gram分析を実施した結果、彼のコミュニケーションスタイルや考え方が明確に浮かび上がりました。
・発言が常に前向きな姿勢で、自己信頼、そしてポジティブな思考の重要性が反映されていることがわかります。
・また、彼の発言は、単なるモチベーションの源泉だけでなく、彼自身の哲学やトレーニング方法に深く根ざしたものです。
4. 結果と考察
頻出単語の分析結果
頻出単語の分析から、カイグリーンさんが頻繁に使う言葉が浮き彫りになりました。「work」「people」「believe」などの単語が多く出現し、彼の前向きな思考や自己信頼の重要性が強調されています。
特に「work」はボディビルだけでなく、人生全般における努力やタスクの遂行を示しており、彼の生き方そのものを表していると言えます。
感情分析結果
カイグリーンさんの発言の感情分析では、ポジティブな感情が全体の51.8%を占め、彼の発言が多くの人に希望や前向きな気持ちを与えていることがわかりました。
ネガティブな発言はわずか12%に過ぎず、彼の発言が全般的にポジティブなものであることが確認されました。
ニュートラルな発言も36.1%と高く、彼が質問に対して直接的に答えることを避けるスタイルが影響していると考えられます。
N-gram分析結果
N-gram分析では、カイグリーンさんの特徴的なフレーズが明らかになりました。
例えば、「im gon na」や「really really really」、「desired end result」などのフレーズが頻出し、彼の発言が未来志向であり、目標に向かって努力する姿勢が強調されています。
また、「give shout george farah」や「represent idea limitless possibilities」といったフレーズは、彼の感謝の心や無限の可能性を追求する哲学を反映しています。
5. まとめ
今回の分析を通じて、カイグリーンさんの発言から彼の哲学や価値観、コミュニケーションスタイルが浮き彫りになりました。
彼の発言は常に前向きであり、自己信頼と努力の重要性を強調しています。彼のポジティブな姿勢と感謝の心は、多くの人々に希望とインスピレーションを与え続けています。
カイグリーンさんの言葉から学ぶことは、ボディビルだけでなく、私たちの人生全般においても大いに役立つと思います。
彼の哲学を取り入れ、日々の努力を怠らず、自己信頼を持って前に進むことで、私たちもそれぞれの「desired end result」を達成することができるはずです。
カイグリーンさんの言葉を通じて、
自分自身の無限の可能性を再認識し、その可能性を最大限に引き出す努力を惜しまないことの重要性を学びました。
これからも彼の言葉を胸に、
我々自身の成長と目標達成に向けて努力を続けていきましょう。
THOUGHTS BECOME THINGS!! さぁ、思考を現実化させるんです!!
Until next time, let's keep it positive and keep encouraging each other.
サピエンス signing out。ピース✌️
さらにカイグリーンを知りたい方 (for enthusiasts out there)
カイグリーンさんの歴代パフォーマンスや、AIを駆使した
「カイグリーン日本語化計画」など、
カイグリーンに少しでも興味のある方は
下記YouTubeチャンネルをチェックしてみてください!
📷インスタグラム Ssapiens_Connectでは
カイさん本人にフォローしていただいております!
カイグリーンを芸術として鑑賞できる目をお持ちの方は是非チェック!
https://www.instagram.com/sapiens_connect/
この記事が気に入ったらサポートをしてみませんか?