背景
本投稿は、以下2点の投稿からの続編です。
① AIが三国志を読んだら~(自然言語処理編)
② 【続】AIが三国志を読んだら~(Word2Vec編)
前回までのお話を読んでいない方は ① ② を先にご覧くだされ!
①で、三国志の小説に対して「武将名」に気をつけて自然言語の前処理を行った。
②で、Word2Vec(機械学習)により武将を「ベクトル」として扱い、
似ている度計算や、武将同士の足し算引き算等の「演算」をすることが出来た。
完結編では、「ベクトル」に何らかの数式を適用することで、
「武力」「知力」「政治」「魅力」を求められるか?というテーマ。
司馬懿「「孔明の罠」と言う人、というポジションを得て苦節何十年。。。」
司馬懿「いよいよワシの偉業が真に評価される時が来たぞ!フフフ」
司馬懿「(結果を見て)え!?」
司馬懿「ワシ、知力75だったの!?」
諸葛亮「ふっ!私は知力98(一位)だったぞ」
司馬懿「待て あわてるな これは孔明の罠だ・・・」
諸葛亮「だまらっしゃい!」
諸葛亮「小説中の描写や表現によるものなのでこれが妥当なのです!!」
司馬懿「げえっ!(悶絶)」
劉禅 「わーい、朕は知力82だった、わーい!」
諸葛亮「AIが壊れているかもしれませんね」
劉禅 「・・・。」
AIが見た三国志人物相関図
前回のWord2Vec偏の結論は以下2点。
- 武将をベクトル化して演算(似ている&足し算引き算)に成功した
- しかし、どのベクトル成分を見ても武力や知力になりそうな値は無かった
機械学習の結果は「使えるけど、人間には理解出来ない」ということ。
そこでまず、興味も含めて、
50次元ベクトルを**「可視化」**するところから始めよう!
周瑜「見える・・・私にも敵が見えるゾ!」
周瑜「見せてもらおうか、AIの性能とやらを!」
魯粛「それ、三国志じゃなく宇宙世紀です。」
シュウユ・ビナン「修正してやるー!」
魯粛「名前を勝手に宇宙世紀っぽく修正しないでください。」
シセル・コウメイ「・・・。」
魯粛「おまえもマネするなー!!」
ニュータイプではない人々には、50次元ベクトルを知覚することは難しい。
そこで、t-SNEを使って、高次元データを次元削減して2次元に落とす。
コードの前に結果を貼ると以下。
全武将たちのポジションを2次元化して見ることが出来るのだ!
50次元ベクトルの中身がどうなっているんだろう?について、
前回までは「全く分からない」であったが、
このように特徴を2次元に落としてみると、なんとなく
**「陣営&時代ごと」**の結びつきが強いということが見えてくる。
2次元には2次元の良さがありますね
全体的に中央が蜀(劉備3兄弟など)で、
左上が貂蝉や董卓など、右側に呉、右下が魏、
左下は後期の時代の人、曹操はちょっとズレて君主ポジション?
などの特徴が見て取れる。
なおこれは、登場回数TOP100位までの人のマッピング。
この図を作成したコードも貼り付けておく。
import matplotlib.pyplot as plt
from sklearn.manifold import TSNE
import numpy as np
#前回作った武将ベクトルから、名前の部分だけ取ったリストを作成する。
vocab_busyou_list = []
for Busyou_data in Busyou_data_list:
vocab_busyou_list.append(Busyou_data[0])
#word2vecの結果をt-SNEで次元圧縮
vocab = model.wv.vocab
#登場上位300人の可視化表示
new_vocab = [{name:vocab[name]} for name in vocab_busyou_list[0:100]]
emb_tuple = tuple([word2vec_model[v] for v in new_vocab])
X = np.vstack(emb_tuple)
TSNE_model = TSNE(n_components=2, random_state=0)
np.set_printoptions(suppress=True)
TSNE_model.fit_transform(X)
import matplotlib.pyplot as plt
import japanize_matplotlib
#重要:日本語文字化け防止
#事前に、!pip install japanize-matplotlib を実行しておくこと
#matplotlibでt-SNEの図を描く
plt.figure(figsize=(10,10)) #図のサイズ
plt.scatter(TSNE_model.embedding_[skip:limit, 0], TSNE_model.embedding_[skip:limit, 1])
count = 0
for label, x, y in zip(vocab_busyou_list[0:100], TSNE_model.embedding_[:, 0], TSNE_model.embedding_[:, 1]):
count +=1
if(count<skip):continue
plt.annotate(label, xy=(x, y), xytext=(0, 0), textcoords='offset points')
if(count==limit):break
plt.show()
天下二十分の計(失敗)
厳白虎「ふふふ、おとうと・・・じゃなくて軍師よ。」
厳白虎「この東呉の徳王が天下を得るにはどうすれば良い?」
厳輿 「コウメイという男は天下三分の計を唱えたそうでござる。」
厳輿 「ならば我々はその五倍、天下二十分の計で圧勝です。」
厳白虎「うむ!さっそく全武将を20グループに分けるのだ!」
シセル・コウメイ「五倍だと15だぞ。」
魯粛「ツッコミどころはそこじゃねーーー!!!」
魯粛「ってかいつまで "シセル・コウメイ" でいくつもり!?」
さて、最強の武を求めるためには、
今回作った50次元ベクトル空間の中で、
どの方向が「武力方向」なのかを見極める必要がある。
(知力についても同様)
前回のWord2Vec編の最後では、
あるベクトル成分が既に「武力」を示す値になっていないかな、
ということを確認したのだが、ダメであった。
そこで第二弾の案は「勇将猛将」のグループを作れば、
**そのグループ全体が示す方向が武力なのではないか?**という案。
例えば、
魏延、関羽、夏侯惇、太史慈・・・などの武将の集まりと、
孫乾、荀攸、張昭、張松・・・などの武将の集まりを見ると、
前者の方が「武力」が高いと言える。
武官グループ、文官グループ、などに武将を分類出来れば、
「武力」方向が出るのではないか?というアイデア。
そこで、まず武将を「分類」すると、
どのようにグループ分けがされるのか、
機械学習を用いて分類を行う、
「k-meansによるクラスタリング」を試してみた
武将を20個のグループに分割してみよう。
これが厳白虎による「天下二十分の計」である。
from collections import defaultdict
from gensim.models.keyedvectors import KeyedVectors
from sklearn.cluster import KMeans
#前回作った武将ベクトルから、名前の部分だけ取ったリストを作成する。
vocab_busyou_list = []
for Busyou_data in Busyou_data_list:
vocab_busyou_list.append(Busyou_data[0])
#出現頻度の高い、上位300人をクラスタリング対象とする。
vocab = vocab_busyou_list[0:300]
#クラスタリング対象を「武将名」として出現した単語のみに絞る
vectors = [model.wv[word] for word in vocab]
#クラスタの数(適宜変更して設定)
n_clusters = 20
kmeans_model = KMeans(n_clusters=n_clusters, verbose=1, random_state=42, n_jobs=-1)
kmeans_model.fit(vectors)
cluster_labels = kmeans_model.labels_
cluster_to_words = defaultdict(list)
for cluster_id, word in zip(cluster_labels, vocab):
cluster_to_words[cluster_id].append(word)
for words in cluster_to_words.values():
print(words)
['曹操', '袁紹', '劉表', '荀彧', '賈詡', '張魯', '禰衡', '袁譚', '袁尚', '曹叡', '田豊', '王朗', '審配', '劉曄', '荀攸', '沮授', '華歆', '黄権', '孔融', '楊松', '張譲', '韓嵩', '何后', '張衛']
['劉備', '諸葛亮', '関羽', '張飛', '趙雲', '馬超', '徐庶', '劉璋', '孟達', '関平', '孫乾', '張松', '糜竺', '法正', '糜芳', '劉琦', '劉岱', '張任', '王忠', '周倉', '陶謙', '簡雍', '馬良', '于吉', '傅士仁', '伊籍', '趙範', '崔諒', '車冑', '姜叙', '劉恢', '甘夫人', '糜夫人', '鄭文', '劉焉', '裴元紹', '郝萌', '劉辟', '韓玄', '皇甫嵩', '鄭玄', '李恢', '周善', '呂公', '龔都', '苟安', '申耽']
['呂布', '董卓', '袁術', '貂蝉', '陳宮', '董承', '王允', '李儒', '何進', '李傕', '韓遂', '李粛', '典韋', '張角', '盧植', '楊彪', '郭汜', '韓暹', '蔡和', '王子服', '丁原', '袁煕', '曹豹', '韓胤', '黄奎', '曹嵩', '厳氏', '閔貢', '蹇碩']
['周瑜', '孫権', '孫策', '魯粛', '陸遜', '龐統', '呂蒙', '甘寧', '太史慈', '蔡瑁', '黄蓋', '張昭', '黄祖', '徐盛', '程普', '周泰', '凌統', '諸葛瑾', '蒋幹', '司馬徽', '郭嘉', '闞沢', '劉繇', '呂範', '張允', '呉夫人', '劉琮', '逢紀', '周魴', '蘇飛', '徐氏', '楊懐', '蒯良', '王甫', '孫韶', '張紘', '呂凱', '蒯越', '崔州平']
['司馬懿', '張郃', '張遼', '徐晃', '曹仁', '夏侯惇', '曹洪', '曹真', '夏侯淵', '公孫瓚', '于禁', '李典', '顔良', '張繍', '郭淮', '楽進', '華雄', '丁奉', '許攸', '李厳', '郭図', '高順', '馬遵', '郝昭', '孫礼', '牛金', '蒋欽', '宋憲', '高覧', '邢道栄', '夏侯覇', '孫桓', '司馬師', '鍾繇', '兀突骨', '种輯', '呂曠', '呂翔', '朱桓', '曹純', '秦朗', '鄒靖', '申儀', '司馬昭', '韋康', '裴緒']
['魏延', '黄忠', '姜維', '馬岱', '関興', '王平', '劉封', '張苞', '馬謖', '廖化', '楊儀', '厳顔', '馬忠', '夏侯楙', '鄧芝', '張翼', '張嶷', '夏侯尚', '呉懿', '王双', '陳式', '冷苞', '劉延', '呉班', '高翔', '鄧賢', '高沛', '費耀', '馮習']
['孫堅', '許褚', '文醜', '楊奉', '曹休', '紀霊', '潘璋', '文聘', '張宝', '王必', '張虎', '李楽', '張英', '朱然', '張南', '魏続', '何儀', '胡軫', '忙牙長', '戴陵']
['孟獲', '左慈', '高定', '孟優', '馬元義', '雍闓', '陳応', '楊鋒', '韋晃', '阿会喃', '徐栄', '成何', '朶思大王', '祝融', '楊陵']
['曹丕', '曹彰', '曹植', '蔡琰']
['龐徳', '楊阜', '張済', '楽綝', '樊稠', '韓浩', '関索', '呉蘭']
['陳登', '陳珪', '田氏', '韓馥', '耿紀']
['劉禅', '程昱', '楊修', '管輅', '満寵', '虞翻', '蔡夫人', '陳震', '蒋琬', '王威', '顧雍', '何太后', '呉碩', '呉子蘭', '董昭', '譙周']
['馬騰', '劉安', '伏完']
['吉平', '穆順', '孫翊', '崔毅']
['韓当', '陳武', '董襲']
['侯成', '淳于瓊', '厳白虎']
['蔡陽']
['呂伯奢']
['秦琪', '高幹']
['趙昂']
各行ごとに、同じタイプのスタンド使い
同じグループに属する武将が示されている。
上記の「20個」という設定値は、
いくつか値を変えて試した中で、
比較的良い分類になったように見える値なのだが、
どのグループを見ても「武官」グループとか
「軍師」グループとかは生成されず、やはり
「陣営」や「年代」的な要素による振り分けが多い印象。
三国志をAIに読ませた場合は、
将軍/軍師などの役割の識別よりも、
陣営/年代の方を大きな違いと見ている
ということが改めて分かった。
(※可視化の時点でも分かっていた)
「武官」「文官」の集合体を得られなかったため、
この厳白虎&厳輿なみの浅知恵は失敗に終わった。
また、これが出来ないということは、
もし人手で「武官」「文官」のグループに分けたとしても、
例えば文官側に魏が多いなどの理由で、
陣営を示すようなベクトルにしかならないということ。
■失敗から学んだ結論:
** Word2Vecのモデルで最も表面化されている要素は、**
** 武力・知力ではなく、各武将ごとの陣営・相性であった。**
** このモデルだけでは、いくらイジっても「武力」は出にくい。**
** 武力・知力の数値化ではなく、相性をAIに決めさせる、**
** ならば、より納得感のあるものが得やすいかもしれない。**
** (※KOEI三国志では相性は隠しパラメータ)**
これで完結。
星落秋風五丈原。
IFシナリオ(もしKOEI三國志データを使えたら?)
と、終わってしまっては面白くない。
100%小説のみをINPUTとして武力・知力を求めることは諦め、
「小説」⇒「数値化(ベクトル)」⇒「式を適用」⇒「武力・知力」
上記の間をつなげられるような**「式」**が存在するのか、
答え側から逆算することを試してみる。
答え知ってちゃズルいじゃん?と思うかもしれないが、
例えば、
KOEIに登録されていない武将の評価にはもちろん使えるし、
他にも、
「五丈原まで書かれた小説」+「答え(KOEIのデータ)」
をインプットにして「式」を見つけておけば、
「五丈原以降の小説を追加」によって、
後期の登場人物の評価が出来るかもしれない、と
「式」の見つけ方を考えるのはかなり有用である。
そもそも小説から武力知力を求めることが有用なのか?
という点は考慮の対象外とする。
例えば、迷惑メールを判別するAIを作る際に、
メールデータのみからAIが出来れば凄いが、多くは、
メールデータ + 人間が判断した迷惑メールかどうかのフラグ
を用いて「迷惑メール判定式」を作る、方が多いだろう。
正解データを見ながら式を作るほうがむしろ普通だ。
「教師無し」から「教師有り」に変えて検討を続けようという話。
今回の機械学習(Word2Vec)で作ったデータについて、
武力知力を直接取り出すことには失敗した。
その原因として、
陣営/相性などのより強く出ている要素に邪魔されたから、
なのか、
データ内にそもそも武力知力相当の値が無いから、
なのかを確認しようということでもある。
問題設定も自分で行いながら問題を解く場合は、
どんな位置づけのことを実施しているのか、
より抽象的な観点で確認しながら行わないと
すぐに道に迷ってしまう。
IFシナリオを遊ぶ場合は、どこまで真でどこからIFなのか確認して遊ぶ
伝国の玉璽(正解データ)の入手
洛陽の井戸の底から 三國志DS3攻略wiki 様から、
三國志Ⅴの武将データの一覧のCSVを作成する。
※三國志Ⅴは、PSP、三國志DS3、スマホ版等でリメイクされている。
スクレイピングなどをするまでもなく表形式になっているので、
エクセルなどに張り付けて整形すればよい。
以下のようなデータのカタマリになる。曹操様強い
'曹操', '87', '96', '97', '98'
(武力 / 知力 / 政治 / 魅力)
武将データと、これまでに作成した、
登場回数+50次元ベクトルの情報と合わせて、
pandasのデータフレームにする。
# リストをデータフレームに変換する
import pandas as pd
sangoku_df = pd.DataFrame(Busyou_data_list_with_sangoku5, columns=['Name', '武力', '知力', '政治', '魅力', '回数' ,'V01','V02','V03','V04','V05','V06','V07','V08','V09','V10','V11','V12','V13','V14','V15','V16','V17','V18','V19','V20','V21','V22','V23','V24','V25','V26','V27','V28','V29','V30','V31','V32','V33','V34','V35','V36','V37','V38','V39','V40','V41','V42','V43','V44','V45','V46','V47','V48','V49','V50'])
こんな感じのデータになる。
'曹操', '87', '96', '97', '98', 2843, 3.834890365600586, 0.6499840617179871, ・・・(50個のベクトルの各値)
曹操は、青空文庫中で2843回登場しており、登場回数もNo1。
孫堅「おお、これが伝国の玉璽 KOEIの正解データか!」
魯粛「それも伝国の玉璽ですが、ゲームが違いますっ!」
Imperial Seal / 伝国の玉璽 (黒)
ソーサリー
あなたのライブラリーからカードを1枚探す。
その後あなたのライブラリーを切り直し、
そのカードをその一番上に置く。
あなたは2点のライフを失う。
なお、これ以降はガチモードで記載させていただこう。
話が少し複雑化になってきて、
余計な会話を挟む余裕がなくなってきた。ネタが尽きた
重回帰分析
正解データを入手したので、
「重回帰分析」によって、無理やり、
ベクトルから武力を求める式を作ってみようと思う。
重回帰分析とは、1つの目的変数(この場合は武力)を、
複数の説明変数(この場合は50次元ベクトルの各値)で予測するもの。
重回帰分析の性質や詳細は
よく説明出来ないのでググってくだされっ!
Word2Vecの50次元ベクトルのみを
説明変数として実行してみる。
(武力、知力、政治、魅力、で4回やる)
from sklearn import linear_model
clf_B_model = linear_model.LinearRegression()
clf_T_model = linear_model.LinearRegression()
clf_S_model = linear_model.LinearRegression()
clf_M_model = linear_model.LinearRegression()
# 説明変数に "武力"などのパラメータ系を落としたもの を利用
# 回数をまずは説明変数に入れずにやってみる
except_quality = sangoku_df.drop(["Name","武力","知力","政治","魅力", '回数'],axis=1)
X = except_quality.as_matrix()
# 目的変数に "武力" を利用
Y_B = sangoku_df['武力'].as_matrix()
# 目的変数に "知力" を利用
Y_T = sangoku_df['知力'].as_matrix()
# 目的変数に "政治" を利用
Y_S = sangoku_df['政治'].as_matrix()
# 目的変数に "魅力" を利用
Y_M = sangoku_df['魅力'].as_matrix()
# 予測モデルを作成
clf_B_model.fit(X, Y_B)
# 予測モデルを作成
clf_T_model.fit(X, Y_T)
# 予測モデルを作成
clf_S_model.fit(X, Y_S)
# 予測モデルを作成
clf_M_model.fit(X, Y_M)
# 武力モデル(clf_B_model)についての結果をPRINTする
# ※以降、知力、政治、魅力、についても同様
# 偏回帰係数
print(pd.DataFrame({"ColName":except_quality.columns,
"Coefficients":clf_B_model.coef_}).sort_values(by='Coefficients') )
# 切片 (誤差)
print(clf_B_model.intercept_)
#偏回帰係数(傾き)
print(clf_B_model.coef_)
#決定係数
print(clf_B_model.score(X,Y_B))
ColName Coefficients
25 V26 -61.271715
45 V46 -25.912462
8 V09 -25.092631
23 V24 -21.504212
3 V04 -19.667249
15 V16 -19.209042
30 V31 -18.987222
1 V02 -16.588763
27 V28 -15.995261
44 V45 -12.291346
39 V40 -11.599499
46 V47 -10.909173
36 V37 -10.274551
43 V44 -10.092843
16 V17 -9.463913
0 V01 -9.205292
41 V42 -8.616187
9 V10 -8.555294
26 V27 -7.228924
42 V43 -6.989891
34 V35 -6.866054
7 V08 -6.503953
10 V11 -4.793779
21 V22 -4.482499
28 V29 -4.081184
6 V07 -2.616649
17 V18 -0.037904
38 V39 0.122413
19 V20 1.920816
37 V38 2.282509
47 V48 3.396366
11 V12 3.949870
40 V41 8.039302
48 V49 8.675593
12 V13 9.706162
24 V25 10.006476
4 V05 10.381380
35 V36 11.448578
14 V15 14.993325
32 V33 18.391117
2 V03 18.407241
18 V19 18.576508
49 V50 19.626562
13 V14 19.685847
5 V06 21.965289
22 V23 23.017108
33 V34 23.734387
31 V32 23.880140
20 V21 26.807478
29 V30 32.375894
82.80934304572963
[ -9.20529151 -16.58876342 18.40724119 -19.6672492 10.38137953
21.96528882 -2.61664864 -6.50395289 -25.09263103 -8.55529397
-4.79377903 3.94987032 9.70616211 19.68584678 14.99332549
-19.2090421 -9.46391312 -0.03790405 18.57650838 1.92081557
26.80747794 -4.48249918 23.0171084 -21.50421226 10.00647568
-61.27171489 -7.22892442 -15.99526099 -4.08118442 32.37589425
-18.98722178 23.88014036 18.39111672 23.73438735 -6.86605449
11.44857829 -10.27455057 2.28250868 0.1224132 -11.59949902
8.03930208 -8.61618743 -6.98989059 -10.09284258 -12.29134613
-25.91246161 -10.90917327 3.39636648 8.67559251 19.62656171]
0.6045441117790333
このようにして得られた
式(予測モデル)は、
各武将の値をどのように評価しているのか、
以下の関数でPredict(予測)を実行し、
結果を見てみよう!
#三国志5に存在していなかったデータを含めて全てPredictする実験
predict_Busyou_data_list = []
for Busyou_data in Busyou_data_list:
busyou_name = Busyou_data[0]
#print(Busyou_data)
#DataFrame形式にするため、1個の要素しかない二次元配列にしてからDataFrame化する
df_for_predict = pd.DataFrame( [Busyou_data[2:]] , columns=['V01','V02','V03','V04','V05','V06','V07','V08','V09','V10','V11','V12','V13','V14','V15','V16','V17','V18','V19','V20','V21','V22','V23','V24','V25','V26','V27','V28','V29','V30','V31','V32','V33','V34','V35','V36','V37','V38','V39','V40','V41','V42','V43','V44','V45','V46','V47','V48','V49','V50'])
predict_B = int(round(clf_B_model.predict(df_for_predict)[0]))
predict_T = int(round(clf_T_model.predict(df_for_predict)[0]))
predict_S = int(round(clf_S_model.predict(df_for_predict)[0]))
predict_M = int(round(clf_M_model.predict(df_for_predict)[0]))
tmp_data = [busyou_name, predict_B, predict_T, predict_S, predict_M]
#正解データが存在する場合は、そのデータを追加
for sangoku5_data in sangoku5_datalist:
#名前が完全一致する場合
if sangoku5_data[1] == busyou_name:
#新しいマージデータの生成
tmp_data.append([sangoku5_data[5], sangoku5_data[6], sangoku5_data[7], sangoku5_data[8]])
predict_Busyou_data_list.append(tmp_data)
import pprint
pprint.pprint(predict_Busyou_data_list)
[['曹操', 72, 74, 63, 79, ['87', '96', '97', '98']],
['劉備', 69, 73, 63, 81, ['79', '77', '80', '99']],
['諸葛亮', 62, 85, 73, 86, ['60', '100', '96', '97']],
['関羽', 83, 68, 53, 71, ['99', '83', '64', '96']],
['張飛', 91, 56, 38, 71, ['99', '45', '17', '44']],
['呂布', 80, 50, 38, 57, ['100', '31', '9', '67']],
['袁紹', 68, 70, 64, 75, ['81', '77', '49', '92']],
['周瑜', 63, 87, 75, 84, ['78', '99', '87', '96']],
['孫権', 61, 87, 79, 83, ['82', '88', '79', '96']],
['趙雲', 87, 67, 50, 71, ['98', '88', '80', '95']],
['司馬懿', 79, 74, 65, 77, ['67', '99', '91', '79']],
['董卓', 72, 58, 56, 64, ['95', '52', '37', '69']],
['孫策', 76, 80, 66, 87, ['95', '83', '62', '97']],
['魏延', 90, 65, 50, 68, ['94', '48', '37', '56']],
['馬超', 87, 54, 37, 66, ['98', '40', '32', '82']],
['魯粛', 38, 93, 87, 92, ['61', '96', '93', '90']],
['黄忠', 90, 69, 55, 69, ['97', '66', '68', '86']],
['劉表', 51, 73, 63, 78, ['61', '71', '74', '83']],
['袁術', 76, 54, 46, 76, ['71', '69', '14', '83']],
左側の4つの数字が「予測結果」で、
右側の4つの数字が「KOEIの正解データ」だ。
それぞれ、武力、知力、政治、魅力、を表している。
確かにそれぽいようなデータになっている気がするが、
可もなく不可もないような数字を出しているだけ
という印象で、あまり良い結果には見えない。
しかし、ここで最後の工夫を炸裂させる。
小説データを数値化するのであれば、
最も重要な要素は「主人公補正」だ。
Word2Vec結果+主人公補正、を説明変数にしてみよう!
最終結果発表(主人公補正追加版)
「小説上の登場回数」が
「主人公補正」的に効いているのではないか?
という仮説のもと、
51番目の説明変数として、「登場回数」を加えて再実行した。
最終結果全行を一括でご紹介しよう!
[['曹操', 95, 92, 87, 105, ['87', '96', '97', '98']],
['劉備', 89, 89, 84, 105, ['79', '77', '80', '99']],
['諸葛亮', 78, 98, 90, 104, ['60', '100', '96', '97']],
['関羽', 92, 75, 62, 82, ['99', '83', '64', '96']],
['張飛', 97, 61, 44, 77, ['99', '45', '17', '44']],
['呂布', 85, 54, 43, 63, ['100', '31', '9', '67']],
['袁紹', 70, 71, 66, 77, ['81', '77', '49', '92']],
['周瑜', 64, 88, 77, 86, ['78', '99', '87', '96']],
['孫権', 63, 89, 81, 85, ['82', '88', '79', '96']],
['趙雲', 88, 68, 51, 72, ['98', '88', '80', '95']],
['司馬懿', 80, 75, 67, 79, ['67', '99', '91', '79']],
['董卓', 72, 58, 56, 64, ['95', '52', '37', '69']],
['孫策', 77, 80, 66, 87, ['95', '83', '62', '97']],
['魏延', 91, 65, 50, 68, ['94', '48', '37', '56']],
['馬超', 87, 54, 37, 66, ['98', '40', '32', '82']],
['魯粛', 38, 93, 86, 92, ['61', '96', '93', '90']],
['黄忠', 89, 68, 55, 69, ['97', '66', '68', '86']],
['劉表', 50, 72, 61, 76, ['61', '71', '74', '83']],
['袁術', 74, 53, 44, 74, ['71', '69', '14', '83']],
['張郃', 83, 67, 59, 67, ['93', '67', '54', '69']],
['孫堅', 88, 60, 45, 75, ['94', '85', '59', '93']],
['張遼', 89, 59, 47, 66, ['95', '88', '68', '85']],
['貂蝉', 27, 64, 57, 73, ['26', '81', '65', '94']],
['孟獲', 86, 56, 37, 66, ['92', '51', '19', '67']],
['姜維', 68, 72, 63, 70, ['93', '96', '81', '87']],
['徐晃', 87, 62, 52, 70, ['93', '68', '57', '63']],
['陳宮', 65, 62, 55, 64, ['61', '90', '81', '69']],
['曹丕', 51, 87, 85, 84, ['75', '72', '77', '85']],
['徐庶', 39, 80, 70, 79, ['68', '97', '86', '85']],
['曹仁', 93, 62, 49, 78, ['85', '68', '60', '71']],
['許褚', 89, 53, 39, 60, ['98', '18', '21', '68']],
['陸遜', 69, 80, 73, 81, ['79', '97', '87', '94']],
['龐統', 46, 82, 66, 80, ['56', '98', '86', '85']],
['董承', 42, 78, 66, 79, ['74', '61', '54', '80']],
['龐徳', 81, 65, 49, 70, ['97', '70', '41', '72']],
['呂蒙', 64, 80, 72, 76, ['85', '90', '80', '84']],
['甘寧', 78, 66, 51, 67, ['96', '60', '34', '71']],
['馬岱', 90, 47, 36, 58, ['84', '49', '40', '72']],
['夏侯惇', 83, 68, 55, 75, ['94', '70', '81', '87']],
['曹洪', 74, 69, 56, 71, ['79', '45', '63', '71']],
['曹真', 68, 75, 70, 79, ['79', '68', '55', '74']],
['王允', 38, 66, 64, 64, ['29', '72', '92', '78']],
['劉璋', 49, 75, 71, 78, ['33', '60', '43', '85']],
['孟達', 59, 75, 62, 67, ['73', '72', '51', '44']],
['関平', 89, 58, 47, 67, ['82', '70', '52', '80']],
['関興', 87, 56, 51, 60, ['88', '71', '49', '75']],
['孫乾', 64, 62, 61, 71, ['33', '75', '79', '90']],
['夏侯淵', 90, 62, 50, 74, ['91', '59', '43', '82']],
['王平', 86, 55, 44, 63, ['79', '71', '54', '71']],
['太史慈', 84, 57, 40, 61, ['96', '67', '39', '72']],
['蔡瑁', 67, 66, 59, 64, ['80', '72', '79', '61']],
['張松', 50, 73, 67, 68, ['20', '92', '86', '69']],
['公孫瓚', 77, 66, 52, 73, ['86', '66', '56', '70']],
['荀彧', 52, 88, 77, 82, ['34', '98', '95', '90']],
['黄蓋', 64, 77, 62, 76, ['88', '67', '75', '80']],
['劉封', 71, 64, 51, 67, ['70', '61', '38', '70']],
['張苞', 73, 46, 43, 49, ['88', '42', '40', '45']],
['李儒', 45, 63, 67, 61, ['15', '91', '85', '44']],
['于禁', 77, 63, 50, 62, ['79', '71', '40', '77']],
['馬謖', 64, 83, 72, 80, ['67', '86', '70', '71']],
['何進', 51, 68, 67, 73, ['77', '43', '67', '91']],
['張昭', 36, 88, 89, 77, ['14', '94', '98', '84']],
['黄祖', 72, 53, 33, 54, ['70', '32', '57', '37']],
['李傕', 75, 53, 47, 59, ['68', '34', '48', '36']],
['賈詡', 56, 89, 81, 73, ['42', '97', '89', '68']],
['李典', 85, 64, 54, 83, ['78', '81', '49', '69']],
['徐盛', 72, 70, 63, 72, ['84', '84', '69', '78']],
['顔良', 102, 48, 41, 63, ['95', '35', '21', '53']],
['張魯', 52, 68, 60, 73, ['62', '83', '71', '93']],
['韓遂', 70, 58, 46, 59, ['63', '78', '63', '74']],
['廖化', 76, 62, 47, 64, ['69', '66', '50', '68']],
['陳登', 52, 72, 64, 64, ['40', '71', '70', '73']],
['禰衡', 41, 80, 67, 62, ['20', '92', '88', '23']],
['劉禅', 23, 82, 84, 89, ['7', '30', '32', '78']],
['袁譚', 67, 63, 61, 75, ['63', '49', '48', '74']],
['袁尚', 71, 50, 45, 69, ['71', '47', '42', '77']],
['文醜', 89, 38, 31, 54, ['97', '25', '12', '67']],
['程普', 72, 75, 76, 74, ['80', '80', '73', '85']],
['張繍', 68, 55, 45, 73],
['馬騰', 56, 57, 46, 72, ['91', '57', '49', '88']],
['李粛', 56, 66, 59, 58, ['38', '69', '68', '55']],
['楊儀', 52, 76, 64, 54, ['60', '71', '79', '46']],
['周泰', 85, 66, 56, 73, ['94', '65', '51', '70']],
['糜竺', 50, 68, 71, 72, ['30', '66', '79', '81']],
['典韋', 68, 53, 42, 57, ['98', '31', '17', '57']],
['楊奉', 69, 51, 45, 58],
['凌統', 85, 55, 42, 66, ['83', '60', '44', '61']],
['諸葛瑾', 52, 83, 79, 85, ['41', '91', '94', '94']],
['蒋幹', 52, 74, 59, 67, ['13', '67', '39', '39']],
['吉平', 52, 74, 65, 70],
['法正', 41, 77, 68, 65, ['50', '94', '89', '67']],
['張角', 54, 57, 44, 61, ['50', '95', '88', '99']],
['曹叡', 45, 86, 86, 83, ['56', '81', '74', '80']],
['田豊', 43, 78, 75, 62, ['47', '95', '83', '77']],
['程昱', 46, 86, 83, 75, ['45', '93', '86', '75']],
['郭淮', 74, 72, 68, 71, ['79', '72', '66', '65']],
['糜芳', 63, 68, 61, 56, ['68', '40', '16', '22']],
['劉琦', 34, 76, 73, 77, ['7', '75', '64', '75']],
['司馬徽', 21, 95, 74, 78, ['18', '96', '74', '78']],
['厳顔', 76, 63, 51, 58, ['88', '70', '63', '79']],
['楽進', 80, 57, 49, 69, ['80', '54', '40', '78']],
['劉岱', 73, 49, 36, 51, ['65', '41', '15', '33']],
['韓当', 87, 56, 47, 60, ['71', '64', '43', '67']],
['王朗', 53, 86, 81, 79, ['50', '61', '62', '63']],
['馬忠', 75, 48, 44, 44, ['73', '54', '30', '59'], ['60', '51', '40', '45']],
['郭嘉', 60, 78, 70, 82, ['32', '98', '91', '92']],
['曹休', 78, 59, 53, 73, ['74', '65', '54', '73']],
['楊修', 40, 90, 75, 85, ['25', '92', '84', '48']],
['闞沢', 47, 77, 72, 68, ['48', '78', '84', '73']],
['夏侯楙', 58, 68, 63, 73, ['47', '42', '18', '28']],
['盧植', 49, 72, 77, 76, ['69', '84', '75', '85']],
['紀霊', 80, 41, 42, 55, ['83', '33', '31', '46']],
['管輅', 26, 95, 76, 81, ['14', '95', '70', '73']],
['潘璋', 86, 43, 35, 48, ['79', '40', '23', '50']],
['鄧芝', 66, 65, 58, 73, ['56', '85', '79', '91']],
['審配', 60, 78, 74, 73, ['73', '69', '87', '75']],
['劉曄', 43, 86, 88, 79, ['30', '84', '77', '81']],
['満寵', 60, 81, 78, 84, ['57', '82', '72', '86']],
['左慈', 38, 84, 48, 69, ['10', '99', '21', '91']],
['虞翻', 40, 78, 73, 66, ['40', '78', '81', '74']],
['荀攸', 51, 74, 69, 64, ['49', '95', '90', '82']],
['楊彪', 52, 63, 65, 78, ['41', '75', '74', '83']],
['華雄', 80, 49, 38, 57, ['90', '29', '26', '41']],
['劉繇', 68, 63, 45, 69, ['20', '40', '56', '69']],
['張任', 77, 63, 48, 64, ['89', '75', '43', '78']],
['王忠', 78, 40, 23, 51],
['丁奉', 79, 43, 53, 58, ['84', '68', '75', '72']],
['高定', 73, 41, 32, 41, ['66', '36', '29', '41']],
['郭汜', 71, 52, 43, 69, ['65', '37', '21', '45']],
['呂範', 46, 79, 72, 83, ['40', '71', '75', '75']],
['周倉', 45, 68, 64, 68, ['82', '29', '31', '54']],
['沮授', 50, 85, 78, 75, ['60', '90', '91', '85']],
['許攸', 57, 74, 60, 68, ['42', '66', '78', '47']],
['張翼', 81, 55, 43, 63, ['76', '63', '52', '69']],
['張嶷', 86, 42, 39, 58, ['76', '70', '76', '77']],
['陶謙', 48, 56, 53, 64, ['31', '60', '65', '75']],
['文聘', 78, 44, 39, 53, ['82', '43', '65', '66']],
['韓暹', 71, 44, 34, 55, ['63', '30', '19', '39']],
['蔡和', 55, 48, 37, 49, ['51', '39', '35', '34']],
['華歆', 27, 79, 88, 70, ['35', '80', '85', '30']],
['李厳', 61, 71, 56, 72, ['87', '82', '41', '80']],
['曹彰', 83, 72, 58, 80, ['92', '41', '24', '79']],
['孟優', 70, 57, 44, 62, ['84', '27', '10', '36']],
['簡雍', 56, 67, 70, 61, ['36', '70', '76', '67']],
['王子服', 41, 72, 61, 76, ['68', '64', '61', '78']],
['馬良', 47, 82, 76, 87, ['28', '92', '93', '88']],
['曹植', 34, 79, 66, 80, ['10', '91', '80', '84']],
['夏侯尚', 81, 50, 46, 52, ['69', '66', '52', '61']],
['馬元義', 66, 36, 24, 48],
['侯成', 71, 60, 48, 55, ['68', '39', '40', '41']],
['黄権', 47, 71, 69, 69, ['46', '82', '70', '66']],
['呉懿', 75, 62, 51, 71, ['79', '77', '74', '78']],
['于吉', 47, 54, 43, 57, ['9', '99', '23', '95']],
['傅士仁', 56, 64, 54, 46, ['60', '48', '31', '14']],
['郭図', 52, 71, 66, 64, ['32', '80', '72', '43']],
['高順', 83, 46, 38, 54, ['84', '56', '41', '67']],
['蔡夫人', 44, 65, 59, 81],
['伊籍', 30, 68, 69, 66, ['27', '81', '88', '76']],
['王双', 89, 38, 32, 61, ['89', '18', '21', '32']],
['馬遵', 58, 75, 68, 70, ['68', '53', '47', '55']],
['趙範', 57, 54, 42, 60, ['38', '63', '58', '45']],
['崔諒', 53, 48, 51, 59],
['丁原', 72, 29, 21, 45, ['79', '55', '48', '69']],
['孔融', 58, 77, 66, 72, ['37', '89', '75', '72']],
['張允', 62, 61, 52, 51, ['62', '61', '59', '52']],
['張宝', 87, 36, 23, 59, ['82', '72', '42', '91']],
['呉夫人', 39, 67, 68, 73],
['陳珪', 21, 69, 64, 57, ['11', '71', '79', '80']],
['王必', 71, 48, 41, 65],
['車冑', 59, 51, 49, 48],
['劉琮', 35, 60, 64, 76, ['30', '60', '61', '78']],
['楊阜', 69, 53, 51, 70],
['郝昭', 60, 78, 68, 68, ['84', '89', '80', '85']],
['張虎', 79, 57, 37, 56, ['69', '53', '43', '60']],
['雍闓', 58, 58, 42, 57, ['73', '51', '30', '49']],
['李楽', 64, 60, 48, 67],
['張英', 79, 53, 45, 63, ['71', '37', '41', '51']],
['姜叙', 79, 46, 36, 73],
['孫礼', 64, 59, 57, 62, ['69', '67', '64', '67']],
['劉恢', 26, 55, 48, 62],
['張済', 73, 63, 56, 51, ['70', '63', '66', '72']],
['陳武', 76, 58, 52, 58, ['78', '60', '37', '42']],
['甘夫人', 51, 52, 52, 62],
['糜夫人', 51, 61, 50, 76],
['袁煕', 77, 44, 40, 72],
['牛金', 82, 50, 40, 62, ['81', '39', '24', '58']],
['楊松', 29, 67, 67, 57, ['37', '39', '57', '24']],
['鄭文', 58, 32, 48, 28],
['逢紀', 58, 68, 58, 65, ['60', '85', '61', '61']],
['蒋欽', 67, 58, 52, 66, ['78', '70', '40', '66']],
['宋憲', 63, 55, 54, 58, ['66', '43', '45', '34']],
['陳式', 83, 45, 32, 54, ['67', '48', '39', '25']],
['周魴', 52, 78, 72, 67, ['43', '79', '77', '59']],
['劉焉', 49, 68, 68, 74, ['36', '75', '82', '86']],
['田氏', 31, 49, 41, 43],
['高覧', 65, 49, 41, 42, ['73', '50', '39', '60']],
['邢道栄', 82, 54, 43, 67],
['冷苞', 71, 63, 50, 48, ['82', '68', '37', '23']],
['朱然', 71, 57, 35, 64, ['76', '40', '34', '63']],
['劉延', 84, 43, 29, 57],
['裴元紹', 69, 37, 34, 49, ['76', '37', '32', '37']],
['張南', 87, 28, 30, 46],
['蘇飛', 68, 55, 50, 67, ['70', '40', '26', '74']],
['韓馥', 47, 65, 74, 76, ['69', '44', '39', '66']],
['穆順', 49, 61, 53, 56],
['郝萌', 72, 59, 44, 63, ['67', '42', '34', '48']],
['曹豹', 65, 38, 29, 36, ['69', '12', '17', '16']],
['韓胤', 42, 33, 34, 46],
['劉辟', 81, 48, 47, 66, ['72', '27', '27', '41']],
['徐氏', 40, 56, 45, 57],
['韓玄', 55, 57, 53, 49, ['67', '31', '20', '19']],
['夏侯覇', 69, 66, 49, 67, ['90', '67', '72', '77']],
['陳応', 97, 32, 20, 47],
['楊懐', 46, 68, 60, 52, ['76', '43', '33', '50']],
['孫桓', 78, 58, 41, 65, ['75', '70', '48', '80']],
['司馬師', 67, 82, 76, 89, ['65', '93', '82', '76']],
['楽綝', 71, 60, 46, 55, ['60', '44', '30', '37']],
['張譲', 57, 33, 43, 39],
['樊稠', 65, 46, 51, 47, ['81', '26', '11', '35']],
['蒯良', 41, 74, 72, 55, ['27', '86', '87', '72']],
['陳震', 37, 66, 72, 80, ['57', '60', '71', '54']],
['韓浩', 89, 36, 41, 55, ['76', '42', '74', '70']],
['呉班', 70, 46, 37, 52, ['70', '47', '42', '61']],
['蒋琬', 43, 88, 91, 84, ['54', '91', '94', '84']],
['王甫', 47, 60, 47, 67, ['42', '75', '69', '80']],
['関索', 85, 62, 48, 72, ['86', '62', '47', '76']],
['高翔', 64, 45, 48, 45, ['61', '48', '44', '49']],
['皇甫嵩', 67, 30, 37, 47, ['68', '73', '77', '82']],
['孫韶', 56, 66, 62, 61, ['79', '59', '71', '78']],
['張紘', 38, 95, 91, 88, ['13', '89', '95', '85']],
['鍾繇', 59, 67, 64, 67, ['8', '76', '92', '56']],
['黄奎', 36, 74, 62, 63],
['鄧賢', 87, 70, 63, 70, ['68', '61', '61', '67']],
['兀突骨', 74, 42, 37, 51, ['88', '10', '9', '36']],
['王威', 67, 62, 62, 68, ['70', '59', '52', '66']],
['淳于瓊', 79, 52, 38, 45, ['72', '58', '45', '69']],
['曹嵩', 28, 67, 68, 75],
['孫翊', 64, 58, 49, 67, ['81', '50', '25', '66']],
['厳白虎', 64, 42, 35, 60, ['78', '44', '44', '49']],
['魏続', 89, 43, 37, 49, ['71', '43', '38', '40']],
['鄭玄', 26, 72, 75, 85],
['韓嵩', 39, 54, 56, 51, ['28', '70', '85', '51']],
['蔡陽', 61, 46, 57, 59],
['顧雍', 31, 86, 88, 74, ['11', '71', '78', '80']],
['李恢', 56, 57, 55, 50, ['51', '87', '79', '81']],
['高沛', 72, 46, 40, 60, ['61', '35', '44', '49']],
['周善', 67, 43, 38, 67],
['耿紀', 50, 47, 32, 51, ['32', '78', '71', '72']],
['費耀', 81, 48, 40, 48],
['何后', 23, 39, 60, 51],
['何太后', 27, 75, 68, 78],
['呂公', 64, 42, 41, 36],
['何儀', 67, 19, 8, 36, ['70', '31', '19', '24']],
['种輯', 51, 64, 56, 69],
['呉碩', 24, 80, 76, 80],
['龔都', 70, 45, 36, 61, ['72', '28', '40', '49']],
['呂曠', 63, 61, 53, 72, ['71', '25', '23', '40']],
['呂翔', 64, 55, 47, 61, ['72', '24', '24', '38']],
['朱桓', 75, 74, 55, 73, ['89', '76', '67', '80']],
['曹純', 72, 41, 41, 59, ['63', '63', '44', '61']],
['呉蘭', 90, 57, 37, 64, ['82', '41', '44', '54']],
['楊鋒', 66, 44, 26, 44, ['70', '34', '31', '34']],
['苟安', 35, 65, 55, 55],
['秦朗', 49, 49, 49, 56],
['鄒靖', 68, 56, 54, 59, ['67', '66', '47', '68']],
['厳氏', 28, 63, 64, 77],
['劉安', 22, 74, 58, 58],
['伏完', 41, 50, 44, 75],
['呉子蘭', 50, 68, 65, 71],
['董襲', 82, 42, 29, 47, ['70', '38', '29', '50']],
['張衛', 71, 51, 48, 56, ['74', '35', '33', '65']],
['韋晃', 58, 62, 49, 71],
['申耽', 81, 54, 48, 65, ['68', '59', '50', '61']],
['申儀', 71, 46, 52, 58],
['馮習', 59, 42, 24, 35, ['70', '40', '21', '61']],
['呂凱', 27, 74, 75, 81, ['41', '67', '77', '69']],
['阿会喃', 66, 39, 28, 41, ['78', '29', '23', '19']],
['司馬昭', 57, 70, 68, 67, ['65', '87', '90', '74']],
['閔貢', 49, 63, 58, 66],
['呂伯奢', 30, 42, 27, 37],
['胡軫', 70, 32, 28, 47, ['74', '12', '15', '21']],
['徐栄', 87, 37, 27, 54, ['56', '39', '41', '49']],
['董昭', 26, 72, 77, 72, ['49', '62', '75', '59']],
['秦琪', 82, 55, 42, 57],
['高幹', 70, 60, 45, 70, ['61', '61', '27', '70']],
['蒯越', 35, 80, 75, 76, ['29', '87', '82', '70']],
['崔州平', 17, 82, 62, 72],
['韋康', 62, 46, 42, 59],
['趙昂', 59, 58, 37, 70],
['蔡琰', 12, 73, 69, 68, ['11', '76', '80', '85']],
['成何', 86, 61, 52, 69],
['譙周', 17, 81, 81, 60, ['16', '86', '59', '63']],
['忙牙長', 80, 26, 21, 35, ['68', '24', '18', '17']],
['朶思大王', 68, 54, 37, 61, ['81', '67', '39', '48']],
['祝融', 65, 27, 16, 47, ['81', '14', '14', '54']],
['裴緒', 36, 72, 80, 69],
['楊陵', 56, 45, 47, 58],
['戴陵', 75, 14, 23, 28],
['蹇碩', 38, 48, 51, 44],
['崔毅', 27, 58, 57, 51],
['衛弘', 29, 75, 52, 75],
['耿武', 63, 55, 52, 63],
['呉氏', 42, 56, 47, 71],
['孫静', 56, 75, 74, 80, ['52', '51', '52', '64']],
['李豊', 68, 55, 41, 64, ['62', '62', '60', '64']],
['蒋奇', 82, 51, 43, 61],
['王累', 27, 81, 84, 77, ['26', '80', '89', '76']],
['李意', 17, 62, 59, 58],
['朱褒', 56, 46, 45, 37, ['73', '34', '32', '40']],
['韓徳', 77, 51, 43, 75],
['越吉', 76, 36, 30, 43, ['80', '15', '13', '33']],
['張梁', 75, 47, 38, 70, ['84', '60', '46', '89']],
['左豊', 61, 50, 56, 65],
['劉氏', 35, 64, 68, 71],
['牛輔', 67, 25, 33, 40, ['60', '21', '26', '37']],
['張闓', 66, 34, 23, 44, ['69', '19', '15', '21']],
['曹昂', 58, 59, 58, 76, ['67', '52', '43', '74']],
['史渙', 79, 58, 58, 66],
['朱霊', 77, 42, 41, 56, ['63', '40', '29', '41']],
['胡班', 57, 62, 56, 67, ['63', '52', '50', '62']],
['孔秀', 75, 46, 38, 49],
['韓福', 65, 67, 49, 45],
['黄承彦', 14, 80, 63, 69, ['4', '87', '21', '73']],
['辺洪', 53, 40, 47, 33],
['宋忠', 55, 61, 47, 58],
['楊秋', 75, 37, 24, 48, ['71', '16', '19', '31']],
['丁斐', 37, 67, 62, 64],
['閻圃', 36, 74, 80, 64, ['31', '80', '86', '77']],
['劉巴', 39, 75, 84, 66, ['45', '70', '67', '61']],
['霍峻', 53, 74, 87, 65, ['77', '65', '51', '70']],
['夏侯徳', 78, 48, 45, 59, ['62', '54', '45', '70']],
['趙咨', 32, 80, 86, 57],
['鄂煥', 81, 36, 25, 33],
['秦良', 91, 35, 24, 45],
['韓忠', 76, 25, 13, 27, ['69', '40', '14', '31']],
['董太后', 30, 40, 54, 63],
['鮑信', 68, 54, 46, 62, ['67', '81', '73', '78']],
['蔡邕', 50, 88, 84, 97, ['23', '82', '87', '79']],
['祖茂', 51, 49, 39, 63, ['74', '63', '58', '77']],
['陳生', 60, 38, 15, 28],
['呂虔', 71, 48, 51, 55, ['68', '29', '56', '55']],
['普浄', 22, 62, 84, 65],
['関定', 29, 41, 43, 58],
['焦触', 75, 64, 45, 55],
['公孫康', 52, 61, 41, 66, ['70', '48', '21', '71']],
['劉泌', 32, 75, 74, 82],
['陳矯', 62, 60, 59, 55, ['21', '68', '74', '70']],
['楊柏', 70, 37, 37, 48, ['45', '19', '26', '21']],
['許靖', 36, 62, 55, 69, ['21', '74', '78', '69']],
['楊昂', 77, 50, 44, 49, ['72', '38', '35', '42']],
['呉押獄', 37, 84, 74, 80],
['賈逵', 58, 70, 62, 71, ['47', '74', '71', '67']],
['范疆', 62, 59, 44, 44],
['邢貞', 27, 64, 70, 63],
['岑威', 100, 29, 26, 47],
['趙直', 23, 47, 53, 50],
['張世平', 32, 68, 67, 72],
['孫仲', 69, 41, 25, 44, ['62', '30', '21', '36']],
['張温', 36, 55, 55, 73, ['15', '61', '63', '69']],
['潘隠', 34, 61, 66, 48],
['鄭泰', 29, 58, 75, 69],
['王匡', 63, 51, 46, 46],
['袁隗', 57, 29, 33, 56],
['鮑忠', 82, 43, 35, 64],
['陳横', 49, 39, 38, 32, ['64', '48', '31', '52']],
['曹安民', 58, 80, 59, 76],
['鄒氏', 14, 64, 67, 69, ['6', '36', '42', '89']],
['臧覇', 67, 46, 39, 56, ['79', '44', '28', '72']],
['孫観', 72, 27, 26, 49],
['杜遠', 52, 50, 51, 66, ['62', '19', '17', '29']],
['王植', 37, 50, 60, 58],
['韓猛', 69, 26, 16, 27],
['劉夫人', 30, 71, 82, 73],
['馬延', 74, 55, 53, 64],
['崔琰', 37, 62, 64, 56, ['55', '70', '83', '75']],
['王粲', 19, 92, 94, 72, ['23', '83', '86', '67']],
['鞏志', 56, 36, 32, 36, ['46', '64', '58', '49']],
['侯選', 56, 37, 51, 47, ['66', '34', '55', '52']],
['杜襲', 62, 43, 47, 48],
['許芝', 8, 76, 103, 79],
['趙累', 47, 49, 52, 61, ['36', '60', '68', '78']],
['秦宓', 21, 83, 76, 72, ['22', '75', '61', '62']],
['張達', 59, 54, 38, 52, ['51', '34', '22', '24']],
['梁緒', 33, 76, 72, 57],
['尹賞', 25, 59, 64, 49, ['34', '44', '68', '44']],
['雅丹', 61, 66, 60, 58, ['79', '60', '54', '18']],
['張普', 65, 52, 43, 58],
['鄧艾', 73, 64, 67, 72, ['87', '94', '88', '75']],
['蘇双', 44, 47, 42, 56],
['趙弘', 50, 24, 24, 41, ['71', '42', '16', '29']],
['劉虞', 37, 59, 60, 59],
['喬瑁', 62, 38, 40, 43],
['黄琬', 19, 65, 71, 51],
['厳綱', 89, 21, 12, 30, ['68', '45', '34', '36']],
['胡赤児', 49, 40, 51, 35],
['宋果', 49, 33, 35, 54],
['樊能', 70, 30, 19, 39, ['61', '36', '31', '48']],
['楊大将', 82, 88, 90, 83],
['雷薄', 55, 43, 35, 48, ['65', '38', '26', '15']],
['胡車児', 52, 67, 46, 66, ['74', '58', '10', '69']],
['呉敦', 72, 7, -1, 29],
['毛玠', 73, 61, 62, 66, ['60', '57', '82', '60']],
['郭常', 41, 73, 52, 60],
['許貢', 61, 49, 38, 54, ['66', '64', '64', '56']],
['辛評', 58, 53, 52, 50, ['63', '76', '63', '66']],
['張顗', 73, 55, 44, 51],
['田疇', 60, 71, 70, 65, ['74', '52', '62', '76']],
['石広元', 35, 66, 56, 78],
['諸葛均', 30, 60, 52, 63, ['43', '77', '60', '71']],
['程秉', 32, 69, 70, 56, ['21', '67', '64', '75']],
['金旋', 77, 57, 38, 50, ['51', '46', '30', '30']],
['劉度', 49, 43, 37, 57, ['50', '45', '52', '70']],
['宋謙', 59, 50, 52, 65],
['賈華', 38, 40, 40, 45],
['楊任', 52, 54, 37, 45, ['78', '53', '40', '56']],
['潘濬', 35, 77, 78, 56],
['崔禹', 81, 20, 33, 28],
['傅彤', 80, 48, 47, 54, ['72', '67', '56', '69']],
['董允', 14, 77, 83, 56, ['19', '84', '90', '70']],
['曹遵', 80, 70, 65, 65],
['李福', 25, 66, 76, 74]]
最終結果考察
結果の総評
「主人公補正」を入れると、
かなりそれっぽい値になっている武将が増えた。
重回帰分析における「登場回数」の「Coefficients(係数)」は
武力、知力、政治、魅力、それぞれで一番高かった。
つまり、
小説から各武将の能力値を出すには、まず登場回数で概数が決まり、
Word2Vecにより武力型/知力型/君主型などのタイプが判定される
という流れとなったわけである。
言葉にしてしまえば当たり前のような話とはいえ、
小説のみを分析して得られた、全武将の「Word2Vecモデル+登場回数」に対して、
**全く同じ「式(重回帰分析結果)」**を適用して、
これらの武力/知力が算出されているわけで、
当初思ってたよりは良い結果が得られたのではないかと思う。
各部門のTOPの発表!!
武力一位: 顔良 =102
知力一位: 孔明 = 98
政治一位: 蒋琬 張紘 = 91(※許芝103はバグ的な)
魅力一位: 曹操 劉備 =105
顔良は、小説表現上では、関羽に負けたのはまぐれ的扱いだし、
なんども強キャラ扱いされているからだろうか?
いまいちだったやつら
呂布の武力が85なのは予想外に低かった。
(とはいえ、90以上が非常に少なくなっているため、
決して低いわけではない。)
孫策も77であったし、
恐らく君主的な属性も持っている場合は、
方向が違うので多少減算されてしまうのだろう。
司馬懿の知力75も可哀そうである。
相対的に隣に強いやつ(孔明)がいると落ちてしまい、
比較対象が隣に居ないようなやつは上がる傾向だろうか?
他にも何名か可哀そうな武将が見受けられるが、
だいたい「ライバル」にやられているタイプに見える。
新武将(KOEIデータに無かった武将)考察
右側の4つの数字が無かった武将は、
KOEIデータに無かった武将であり、
その値は「教師データ」が無いということ。
このモデルが役立つかどうかはそれらの値を見るのが正しいのだが、
KOEIデータに無い=登場回数が少ない、のがほとんどであり、
そもそもWord2Vecモデルをまともに作れていない場合が多いため、
本来は除外して考えた方が良いようなデータが大半である。
本稿ではイチオウ全員分の結果を、
登場回数でソートした形で出している。
また、一部例外があり例えば「張繍」などは
シュウの字が小説とKOEIで微妙に別字であったため、
KOEIデータを参照出来ていない。
(KOEI側との漢字名寄せは実施していなかった)
よって、ある程度上の方に記載のデータで
KOEIとの参照が失敗している武将たちの結果が
どの程度正しく出ているか?で
結果を評価していただくのが良いと思う。
少し面白いのは、女性陣。
KOEIデータに無かったために新規扱いになっている。
どのキャラも全体的に武力が低く魅力が高い傾向にある気がする。
(祝融は除く)
結果の解釈はいろいろ
お気に入りの武将の結果はいかがだったでしょうか?
「自然言語処理編」の最初で記載したとおり、
本当にゲームのパラメータを決めたいならば、
吉川英治の1つの小説だけでなく、
複数の小説や、正史版のテキストも用意するべきでしょう。
また、AIが解釈した意味の本体は、
「Word2Vec編」で作ったモデルであり、
最後の完結編では、それを数値で表現しようとしたまで。
そもそも、呂布や孔明を除き、他の武将については、
武力、知力の数値は人間が小説を評価しても相当バラツキが生じる。
その意味では、結果が良かったのか悪かったのか、
数字だけ見て解釈することは難しい。
出た結果についても、
お気に入りの武将が高かった/低かった、等の占いレベルの楽しみ方も含め、
予想外に正しく出ていた/全然間違った結果だった、など
自由に解釈していただければ良いと思う。
最後の考察が投げやりっぽいが、
筆者的には愛しの三国武将たちと戯れることが出来て
もうおなかがいっぱいである!
好きに解釈し、好きに思いを馳せることが出来るのが
三国志の最大の魅力であろう!!
以上。
~あとがき(ポエム)~
今回の遊びプロジェクトは
筆者的には「はやぶさ」のような企画であった。
というのは「はやぶさ」のミッションは
「小惑星にタッチダウンして物質を持ち帰ること」だけではない。
イオンエンジンの実験などの複数のミッションがあり、
それを「加点法で評価」している。
ご参考: 「はやぶさ」についての対談記事
もちろん「AIが三国志を読んだら」は
「はやぶさ」の偉業とは全く比較にならない内容であるが、
当初無謀なようにも思えた今回の挑戦について、
「はやぶさ」とその考え方にヒントと勇気をもらって実行した。
すなわち、最終結果(武力や知力の数字)を追うだけでなく、
途中の各ステップで得られる結果を加点法で考えることで、
予算の承認=個人プロジェクトにおけるやる気の確保、が出来た。
- Colaboratory上でカスタマイズ版の自然言語解析を行えること
- NEologdの辞書データも解析に組み込める
- 自前の単語データも解析に組み込める
- GoogleDriveやpickle活用で、Colaboratoryの時間的弱点の補強
- 三国志の武将をWord2Vecモデルにして演算が出来ること
- 孔明のライバルを出す
- 孫権にとっての甘寧の計算
- 武将同士の関係を可視化出来ること
- 次元削減
- クラスタリング
- 武将の武力/知力を計算出来ること
- 結果を考察し、Word2Vecや重回帰の特徴を得ること
「げぇ関羽」「孔明の罠」を投稿中のサブタイトルにすること
イトカワから物質を持ち帰ることのように、
最後に各武将のそれっぽいステータスが出ていればそれは良いことだが、
ステータスが上手く出なかったとしてもガチで考える意義がある。
唯一の誤算は、この方式で分量が増えすぎ、
特に最後の方は自分以外の人に説明しにくい内容になってきたこと。
三国志ネタを考えるのが途中から大変になってきたこと。
~~何か話をすることになったこと https://netadashi10.peatix.com/ ~~
3部合わせて大変な長文にお付き合いいただき、
(こんなところまで読んでくださった方がいたら)
本当にありがとうございました。
以上で本当に完結です。