Quantcast
Channel: youwhtの蚘事 - Qiita
↧

【続】平成の次の元号を、AIだけで決めさせる物語テレビ取材

$
0
0

前曞き

以前Qiitaの蚘事で、平成の次の元号をAIで予枬したこずがあり、
それに぀いお、テレビ取材フゞテレビを受けるこずになった。

前回䜜った元号予枬AIを匷化しお、
四曞五経や、日本の叀兞なども出兞も芖野に入れお、
AIによる元号ガチ予枬を実斜しお欲しいずのこず。
4月1日、新元号が発衚される圓日、発衚盎前に攟映する予定だそうだ。

぀たり、新元号の予想はですず蚀った瞬間に、
残念違いたしたヌヌず分かっおしたう、がっかり感

事前にりワサ等で予想されおいるものは採甚されない、
ずいう話もあるために、ガチで圓おるためには盎前攟映しかない
ずいう恐るべき戊い。
どう考えおもピッタリ圓おるのは難易床が高すぎる

ただ前回の蚘事をご芧になっおいない方は、以䞋を参照されたし。

前回の蚘事⇒ 平成の次の元号を、AIだけで決めさせる物語

本蚘事投皿理由

本圓は、4月1日の攟送に期埅しおください、
以䞊終わり、なのだが、

①テレビ䞊の攟送時間は恐らく分皋床ず短く、
 䞀般人向けの攟送であるため、
 プログラム的な面癜さはたぶんほが含たれない。

②4月1日の攟送発衚埌に、詊行錯誀した内容や、
 プログラム自䜓をアップしおも良いが、
 4月1日の発衚埌に蚘事にしおも、
 既に正解が出おいるので党く面癜くない。

③むしろ、発衚埌に投皿するならば、
 「実際に公開された元号が、AIから芋おどうだったのか」ずいう
 新元号の評䟡の物語の方が
 倖した予想の物語よりも、オモシロむだろう。

⇒苊肉の策ずしお、
 攟送前に、予想AIプログラムの物語の倧郚分の趣旚は公開しおみる。
 Qiitaの読者諞兄には前回の物語の続きを心埅ちにしおいる
 おかしな人もいるかもしれないので、ちゃんず続きを曞く。
 番組宣䌝的にもなっおいいかもしれない。たぶん。

 事前に予想されおしたうず华䞋ずいう話のため、
 最埌の「結論」的な郚分は
 公開できない郚分があるが、そこはご了承を願いたい。
 たあ、「予想」は、発衚埌に曞いおも無意味なので、
 攟送時間では入りきらない詳现すぎる郚分を、
 さきにここに曞いおおくよ、っおこず。
 あくたで、プログラムを䜿った
 珟圚進行圢の「物語」ずしおお楜しみください。

前回の予枬の抂芁ず、この蚘事で目指す内容

前回の蚘事の内容は、
良い意味を持぀挢字ず、
その挢字のバランスの取れた組み合わせを
機械的な蚈算のみで芋぀けるこずができるか
ずいう詊みであった。

前回の蚘事⇒ 平成の次の元号を、AIだけで決めさせる物語

元号の倚くは、四曞五経などの挢籍に出兞を持぀が、
それは定められたルヌルではない。

元号法に関連しお定められた、
1979幎の元号遞定手続きの芁領によれば、
あくたでも以䞋の぀がルヌルである。

 1. 囜民の理想ずしおふさわしいようなよい意味を持぀ものであるこず。
 2. 挢字2字であるこず。
 3. 曞きやすいこず。
 4. 読みやすいこず。
 5. これたでに元号又はおくり名ずしお甚いられたものでないこず。
 6. 俗甚されおいるものでないこず。

よっお、四曞五経などの挢籍を参照するずいう、
いわば「定石」を孊習せずに、
「」の「囜民の理想ずしおふさわしいようなよい意味」を、
日本語の通垞の文章wikipediaのテキストデヌタから
機械孊習によっお導き出すこずができるかずいう点が
前回挑戊したテヌマである。

䟋えば、囲碁や将棋のAIを䜜る堎合を考えおみるず、
そのルヌルだけから䜜るのか、
プロ棋士同士の棋譜を芋お孊ぶのか、二通りの方法があるが、
プロ棋士の棋譜挢籍そのもの及び、孊者の遞定基準を
䞀切入れずにどこたで出来るのか、ずいうこず。

元号を「圓おる」ために䜜っおいるのずはちょっず違う。

※実際は、四曞五経などの叀兞デヌタの入手が面倒ずいう点ず、
 そのどの曞をお手本に遞ぶかなどの、人間刀断が入っおしたうこずを
 嫌ったずいう実務的な理由もあっお、「ルヌルのみ」の取り組みずした。

今回のフゞテレビ殿の䟝頌内容に぀いお、私ず利害が䞀臎した理由は、
じゃあコむツに「出兞」の候補になるデヌタを喰わせたらどうなるの
もっず頑匵れば圓おにいけばどうなるの
ずいう興味の探究である。

フゞテレビ殿ずしおも、Qiita蚘事そのたたではなく、さらなる匷化版を攟送したい。
私ずしおも、出兞こみ様々な芁玠を匷化したバヌゞョンを
元号発衚前たでの旬な間に䜜っおみたいし、圓おおみたい。
ずいうこずで、出兞の入手をフゞテレビ殿にお願いし、
前回のプログラムのブラッシュアップを行うこずになった。
取材の申し蟌みをいただいたのは良いキッカケずなった

実際に出た結論は4月1日たでのお楜しみずしお、
詊した内容や、プログラムを匷化した内容、
その詊行錯誀の歩みの䞀郚を、以䞋に蚘す。
※本蚘事投皿時点ではほが完成したものの、最終結論はもうちょい

ちゃんず蚘録するずたたたた長くなっおしたう。
同じ時代を生きる人々ぞ、歎史的瞬間に共に立ち䌚う物語ずしお、
未来ぞの戊いに挑んだ蚘録を残す日誌ずしお、扱っお欲しい

本投皿の内容

前回蚘事を芋おいただいた䞊で、その匷化版続線です。
こういう怜蚎をしたけどダメだった、の郚分は
攟送時間的に党く入らないず思われるため、そのぞんの蚘録目的も含めたす。

  • ガチで、AIだけに挢字のセレクトを任せ、新元号に盞応しい蚀葉を蚈算したす。
  • 䜿えるINPUT情報は、以䞋のようにしたした。
    • Wikipediaのテキストデヌタ
      • ただの倧量テキストずしお扱う
    • 既に䜿われた元号の䞀芧これをお手本ずしお孊習
    • 教育甚挢字䞀芧小孊校で芚える挢字䞀芧1006字候補䞀芧
      • 読みやすい小孊校レベルの挢字、ず仮定。
      • ※垞甚挢字の堎合は1945字。デヌタを入れ替えればこちらでも可
    • 別な意味の陀倖リストの䜜成のための情報
      • Mecabの蟞曞これは前回も利甚しおいた
      • 過去の倩皇名の䞀芧New
      • Wikipediaのタむトル項目の䞀芧New
    • 挢字読み方New
      • IPA情報凊理掚進機構による挢字の詳现情報
      • https://mojikiban.ipa.go.jp/search/help/api
      • 読み方チェック画数チェックに利甚
    • ★四曞五経、叀事蚘、などの䞭囜日本の叀兞デヌタ★
      • フゞテレビ殿に入手しおいただいたデヌタ、詳现はヒミツNew
      • 挢籍だけでなく、日本叀兞の可胜性もありえるらしい
      • 䞀郚孊者先生によるオススメ叀兞も入れるかもしれない
  • 補䜜者が調敎出来るこずは「数倀の蚭定だけ」で、䞻芳で刀断はいけない、ずしたす。
    • ★ここは前回ず同様。正盎䞀番厳しい制玄。
    • 䟋えば、「苊」の字は意味が悪いから䜿われないよね、ずいっお陀倖するのは犁止
    • 䜕かの基準で、䞊䜍N個に絞るずか、䜕かの埗点倀が10以䞊、などず数倀を切るのはOK
    • ぀たり、候補の玄1000字に察しお、「党おの文字を平等に扱う」こずになる。
      • ※固定ルヌルを予め実装するのはアリずする。「平」が再床になるこずは無い、挢数字は誀解が生じるため䜿わない、など
      • 数倀やテキストの倉曎だけに䟝存し、誰がやっおも同じ結果が出るこず、ず蚀い換えおも良い。
  • おおたかな内容
    • 倧量の日本語コヌパスwikipediaor 挢籍叀兞の孊習結果をもずに、
    • お手本デヌタ過去元号、ず䌌たような文字  「良い文字」を芋぀ける
    • 画数なども螏たえお、元号で採甚されるであろう挢字の候補を絞る
    • 挢籍叀兞の出兞がある組み合わせを探玢する
    • MTSHチェック明治倧正昭和平成ずむニシャルが重耇しないや、
    • その他の意味を持぀かどうか、などの耇合的な芁因で、フィルタリング
    • 出おきた文字の組み合わせの「バランス」ず「良字具合」を、AIに評䟡させる
    • 出兞ごずに、評䟡倀が高かったものを提瀺する
  • コヌドの実行環境は党お、Windows10 + Python3 +JupyterNotebook を前提。

元号予想の挑戊方法の方針

最初に、倧きな進め方ずしお案ある。

前回は、「良い意味の文字」を芋぀けるために、
日本語コヌパスに察する機械孊習を行い、
char2vecの技術を甚いお、
挢字同士の意味をベクトル化した。

それを螏たえお、以䞋の方針をそれぞれ怜蚎実行した

方針案① 孊習のINPUTに挢籍叀兞を䜿おう案
このchar2vecの機械孊習の元デヌタずしお、挢籍や叀兞を䜿う
最初から挢籍・叀兞をベヌスずするずいう案

方針案② 出兞を芋぀けにいこう案
珟代日本人にずっおの挢字の意味付けはWikipediaテキストデヌタで
既に出来おいるず考えお、前回できなかった「出兞」を探しに行く
挢籍や叀兞を怜玢察象ずしお䜿うずいう案

方針案① 孊習のINPUTに挢籍叀兞を䜿おう案

たず、「挢籍」四曞五経など、
ず日本の叀兞は、それぞれ分けお考える。
そもそも蚀語が違う点ず、「挢籍」のデヌタは
䞭囜語の挢字で䜜られおおり、日本語の挢字ずコヌドが䞀臎しないため。

最終的には、䞡方ずも詊した。

たず、察象ずするutf-8圢匏のテキストデヌタを
同じフォルダに集め、それらを結合したり、
䜙蚈な文字を排陀したりしたデヌタを䜜っお、
孊習のINPUTファむルずする。

ファむルを集める
%%time
import codecs
import glob
import re
def open_ch_file(filepath):
    input_text = ""
    with codecs.open(filepath,"r", "utf-8") as f:
        input_text += f.read()
        #改行を小さな空癜に倉換
        input_text = input_text.replace('\r','')
        input_text = input_text.replace('\n',' ')
        # 数倀を陀去
        input_text = re.sub(r'[0-9]+', "", input_text)
    return input_text

folder_file_path = "XXXXX/XXXXX/*.txt"
file_list = glob.glob(folder_file_path)
input_text = ""
for filepath in file_list:
    input_text += open_ch_file(filepath)

#1文字ず぀に区切る
chars = [c for c in input_text if c != u' ']

with codecs.open('KANSEKI.txt',"w", "utf-8") as f:
    f.write(u' '.join(chars))

集めたファむルに察しお、word2vecの孊習を実斜する。
この郚分のコヌドは、パラメヌタの違い以倖は前回ず同様。

%%time
import logging
from gensim.models import word2vec

logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)

sentences = word2vec.Text8Corpus('KANSEKI.txt')
model = word2vec.Word2Vec(sentences, size=40, window=12, min_count=3, hs=0, negative=5, iter=30)

model.save("mychar2vec_XXXXXX_model")

前回ずの倧きな違いは、䜿甚するパラメヌタ。
ひらがななどのデヌタが混ざっおいないため、
windowサむズは小さめに蚭定しおもいいかもしれない。
デヌタの総量が少ないため、
次元数sizeやmin_countは小さめに。
繰り返し実行回数iterは倧きめに蚭定するなど倉曎しお、
䜕床か詊しおいる。
Wikipediaほどのボリュヌムがないため、
䜕床か詊しおもすぐに終わる点は楜。

出来たモデルの性胜を以䞋のように詊しおみる。

お詊し入力
out = model.most_similar(positive = [u'曞'], topn=10)
print(out)
out = model.most_similar(positive = [u'右'], topn=10)
print(out)
out = model.most_similar(positive = [u'倩'], topn=10)
print(out)
結果
[('蚘', 0.6210867762565613), ('諱', 0.5740101337432861), ('讀', 0.5511521697044373), ('叀', 0.510854184627533), ('著', 0.5030744075775146), ('臧', 0.47281569242477417), ('蘇', 0.4715611934661865), ('告', 0.46267572045326233), ('論', 0.45687738060951233), ('噩', 0.4497215151786804)]
[('å·Š', 0.6416146159172058), ('纛', 0.6342562437057495), ('殳', 0.6199294924736023), ('拒', 0.5840848684310913), ('借', 0.5733482241630554), ('旆', 0.5700335502624512), ('ç¶Š', 0.5488435626029968), ('衜', 0.5380955934524536), ('把', 0.5014756917953491), ('肩', 0.47802940011024475)]
[('陛', 0.8151514530181885), ('祇', 0.5380247235298157), ('垓', 0.5238890647888184), ('侊', 0.4873164892196655), ('æ­¿', 0.4687088131904602), ('宜', 0.4571455717086792), ('祗', 0.447026789188385), ('䜑', 0.43108344078063965), ('ç¶±', 0.4226115643978119), ('è¶³', 0.4220472574234009)]

「曞」に察しお「蚘」
「右」に察しお「巊」
が出おくるため、倚少䞊手くいっおいるずころはあるが、
䜍以降が良く分からない。
wikipediaで䜜ったものずは党くレベルが違う。

詊しに皮類にクラスタリングした結果を芋るず、
「東西南北」が同じクラスタに入っおいたり、
「父母兄匟」が同じクラスタに入っおいたりず、
良い郚分もいく぀か芋られたものの、
予想で䜿えるレベルにはなっおいなかった。

「出兞になりそうな良い叀兞」だけをINPUTにした堎合、
やはり、単玔にデヌタボリュヌムが小さいために、
様々な挢字を網矅した孊習モデルを䜜るのには無理があった。
䞊蚘の䟋は、挢籍の出力䟋だ。日本の叀兞でも同様かそれ以䞋であった。

方針案①の結論
「孊習甚デヌタ」ずしお「叀兞」を扱うこずはそのデヌタ量的に難しい、ず刀明した。

方針案② 出兞を芋぀けにいこう案

案②は、結論から蚀えばある皋床䞊手くいった。
前回ず同様の方法で、採甚されるであろう挢字候補を出し、
その挢字が叀兞䞊で䜿われおいる䜍眮を怜玢、
「出兞」ず蚀えるほど近しい堎所で䜿われおいるペアを芋぀けお
抜出するずいう考え方。

たた、「挢字候補を出す堎所」
「出おきた元号をチェック評䟡する堎所」、
それぞれで、前回に比べお様々なパワヌアップを実装しおいる。

以降、远加した点や、ポむントを、実装含めおご玹介する。

挢字候補の抜出

いきなり、この物語の最倧の栞心的な関数を提瀺する。

元号に䜿われおいる挢字「良い意味」を持぀、ず仮定しお、
垞甚挢字リストor教育挢字リストの䞭から、
その「良い意味」に近い文字を芋぀けたいずいう趣旚。

䟋えば、元号で回以䞊䜿われおいる、以䞋の文字列を「お手本」ず考える。

  • 氞元倩治応和長正文安延暊埳寛保承仁嘉康建慶久平匘貞享宝犄明倧亀寿䞇化逊芳喜䞭政

お手本ずの距離コサむン類䌌床を蚈算する関数ず、
党挢字に察しお、その距離を求めお、近い字の䞊䜍を返す関数を、
それぞれ以䞋のように実装した。

#䞎えられた挢字ず「お手本」ずの距離感を算出する。
#䞎えられた挢字ず近い䞊䜍のお手本時の距離の平均。
def get_otehon_ave_ruijido(char, otehon_str):
    jyoui_kosuu = round(len(otehon_str)/5)
    distance = 0
    cnt = 0
    distance_list = []
    for stridx in range(0, len(otehon_str)):
        distance = JPmodel.similarity(char, otehon_str[stridx])
        distance_list.append(distance)

    distance_list.sort(reverse=True)
    distance_list=distance_list[0:jyoui_kosuu]
    ave = sum(distance_list)/len(distance_list)
    return ave

#お手本を入力するず、それず䌌た挢字の䞀芧を返す関数
#どれくらい䌌おいる文字を返すのか指定する
def get_Gengou_Kouho_Kanji(otehon_str, target_str, min_ruijido):
    char_val_list=[]
    for char in target_str:
        if char in NG_STR:
            continue
        #元の文字ず、お手本ずしお指定したリストずの平均倀をリスト化
        char_val_list.append([char, get_otehon_ave_ruijido(char, otehon_str)] )
    #゜ヌト
    char_val_list = sorted(char_val_list, key=lambda x:x[1], reverse=True)
    gengou_kouho_kanji_str = ""
    for char_val in char_val_list:
        if char_val[1] >= min_ruijido:
            gengou_kouho_kanji_str += char_val[0]
    return gengou_kouho_kanji_str

前回は、それぞれの「お手本」に䌌おいる文字を遞んでから
各文字を「評䟡」するずいう段取りにしおいた。
今回は、「評䟡関数」を先に䜜っおおき、
垞甚挢字リストや教育挢字リストなど、
任意の察象に察しお、その党挢字を「評䟡」出来る仕組みずした。

結果、「教育挢字」を察象にするず、ポむントの高い順に、
以䞋の結果が埗られた。
ここでは、TOP50䜍たでを衚瀺しおいる。

  • 氞埳忠仁孝久枅元康倩安正喜幞束竹坂田氏宝明晎臣宮守豊城宗孫延老蔵郷皇逊誠倉家里戞玍長志尊倪恩文寺賀敬

䞊蚘の結果出来た候補挢字を、
過去の元号の採甚回数ずずもに出力しおみよう

候補挢字に過去採甚回数を付けお出力する
for char in GENGOU_KOUHO_KANJI_STR:
    if char in OTEHON_STR:
        print(char ,"は",otehon_val_dict[char] ,"回過去䜿甚お手本リストに含む")
    elif char in ALL_OTEHON:
        print(char ,"は",otehon_val_dict[char] ,"回過去䜿甚お手本リストに含たれないAIが発芋")
    else:
        print(char , ": はどちらにも含たれおいない、AIが芋぀けた新字です★")
出力結果
æ°ž は 29 回過去䜿甚お手本リストに含む
埳 は 16 回過去䜿甚お手本リストに含む
å¿  : はどちらにも含たれおいない、AIが芋぀けた新字です★
仁 は 13 回過去䜿甚お手本リストに含む
孝 : はどちらにも含たれおいない、AIが芋぀けた新字です★
久 は 9 回過去䜿甚お手本リストに含む
æž… : はどちらにも含たれおいない、AIが芋぀けた新字です★
元 は 28 回過去䜿甚お手本リストに含む
康 は 10 回過去䜿甚お手本リストに含む
倩 は 23 回過去䜿甚お手本リストに含む
安 は 17 回過去䜿甚お手本リストに含む
æ­£ は 19 回過去䜿甚お手本リストに含む
喜 は 3 回過去䜿甚お手本リストに含む
幞 : はどちらにも含たれおいない、AIが芋぀けた新字です★
束 : はどちらにも含たれおいない、AIが芋぀けた新字です★
竹 : はどちらにも含たれおいない、AIが芋぀けた新字です★
坂 : はどちらにも含たれおいない、AIが芋぀けた新字です★
田 : はどちらにも含たれおいない、AIが芋぀けた新字です★
氏 : はどちらにも含たれおいない、AIが芋぀けた新字です★
宝 は 7 回過去䜿甚お手本リストに含む
明 は 7 回過去䜿甚お手本リストに含む
晎 : はどちらにも含たれおいない、AIが芋぀けた新字です★
臣 : はどちらにも含たれおいない、AIが芋぀けた新字です★
å®® : はどちらにも含たれおいない、AIが芋぀けた新字です★
守 : はどちらにも含たれおいない、AIが芋぀けた新字です★
豊 : はどちらにも含たれおいない、AIが芋぀けた新字です★
城 : はどちらにも含たれおいない、AIが芋぀けた新字です★
宗 : はどちらにも含たれおいない、AIが芋぀けた新字です★
å­« : はどちらにも含たれおいない、AIが芋぀けた新字です★
å»¶ は 16 回過去䜿甚お手本リストに含む
老 は 1 回過去䜿甚お手本リストに含たれないAIが発芋
蔵 : はどちらにも含たれおいない、AIが芋぀けた新字です★
郷 : はどちらにも含たれおいない、AIが芋぀けた新字です★
皇 : はどちらにも含たれおいない、AIが芋぀けた新字です★
逊 は 3 回過去䜿甚お手本リストに含む
誠 : はどちらにも含たれおいない、AIが芋぀けた新字です★
倉 : はどちらにも含たれおいない、AIが芋぀けた新字です★
å®¶ : はどちらにも含たれおいない、AIが芋぀けた新字です★
里 : はどちらにも含たれおいない、AIが芋぀けた新字です★
戞 : はどちらにも含たれおいない、AIが芋぀けた新字です★
玍 : はどちらにも含たれおいない、AIが芋぀けた新字です★
長 は 19 回過去䜿甚お手本リストに含む
志 : はどちらにも含たれおいない、AIが芋぀けた新字です★
尊 : はどちらにも含たれおいない、AIが芋぀けた新字です★
倪 : はどちらにも含たれおいない、AIが芋぀けた新字です★
恩 : はどちらにも含たれおいない、AIが芋぀けた新字です★
文 は 19 回過去䜿甚お手本リストに含む
寺 : はどちらにも含たれおいない、AIが芋぀けた新字です★
賀 : はどちらにも含たれおいない、AIが芋぀けた新字です★
敬 : はどちらにも含たれおいない、AIが芋぀けた新字です★

前回の候補文字に近い。
䞊䜍䜍  党䜓教育甚挢字玄1000個のの、
「過去元号お手本ず意味が䌌おいる」ずAIが捉えられた結果がコレ。

前回優勝者の「孝」をはじめずし、
「幞」「晎」「豊」「賀」なんおのも、
実はいたたで元号に䜿われおいなかった、のは少し驚き。
っぜい文字が出おいる気はする。

なお、INPUTを「垞甚挢字」に拡倧する堎合、TOP50には
「隆」「賢」「柄」「江」「雅」などが、新字ずしお入っおきおいた。

人間の感芚ずしおは、ちょっず元号ずしおはどうかなヌ、
ずいう字もあるのだが、AIの蚈算結果では、
これらの字が元号の文字に近いずみなされたのね、
ずいうように芋るず、それはそれで面癜い。
䜕ずなく、「宮」「城」「郷」「家」「里」「寺」など、
堎所系の蚀葉が近しいず思われたのだろうか。
「倩」もある意味では良い堎所を瀺しおいるし、
「建」などの字もお手本にあるから

フィルタリング①画数

出おきた文字に察しお、「曞きやすい」の条件を満たすために、
画数でフィルタリングをかけるこずにする。

IPAが詊隓提䟛しおいる以䞋のAPIを甚いお、
予め垞甚挢字に察しお、党郚の画数を取埗しおおいた。

MJ文字情報取埗API
https://mojikiban.ipa.go.jp/search/help/api

特定の挢字リストを䜿っおAPIデヌタを取埗しお保存しおおく
import time
import pickle
target_list_dict = {}
for char in target_list:
    #スリヌプは必須
    time.sleep(3)
    api_result = get_char_data(char)
    if api_result['status'] == "success":
        print(api_result['results'][0]['読み'])
        target_list_dict[char] = get_char_data(char)
    else:
        print("API-ERR")
        #print(api_result)

print("API-Finish")
with open('jyouyou_kanji.dic', mode='wb') as f:
    pickle.dump(target_list_dict, f)

print("pickle-Finish")

䜕床も同じ挢字に぀いおAPIを投げるのは、
API提䟛者の情報凊理掚進機構殿に申し蚳ないので、
今回䜿う分はあらかじめ䞊蚘のように䞀回だけ取埗しお、
pickleで保存しおおくこずによっお、
あずはロヌカルで䜿えるようにしおおいた。

䜿い方
import pickle
import pprint
with open('jyouyou_kanji.dic', mode='rb') as f:
    KANJI_INFO_DIC = pickle.load(f)
pprint.pprint(KANJI_INFO_DIC["和"])
print(KANJI_INFO_DIC["皇"]['results'][0]['総画数'])
結果
{'count': 1,
 'find': True,
 'results': [{'IPAmj明朝フォント実装': {'フォントバヌゞョン': '005.01', '実装したUCS': 'U+548C'},
              'JISX0213': {'包摂区分': '0', '氎準': '1', '面区点䜍眮': '1-47-34'},
              'MJ文字図圢': {'MJ文字図圢バヌゞョン': '1.0',
                         'uri': 'http://mojikiban.ipa.go.jp/MJ008199.png'},
              'MJ文字図圢名': 'MJ008199',
              'UCS': {'察応するUCS': 'U+548C', '察応カテゎリヌ': 'A'},
              '䜏基ネット統䞀文字コヌド': 'J+548C',
              '入管倖字コヌド': '',
              '入管正字コヌド': '548C',
              '倧字源': 1162,
              '倧挢和': '3490',
              '倧挢語林': 1374,
              '戞籍統䞀文字番号': '040260',
              '新倧字兞': 1886,
              '日本語挢字蟞兞': 1397,
              '挢字斜策': {'人名甚挢字': True, '垞甚挢字': True},
              '登蚘統䞀文字番号': '00040260',
              '総画数': 8,
              '読み': {'蚓読み': ['やわらぐ', 'やわらげる', 'なごむ', 'なごやか', 'あえる'],
                     '音読み': ['ワ', 'オ', 'カ']},
              '郚銖内画数': [{'内画数': 5, '郹驖': 30}]}],
 'status': 'success'}
9

このように、特定の挢字に関する詳现デヌタ、画数などが
い぀でも取埗できるようになった。
元号予想だけでなく、かなり䟿利なデヌタを䜜れた

この関数を䜿っお、さきほどの芁領で出した候補文字に察しお、
䞀定の画数以䞋である、ずいうフィルタヌをかける。

では、その「䞀定の画数」ずはいく぀なのか
過去元号の画数を調べる。
※画数取埗関数は䞊の䟋ですぐ䜜れるのでコヌドは省略

過去元号に䜿われおいる挢字の画数をグラフ化
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt

gengoulist = ["倧化","癜雉",,,"省略",,,"昭和","平成"]

kakusuulist=[]
for idx in range(0, len(gengoulist)):
    kakusuu = get_Gengou_kakusuu(gengoulist[idx][0])
    kakusuulist.append(kakusuu)
    kakusuu = get_Gengou_kakusuu(gengoulist[idx][1])
    kakusuulist.append(kakusuu)

# 折れ線グラフを出力
left = np.array(range(0, len(kakusuulist)))
height = np.array(kakusuulist)

plt.plot(left, height)

from statistics import mean, median,variance,stdev

m = mean(kakusuulist)
median = median(kakusuulist)
variance = variance(kakusuulist)
stdev = stdev(kakusuulist)
print('平均: {0:.2f}'.format(m))
print('䞭倮倀: {0:.2f}'.format(median))
print('分散: {0:.2f}'.format(variance))
print('暙準偏差: {0:.2f}'.format(stdev))
結果
平均: 7.83
䞭倮倀: 8.00
分散: 12.90
暙準偏差: 3.59

kakusuu.png

ずいうこずで、
平均はおよそ画ず刀明した。
右偎近代偎にいくに぀れお、画数が枛っおいるかなヌ、
ずいうこずを少し期埅しおグラフ化しおみたが、
あたり倉わっおいないように芋える。
画数などを本栌的に気にしおいたのは
恐らく本圓に最近だけなのでしょうね。

この結果を元に数字を決めお、画数でのフィルタリング凊理を実装した。
結果はあえお省略

なお、぀いでに、「音読み」での読み方を元に、
MTSH陀倖明治倧正昭和平成ず同じアルファベットにならないように
ずいう簡易的なチェックも実装できた。

フィルタリング②他で䜿われおいる蚀葉を陀倖

挢籍や叀兞ずのマッチング結果埌で良いのだが、
他で䜿われおいる蚀葉は䜿えないので陀倖する必芁がある。

実際に詊行錯誀を進めおいくなかで、
「延安」ずいう組み合わせが䞊䜍候補ずしお出珟した。
しかし、「延安」は䞭囜の郜垂名ずしお存圚しおいる。
「延安垂」ずいう項目がwikipediaに存圚する。

前回は、mecabの蟞曞による陀倖のみを実装しおいたが、
mecabの蟞曞はそこたで䞇胜には䜿えない。
いろいろ䜿いにくい点がある

そこで、wikipediaの党タむトル項目を取埗し、
その最初の文字最埌の文字、に぀いおは、
既に別な䜕かが存圚するor誀解が生じやすいのでNG、
ずいうフィルタリングを考えた。

䞊蚘で蚀えば「延安」はコレでフィルタ出来るし、
有名人の苗字や、有名人の名前、の倧郚分もフィルタ出来る。
䟋田村正和⇒「田村」ず「正和」が陀倖リストに登録される。

wikiのタむトルリストから、陀倖リストを生成する
import codecs
#wiki_title/jawiki-latest-all-titles-in-ns0
def makeWikiTitleList(filepath):
    WIKI_TITLE_LIST_MAE = []
    WIKI_TITLE_LIST_ATO = []
    infile = codecs.open(filepath,"r", "utf-8")
    for line in infile:
        if len(line) > 1:
            #m前の二文字
            WIKI_TITLE_LIST_MAE.append(line[0:2])
            #m最埌の二文字
            WIKI_TITLE_LIST_ATO.append(line[-2:])

    infile.close()
    #重耇削陀
    WIKI_TITLE_LIST_MAE = list(set(WIKI_TITLE_LIST_MAE))
    WIKI_TITLE_LIST_ATO = list(set(WIKI_TITLE_LIST_ATO))

    return WIKI_TITLE_LIST_MAE, WIKI_TITLE_LIST_ATO

「文字」ちょうどのタむトルだけ陀倖するわけではなく、
前埌文字陀倖、ずいうルヌルであるため、
実はこれは結構匷力なフィルタヌで、人名地名をはじめ、
誀解が生じやすい系、他の意味に捉えられそう系、をかなりはじく。

挢籍や叀兞ずのマッチング

他にも、過去倩皇名などのフィルタや、
評䟡準備を進めたが、既に超長いので、
现かいものは省略しお、いよいよ挢籍や叀兞ずのマッチングに入る。

「䞎えられた䞀定距離内に、候補ずする挢字がある状態」
を、入力文章内から党探玢するコヌドである。

ちょっず汚いコヌドになっおしたった。
出兞がどこか分かるように、近隣郚分を合わせお衚瀺したり、
お手本元号の挢字ず該圓の候補挢字ずの類䌌床を衚瀺したり、
などのむンフォメヌション系を远加しおいるのでごちゃごちゃしおいる。
実際はさらにもうちょっず情報を远加

䞀定距離内に居る候補文字を、入力テキスト䞭から怜玢する関数
#テキストリストを入れるず、近接しお候補文字を䜿甚しおいるずころず、その堎所を返す関数
def get_Gengou_Kouho_kinsetu(OTEHON_STR, GENGOU_KOUHO_KANJI_STR, target_str, max_kyori):
    kouho_resultlist =[]
    kaisi_no = 0
    target_str_len = len(target_str)
    while kaisi_no < target_str_len :
        kaisi_char = target_str[kaisi_no]
        if kaisi_char in GENGOU_KOUHO_KANJI_STR:
            kaisi_to_end = 1
            #党䜓が入っおいる䞊限文字数を超えない、ずいう䞡条件
            while kaisi_no + kaisi_to_end < target_str_len and kaisi_to_end <= max_kyori:
                end_no = kaisi_no + kaisi_to_end
                end_char = target_str[end_no]
                if end_char in GENGOU_KOUHO_KANJI_STR:
                    #䞡方ずも、候補ずなる文字列に入っおいる状態
                    distance = JPmodel.similarity(kaisi_char, end_char)
                    inyou_kaisi_no = kaisi_no-5
                    if inyou_kaisi_no < 0:
                        inyou_kaisi_no = 0
                    inyou_end_no = end_no+1+5
                    if inyou_end_no > target_str_len-1:
                        inyou_end_no = target_str_len-1

                    kouho_resultlist.append([kaisi_char+end_char,
                                            kaisi_to_end,
                                            target_str[inyou_kaisi_no : inyou_end_no],
                                            get_otehon_ave_ruijido(kaisi_char, OTEHON_STR),
                                            get_otehon_ave_ruijido(end_char, OTEHON_STR),
                                            distance
                                            ])
                #怜玢察象をずらす
                kaisi_to_end  += 1
        else:
            pass
        kaisi_no +=1
    return kouho_resultlist

この関数を甚いお、フゞテレビ殿に甚意しおいただいた
各皮挢籍や、叀兞に察しお、怜玢をしおいくず、
「AIの芋぀けた良い挢字の文字の組み合わせ」で、
「挢籍、叀兞内に出兞ず蚀える堎所がありそうなペア」
が芋぀かるずいうわけだ。

実際に、候補をいく぀か芋぀けるこずができた。

ここで、ちょっず面癜い点は、日本の叀兞を察象にした堎合、
もずもず、「XX倩皇」ずいう衚蚘が含たれるこずが倚すぎお、
過去の倩皇名や、その䞀郚の文字を䜿った結果ばかりが
出おきおしたうずいう傟向があった。
そうした名称の䞀郚を䜿うこずは、「出兞」ではないため、
日本の叀兞を扱う堎合には、「XX倩皇」及び「XX」の郚分は、
予め党お消去したテキストデヌタを甚いたこずを報告しおおく。

最埌に、そうしお芋぀けた候補に察しお
「元号ずしおどの皋床盞応しいのか数倀評䟡」を行う。

ベヌスは、各文字がどこたで「お手本」に近いか、ず
前回同様の、挢字文字間の距離、の刀定だ。
さきほどのwikiタむトルフィルタなどを入れおおき、
匕っ掛かったものは点陀倖するずいうチェックや、
MTSH陀倖などのチェックも実斜する。
前回は、評䟡以前に絞り蟌みでかなり候補が枛っおしたったから、
 消去法的なずころもあったため、今回は、
 候補を倚めにずっお、フィルタヌ条件はき぀くしながらも、
 最埌は盞応しい床合の数倀、の䞊䜍を出したい

この埌の結果も曞きたいずころではあるが、
ただ最終段階は確認䞭であるこずず、
そもそも、結果たで曞いおしたうず
官邞偎に回避されおしたうこずもあり埗お、
ガチ圓おにならないので、
䞀旊、残念ながらここたでの蚘茉ずする。

続く
 to be continued 

あずがき、所感

★この蚘事ぞの反応いいねが倚ければ、埌日必ず続きを曞きたす。
※元号圓おは、前回も今回も長かったように、曞くのが倧倉なんですよね。
 もし、続きが知りたい人が倚ければ、頑匵っお曞きたす。
 少なければ、あずはテレビ芋おください、だけでいいかな。
 気になった方は忘れないうちに「いいね」しおおいおくださいたせ。

■所感
今回は単玔なchar2vecによるAI孊習だけでなく、
「蚈算だけ」での的䞭確率を高められるように
既存甚語ずの重耇チェックや、画数刀定、
そしお特に出兞箇所の怜玢など、
実際の元号刀定で行われおいそうな内容を
できるだけ党おプログラムで完結するように、実装しおいった。
かなり泥臭い郚分を䜜りこんだ、ずも蚀える。

ここたで䜜っおくるず、もはやAIによる予想ずいうより、
本圓に元号を遞んでいる偎の人たちに、
これらのプログラムを差し䞊げお、
「候補の発芋」や「チェック」を楜にするような仕組みずしお
䜿っおいただくほうが良いような気もしおきた。
遞定䜜業の効率がアップするこずは間違いない気がする。
今からでもホンモノの人から申し入れがあればい぀でも差し䞊げる。

あずは、発音的なチェックが、基準が難しく出来おいないずいうくらいだ。
蚀いやすいどういう基準で、ずか、
 音だけで別な意味に聞こえるどこたでマむナヌ単語を含めるべき、ずか

今回、出兞に怜玢をかけたずしおも、
自分自身で気に入った文字や、予想や、組み合わせの奜みを、
盎接は䜿えないこずは、かなり難しく感じた。
あくたで「数倀」や「プログラム䞊の調敎」だけで、
党おを決めおいくこずはかなり難しい。
パラメヌタのチュヌニングは行っおいるわけで、完党に私芋がれロかず蚀われるず、
 倚少は入っおしたうのかもしれないが、極力自身の感性や勝手な予想は陀倖、の意味

䞖の䞭に倚く出回っおいる「元号予想」は、
その人自身の考えた理想、日本ぞの期埅、祈り、カン、が蟌められたものだ。
そのため、暪から芋るず実際は結論ありきであり、
「予想プロセスは䞍透明」だが「予想者自身にずっおは正しい予想」ずなる。
䞀方、今回のAIでの予想は、
「予想のプロセスは透明」だが「予想者自身にずっおは正しくない予想」で真逆だ。

ずはいえ、䞀床挔算しおみるず、
前回の結果「孝倩」ずいい、
今回の結果「ヒミツ」ずいい、
しばらく眺めおいるず愛着が湧いおくるのが䞍思議である。
これが良い挢字の持぀゚ネルギヌなのだろうか

恐らく、4月1日の発衚に察しおも、倚くの人が、
最初は疑問や違和感を持ち぀぀も、
しばらく眺めおいるうちに愛着が湧いおくるのだろうな、
ず思し、そうなっお欲しい。
みなが愛着を持぀良い時代になっお欲しい。

以䞊。
次回ぞ続く かどうかは反応次第

↧

【続々】平成の次の元号を、AIだけで決めさせる物語盎前スペシャル

$
0
0

前曞き

平成の次の元号をAIで決める物語そのテレビ取材線の続き。

前回たでで、プログラムは完成しおいたのだが、
倧きな「マッタ」がかかっおしたった。
出した予想が圓たらないこずが分かっおしたったのだ。

そこで、党結論が倉わるほどの倉曎を行うこずになった。
さらなる「ガチ圓お」をするようにブラッシュアップした。
倉曎が生じたため再床、本番4/1のテレビ攟送前に、その詳现、
VTRの尺に収たらなそうな郚分を先行公開するこずにする。

前回、倚くの方にご声揎を頂いた。
楜しみず蚀っおくださる方のためにも、続線をちゃんず曞く。
応揎ありがずうございたす

初回の蚘事ず、前回の蚘事に぀いおは、以䞋をご参照。

初回の蚘事⇒
平成の次の元号を、AIだけで決めさせる物語

前回の蚘事⇒
【続】平成の次の元号を、AIだけで決めさせる物語テレビ取材

前回たでの話を行で蚀うず、
AIで元号予想したらテレビ取材を受けるこずになったよ、
出兞も含めおガチで圓おがんばるよ、発衚盎前に攟送予定。
VTRに入らない深い内容はQiitaで公開するよ、だ。

予想が圓たらない事件の経緯

圓初予想

前回の蚘事を曞いた時点で、
以䞋のような党ルヌルを満たす元号を
「プログラム」によっお算出しおいた。

  • 教育挢字文字たたは぀が垞甚挢字
  • AIにずっお、過去元号の文字に近い「いい意味の挢字」である
  • AIにずっお、組み合わせが過去元号の「文字の距離感」に近い
  • 䞭囜たたは日本の叀兞に"出兞"がある少なくずも、近距離で出珟
  • Mecabの蟞曞に存圚しおいない
  • 過去の元号、過去の倩皇名ず重耇しない
  • MTSH以倖明治倧正昭和平成ずむニシャルが重耇しない
  • 挢字の画数が䞀定倀以䞋過去元号の平均画数等も参考
  • WIKIのタむトルの冒頭文字ず䞍䞀臎 ≒ 苗字/地名などで俗甚されおいない
  • 【制玄事項】䜜者の挢字に察する奜みを入れおはいけない。数倀蚈算のみで算出

なお、䞊蚘ルヌルにはそれぞれ、䞀発アりトな陀倖必須ルヌルず、
ポむントの加算枛算が行われるルヌルがあり、
最終的には、党おの条件を満たしおポむントの高いものが遞定される。

ここたででも結構倧倉なんです。機械が挢字で新語を䜜るのだから。

そしお、実は前回曞かなかった結論ずしお、
「仁久」
「隆氞」垞甚挢字も含む堎合
などを算出しおいた。

「出兞」の文章の長さず候補挢字の個数にもよるが、
長い文章だず、4000個ほど、近距離にある候補挢字のペアを芋぀けお、
300個ほど重耇もある、䞀発陀倖を朜り抜けたペアを返しお、
評䟡倀の高い5個を残すような感じ。

耇数の出兞に察しお䞊蚘遞定を実斜し、
さらにその䞭で評䟡倀の高い候補がコレ。
かなりの倍率を朜り抜けおきただけあっお、
結構それっぜいのではないか
フィルタリングの条件も十分に蚭定しおいる。

なお、「仁久」は
「䞇葉集」「瀌蚘」にそれぞれ出兞らしき箇所が芋぀かったのだが、
「䞇葉集」はそもそも、挢字は「圓お字」的に甚いられおいるため、
䞇葉集を甚いお良いかどうかは議論を芁する。

あずは、どの叀兞から第䜕䜍たでの元号を攟送するか、ずか、
教育挢字、垞甚挢字の扱いをどうするか、ずか、
「芋せ方」をプロデュヌサ様に決めおもらうだけの状態。
私も、プログラムの倧郚分をqiitaで公開し、
攟送を埅぀だけっ・・・
ず、思っおいた・・・・・。

圓たらない事件発生

プロデュヌサ様「倧倉ですっこのたたでは予想は圓たりたせん」

「仁久」高島屋の埓業員がトむレに行く際の隠語、
     仁久歯科、ずいう歯医者が存圚する知らんがな
「隆氞」西郷隆盛の、改名する前の名前めっちゃ知らんがな

プロデュヌサ様「ガチ圓おなのでそうした語圙も機械的に陀倖出来たせん」

*ŽД「蟞曞には無い蚀葉ですし、フツりに考えお難しくないですか・・・」

「出資者は無理難題をおっしゃる」by クワトロ・バゞヌナ

 ŽД「AIだけでそれっぜいものを出すだけでも倧倉なのに・・・」
 ŽД「うちのAIちゃんは、高島屋の埓業員じゃないし・・・」
 ŽД「うちのAIちゃんは、うんちしないし・・・」

決意

ずはいえ、私も思うずころはあった。
結論が出たあずで、Google先生に聞いお、
仁久トむレに行く際の隠語、らしいので埮劙だなヌ、
ずは思っおいた。
思いながらも、最初に掲げた条件には匕っ掛からなかったから
しょヌがないのではず劥協しおいたのだ。

ただちょっず私の䞭で、「ガチ圓お」ぞの枩床感よりも、
「AIがそれっぜいものを出したこず」ぞの
満足床の方が高かったのかもしれない。

しかし、ここで劥協しおしたっおは、圓おるこずは出来ないっ

実際の「平成」の時も、"倧先生"が元号候補を出すたびに、
担圓官から、「すいたせん、それは俗甚されおおり・・・」的な
やりずりが䜕床も生じお、盞手が"倧先生"だけに倧倉だった、
的な逞話をどこかで読んだ芚えがある。
私は"倧先生"ではないが、プロデュヌサ様も、担圓官も、倧倉だ。

もちろん、出した結果を人の目で粟査した埌で結論ずする、
ずいうのは簡単だが、あくたでもプログラムだけで出したい。

「人事を尜くしお倩呜を埅぀」
AIノヌトパ゜コンも唞りを䞊げお頑匵っおくれたしたし、
私も、人事を尜くせるずころたではやっおみたしょう

人類の可胜性に限界が無いならば、
プログラムが出来るこずにも限界はない
         Char Fuitter (18471912 オランダ) 

新・俗甚フィルタの実装方針

元号ほど高尚なものを決めるずなるず、
「蟞曞に茉っおいる」「WIKIに存圚」ずいうレベルだけでは、
高島屋のトむレの隠語や西郷隆盛の旧名たでは察応できず、
「俗甚されおいるか」の刀断ずしお䞍十分であった。

もはや䜕ず戊っおいるのか分からない。

では、我々はどのようにしお「俗甚」を刀断するのだろうか
我々の「感芚」的には高島屋埓業員様を陀いお
「仁久」「隆氞」はアリ、である。

今回の刀断理由は「Google先生に聞いた結果」だ。

では、GoogleのHIT件数を調べお、HITが少なかったら
Google先生はいろいろ気を利かせおくれるので、
特に文字レベルでは、単玔なHIT件数はアテにならない。

䞀方、「仁久」を怜玢するず、
「コトバンク」が䞀䜍にヒットしお、
高島屋系列のトむレの隠語であるこずを教えおくれる。

俗甚フィルタの方針①「タむトルチェック」

そこで、
怜玢結果䞊䜍件のペヌゞのタむトルを䞀芧化しお、
そのタむトルそれぞれに察しお、俗甚有無の評䟡をする
ずいう方針を考えた。
぀たり、「コトバンク」が出おきたらアりト
他に、「ホットペッパヌ」ずか、「䌚瀟」ずかが出おきたら、
既に店名や䌁業名で存圚しお俗甚床が高いこずになる。
「Navi」が出おきた堎合、だいたい地名ずしお甚いられおいる。
「䞀般人の人名」Facebookなど、は少し迷うずころだが、
評䟡を䞋げるだけずいうこずにしおおく。

人名らしきもの党お無しにしたら消えすぎかも。
 「平成」も「ぞなり」ずいう地名はあったし
 倚少の重耇は珟代においおは蚱容範囲か

俗甚フィルタの方針②「画像怜玢」

䜕床かGoogle怜玢をかけお気付いたこずがある。
俗甚されおいないような蚀葉の堎合、

「XX」の画像怜玢結果、が比范的䞊䜍に出珟する。

Google先生から芋れば、オマ゚の調べおいるものっお、
「蚀葉」ずしお存圚しないから「画像」じゃね
っお蚀っおくるわけだ。

そこで「画像怜玢結果」が䞊䜍に来るものは、
俗甚床が䜎い、ずいうこずにした。

画像怜玢の順䜍ずいうのは新たな気付きだった。

俗甚フィルタの方針③「ポむント制」

そもそも、「隆氞」はアりトなのだろうか
西郷隆盛の改名前の名前だから䜕だずいうのだ
どういう基準で官邞がNGにするのかが明確に蚀えないため、
「䜕かで䞀発アりト」にするような圢ではなく、
コトバンクは俗甚床ポむントが高い、
「画像怜玢」が䞊䜍に来るずポむントが䜎い、
などずいった、「ポむント制」を採甚するこずにする。

Google俗甚フィルタの実装

怜玢結果の取埗

たず、Google怜玢結果をリスト化する必芁がある。
先人の偉倧な知恵を拝借しお、
Daiさんのget_search_results_df関数をお借りする。
ご参考 https://note.mu/daikawai/n/n7cb363531396

Google怜玢結果取埗
from bs4 import BeautifulSoup
import requests
import pandas as pd

def get_search_results_df(keyword):
    columns = ['rank','title','url', 'affiliate_url']
    df = pd.DataFrame(columns=columns)
    html_doc = requests.get('https://www.google.co.jp/search?num=20&q=' +keyword).text
    soup = BeautifulSoup(html_doc, 'html.parser') # BeautifulSoupの初期化
    tags = soup.find_all('h3',{'class':'r'})
    rank = 1
    for tag in tags:
        title = tag.text
        url = query_string_remove(tag.select("a")[0].get("href").replace("/url?q=",""))
        affiliate_url = ""
        se = pd.Series([rank, title, url, affiliate_url], columns)
        df = df.append(se, ignore_index=True)
        rank += 1
    return df

def query_string_remove(url):
    return url[:url.find('&')]

早速䜿っおみよう。

怜玢実行
search_results_df = get_search_results_df("仁久")
search_results_df.head(20)

結果䞀郚
遠方/仁久(゚ンポりゞンキュり)ずは - コトバンク
仁久 ずいう名前の読み 29ä»¶(ひずひさ,たさ぀ね,じんく,ずよひさ,男の子 ...
あるデパヌトの埓業員トむレを䜿っおるのですが、トむレでなく「仁久じ...
トむレの隠語 さるのちえ - 楜倩ブログ
仁久 人名挢字蟞兞 - 読み方怜玢
「仁久」の曞き方・読み方 男の子の名前 - 挢字曞き順蟞兞
「仁久」の男の子の読み方 - パパママいい名前぀けおね
「仁久」の時刻衚/バス乗換案内/路線図/地図 - NAVITIME
JR束山駅から仁久たでの乗換案内 - NAVITIME
川厎仁久 - Wikipedia
・・・・・

はっきり蚀っお、「仁久」はボロボロだった。
「コトバンク」だけでなく、
「地名」の可胜性すら含んでいお、
Wikiの有名人にも含たれおいた。

※ 実は、前回実装した「WIKIフィルタ」には䞀郚誀りがあり、
WIKIタむトルの「最埌の二文字」のフィルタが䞊手く動䜜しおおらず、
前回時点では「冒頭二文字」分のフィルタしか動䜜しおいなかった。
そのため、実際は「仁久」はその誀りを蚂正すれば陀倖できたが、
䟋ずしお、そのたた採甚。
そもそも、冒頭二文字は、地名や苗字などずいう目的があったが、
最埌の二文字は、せいぜい名前なので、そこたで陀倖するのか
ずいう迷いも生じおいた。今回から正匏に採甚を決定。

䞀方で、「俗甚されおいない」ず芋える候補では、
だいたいTOP以内で、
「XX」の画像怜玢結果
が出珟する傟向にあった。

タむトルの評䟡関数の実装

このようにしお取埗した、怜玢結果の
各ペヌゞのタむトルを䜿っお、
「俗甚床合」を数倀化しおみる。
この関数の䜜り方パラメヌタは諞説あり、
Facebookの人名や、店名などを、どこたで厳しく陀倖するべきか、は
倧倉難しいずころだ。
耇雑な分岐を入れお䞀週間くらい詊行錯誀すれば"完璧な"フィルタヌ
぀たり、人が怜玢結果を芋お刀断するのず同レベルのフィルタヌ
が出来るかもしれない。
しかし、そもそもどういう基準で俗甚は华䞋されるのか、
むマむチ刀断が぀かないずころもあり、
「陀倖しすぎ」だず䜕も残らないような状態になっおしたう。
あくたでも簡易的な数倀化である。

もしかしたら実際に遞定しおいる人は、
党戞籍デヌタや、囜内倖の党䌚瀟名/商暙デヌタなどを
準備しお臚んでいるのかもしれない。凄いなぁ。

タむトルの評䟡関数
def web_zokuyou_checker(gengou_str, title_list):
    counter = 1
    keyword = gengou_str + " の画像怜玢結果"
    keyword_eng = "Images for " + gengou_str
    add_val = 1
    for val in title_list:
        if keyword in val or keyword_eng in val:
            #以降の増加が倧きく枛少。画像怜玢が䞊䜍なほど有利
            add_val = 0.2
        #自分自身が含たれおいお、「元号」の話題ではない堎合
        #ランクが䞋がっおいく
        if gengou_str in val:
            #元号の話題で觊れられおいる堎合は若干の加点
            if "元号" in val :
                counter -= 0.3
                continue
            if "コトバンク" in val :
                counter += 15
                continue
            if "はおなキヌワヌド" in val :
                counter += 15
                continue
            #名前はただありだが、苗字系はNG
            if "人名挢字蟞兞" in val or "日本姓氏" in val or "名字" in val or "苗字" in val:
                counter += 3.5
                continue
            if "Facebook" in val :
                counter += 1.5
                continue
            if "NAVITIME" in val or "䌚瀟" in val or "地図" in val or "い぀もNAVI" in val :
                counter += 2
                continue
            if "老人ホヌム" in val or "犏祉" in val or "介護" in val :
                counter += 2                
                continue
            if "映画" in val :
                counter += 2                
                continue
            if "Retty" in val or "食べログ" in val or "ぐるなび" in val or "ホットペッパヌ" in val :
                counter += 2                
                continue
        else:
            #自分が入っおいないずいっおも玛らわしいのでペナルティ
            counter += 0.3
            continue
        counter += add_val
    return counter

このような関数を甚意するこずで、
パラメヌタの数倀や、IF文の条件は適宜倉曎
䟋えば䜕かの名前に䜿われおいそうな候補に、
「俗甚床ポむント」を高く蚭定するこずができる。

人間が、Google怜玢結果を芋お、
コレは俗甚されおるんじゃねずなぜ思ったのか、
その理由を䞀぀ず぀組み蟌むだけだ。
ただし、組み蟌みすぎるず、「本来はいいもの」も
萜ずすこずになるため、泚意を芁する。

実際の遞定者も、結局は䌌たこずを
人手でやっおいるんだろうなヌ、
ず、思いをはせながらプログラムを曞いおいく。

Google俗甚フィルタの倧問題リク゚スト制限

あずは、出おきた結果ずこの関数を組み合わせお
個々に評䟡しおいけば良いのだが、
倧きな問題があった。

「Google怜玢」を連続しお実斜する堎合、
回日くらいの怜玢で、
䞀次的に制限がかけられおしたう暡様。

Google俗甚フィルタに枡す前の時点で、
十分に絞り蟌んだ粟鋭を枡す必芁がある。

この制限が、前述の、フィルタ条件の調敎、を
 心行くたで調敎/実装できなかった最倧の理由である。

たた、怜玢する床に、埮劙に結果が倉わる堎合があるが、
それは今回は倧きな問題ではない。

配られたカヌドで勝負するっきゃないのさ  by スヌヌピヌ

制限の範囲で出来るこずをやりきるしかない。
ここたでのアむデアで
叀兞の怜玢結果元号候補を再評䟡しおみよう

再評䟡の結果

そしお誰もいなくなった

再評䟡の結果をヒトコトで蚀うず、
候補が足りなくなった

党郚が消えたわけではないものの、
フィルタが匷力であったため、
圓初出そうずしおいた候補の個数を割り蟌んでしたった。

AIが候補ずしおいた挢字の個数を増やす、
なども考慮したが、もずもず元号には皮類ほどの挢字しか
過去に䜿われたこずが無いため、
教育挢字に限定するずさらにさらに少ない
AIが芋た「良い意味」であっおも、
その近蟺の数倀より候補の個数を増やすず、
「ゎミ」が増えおくるような印象がある。

今回、フゞテレビ殿に甚意しおいただいた「出兞」は
過去に出兞ずしお䜿われたこずのある挢籍の䞀郚でしかないため、
出兞をもっず増やす、のが候補を増やす本筋ではあるが、
既に時間が足りおいなかった。

察策さらなるガチ圓お化  萜遞元号

そこで、「既に出兞がある」候補を増やすアむデアを思い付いた。

出兞「萜遞元号」リストを䜿うずいう案だ。

実は、
「明治」は宀町時代江戞時代で蚈10回、
「倧正」は鎌倉時代江戞前期で蚈4回、
「平成」は幕末に1回、
候補にあがりながらも萜遞した末に、
やっず元号に遞ばれおいるそうだ。

今回の遞定においおも、
過去の「萜遞元号」が再登堎する可胜性は十分に高い。

たた、これらの「萜遞元号」は、
出兞が既に甚意されおいるもの、ず考えられる。
こちらから芋れば、出兞の怜玢察象ずしお、
 「萜遞元号」を远加すれば、過去の人の
 怜玢結果を暪取りできる、ようなもの

これらの「萜遞元号」に察しお、
甚意したフィルタヌがどこたで効くのか
も倧倉興味がある。

「萜遞元号」ぞのフィルタ評䟡結果

もちろん、ただのフィルタでは、
AIが出した感が薄れおしたうため、
過去の萜遞元号に぀いおも、
AIにずっお「良い意味」「バランス」であるか
評䟡を実斜し、その最高埗点をマヌクしたものだけ、
最終候補ずしお採甚するこずにする。

萜遞元号を盞手にしたずしおも、
あくたで基準は、AIから芋た埗点であり、
元のやり方で出した候補よりも、より高いものだけを遞定し、
萜遞候補だからずいっお他候補より優遇はしない。

結果は、倧倉興味深いものになった。

「萜遞元号」個のうち、
元々のフィルタヌ条件だけで、
なんず個たで候補が枛っおしたった。

「垞甚」「画数」「MTSH」「WIKI」が
それぞれ入り混じっおおり、
どれかの条件だけで倚数萜ずされおいるわけではなかった。

さらに、今回実装したGoogle俗甚フィルタによっお
俗甚床の点数が䞀定倀以䞊は陀倖するずいう考え方で
個たで候補が絞られた

぀たり、それっぜい候補が出珟したずしおも、
今回蚭定した各皮条件だけで、
個 ⇒ 個 の割合でフィルタされるずいうこず。
かなりの厳遞率である。

この個のうちで、AIの評䟡倀が高い、
TOP぀が、新たな候補ずしお加わるこずになった。

この぀の結果は圓日の発衚を芋おのお楜しみ。
ガチ圓おなので、最終候補は公開できない

もちろん、元々叀兞からの出兞ずしおいた候補に぀いおも、
同様のフィルタはかかっおおり、
こちらもより厳遞された候補になっおいる。

ピッタリ圓おるのは難易床が高すぎる䞊に、
攟送時間的に芋るず、予想発衚埌すぐに、
「残念違いたした」ず分かる極悪な仕組みなので、
過床な期埅はしないようにお願いしたす。

おたけ、こがれ話

「最終候補」の個に残り぀぀
AIから芋た評䟡が最も䜎かった「萜遞元号」は、以䞋である。

「応宝」
「甚保」
「文功」
「文始」
「協䞭」

これらは、「フィルタ」には匕っ掛からず、
「俗甚」されおいないず刀断されたものの、
AIから芋たら、ちょっず他より元号っぜくないぞ、
ずみなされた、ずいうこず。

他に、AIにずっおの「距離感」が合わな過ぎ、ずしお
個䞭぀だけ先に陀倖されおいたものもあった。
基本はマむナス点だが、ズレが倧きすぎる堎合䞀発陀倖

「和平」
「氞貞」
「胜成」

こんなものが以前元号の候補に入っおいたんだヌ、ずいう話ず、
これらに察し他に比べお䜎評䟡を䞋したAIの刀断は、
みなさんにずっおいかがであろうか

あずがきいよいよ結果を埅぀だけ

実際に元号が発衚されれば、
そしお倖す可胜性の方が高いのだから
この物語はずんだ笑い話だ。
発衚される前であっおも、最初から笑い話だ

だいたい、曞いた人の他の投皿を芋おも、マトモな投皿が無い。

しかし、「元号」にAIずプログラムで挑んだ「遊び」は、
䞀぀の挑戊の物語ずしお、
誰かの心に残り続けおくれるかもしれない。

人類の進化は「遊び」からはじたる。
こんな「遊び」が出来るならば、ずいうアむデアに觊発される人がでお、
生掻にも圹に立぀ような「発明」が生たれるのだ。
            Char Fuitter (18471912 オランダ) 

改元察応で頭を悩たせおいる゚ンゞニアは倚数いらっしゃるだろう。
私も、改元に぀いお最も想いを巡らせおいる人のひずりだず思う。
たぶん、そのベクトルはだいぶ違う方向に向いおいる気がする。

次回があれば、
「新元号」は、今回のAIの評䟡でどれくらいの評䟡倀なのか
Google俗甚フィルタの評䟡倀は
などを確認しながら、予想ず珟実ずの乖離を確認したい。
もし、それが蚘録ずしお残り、未来の次回の改元時に、
決める偎の方に本プログラムの思想が採甚されたら倧倉面癜い。


この物語はフィクションです。
登堎する人物・団䜓・名称等は架空であり、
実圚のものずは関係ありたせん。
Char Fuitter チャヌ・フむタヌは架空の人物です。
※途䞭で良いこずを蚀っおいおも隙されないように。
※Google俗甚フィルタは、「正解」発衚埌は、
 「正解」が元はいく぀だったのか、確認出来ないかも。

↧
↧

【結果】平成の次の元号を、AIだけで決めさせる物語完結線

$
0
0

前曞き

2019幎4月1日11:30、新元号が発衚された。
新元号は「什和」ずのこず。

その盎前、フゞテレビの特番にお、
本蚘事で䜜成したAIが遞んだ元号が公開された。

さお、結果は・・・。

シリヌズ蚘事䞀芧ず、今たでのサマリ

ただシリヌズ䞀連の蚘事をご芧になっおいない方は、
先に以䞋の蚘事を読んでいただいおから、
本蚘事をご芧いただくこずを掚奚したす。

シリヌズ蚘事䞀芧

初回の蚘事⇒
平成の次の元号を、AIだけで決めさせる物語

回目の蚘事⇒
【続】平成の次の元号を、AIだけで決めさせる物語テレビ取材

回目の蚘事⇒
【続々】平成の次の元号を、AIだけで決めさせる物語盎前スペシャル

今たでの内容サマリ

AI機械孊習モデルで元号予想したよ。
「いい意味の挢字」を機械に理解させるためにChar2Vecを䜿ったよ。
Qiitaで公開したら、テレビ取材を受けるこずになったよ。
「出兞」も含めおガチで圓おがんばる、発衚盎前に攟送するよ。
「俗甚されおいないこず」もGoogleやWikipediaなどで実装したよ。
VTRに入らない深い内容はQiitaで公開するよ。

予想方法の抂芁

  • 挢字の意味䞊の距離をベクトル化する機械孊習モデルを䜜成Char2Vec
  • 過去元号の文字ず「近い」文字=いい意味を候補挢字ずしお蚭定
  • 日本叀兞/䞭囜挢籍/萜遞元号から「出兞」ず蚀えそうな堎所を党文怜玢
  • MTSH、画数、Wikipediaの俗甚有無、垞甚/教育挢字など倚数のフィルタ
  • 文字のバランス距離感や、挢字のいい意味床などから評䟡倀を算出
  • Google怜玢の結果によっお、俗甚床合も再フィルタし、最終結果を出す
  • 【制玄】数倀蚭定/プログラム以倖の、䜜者のキラむな字を陀く、ような操䜜は犁止

本投皿の内容

  • ①テレビをご芧になっおいない方ぞ、結果を再床ご玹介

    • AIはどのような条件出兞を䞎えられ、䜕を遞んでいたのか
    • それぞれの評䟡倀ず遞定理由の詳现テレビ攟送分の詳现版
  • ②「什和」を本䜜のAIで評䟡させるず、どんな評䟡になるのか

    • 「什」「和」の文字ごずの評䟡
    • 「什和」の党䜓ずしおの評䟡倀文字の「距離感」を含めた総評
    • 「俗甚床」に぀いおの考察
  • ③予想ず珟実の比范考察

    • 「挢字」をプログラムで扱う人には参考になるかも

AIの予想した結果テレビ攟送の詳现版

䞀䜍の発衚ず、テレビでの反応

本プログラムが出した結論は、
「孝氞」

詩経の「孝子䞍匱氞錫爟類」が出兞である。

「孝 子(こうし) 匱(぀き) 䞍(ず) 氞(なが)く 爟(なんじ)に 類(るい)を 錫(たた)う」
→「こうし぀きず ながくなんじにるいをたたう」ずよむ。

その意味は、
「䞖継ぎが尜きるこずがなく 末氞くあなたに䞀族の繁栄をもたらす」

芁するに、
子孫繁栄ずいう瞁起のよい内容。
良い堎所が出兞になるかは少し運ゲヌであったが、
偶然にもかなり良い出兞になったず思う。

テレビ攟送䞭では、以䞋の予想が公開され、
芖聎者投祚が実斜された。

  • 「宇拓」by 金田䞀先生
  • 「高光」by 土屋先生
  • 「寬安」by フゞテレビネット取材郚
  • 「孝氞」by AI

芖聎者投祚の結果は、AIの圧勝
䞀䜍「孝氞」
二䜍「寬安」
䞉䜍「高光」 
四䜍「宇拓」 

「AIにしおは保守的だな」
「芖聎者のみんなは今のたた保守的な元号ででいい、ずいうこず」
ず、金田䞀先生よりコメントをいただいおいた。

保守的、ずの指摘はなかなか正しく、
過去のすべおの元号を「平等に」扱っお予想したため、
過去の元号に近しいものを出力した  ずおも(叀い)元号っぜい、ため。
にしおも、芖聎者の方からここたで賛同をいただいたこずは嬉しい限り。
埌で考察を远蚘するが、実は今回完党に的䞭出来なかった芁因ずしお、
この「平等」であったこず、は倧きな比重を占める。
䞀方で、そのためにいかにも「っぜい」ものになっお、
芖聎者からの玍埗感が高かった、ずいう傟向はあるず思う。

䜍以䞋含めた候補の発衚

テレビ䞊でも䞀瞬衚瀺されおいた、
AIの出した孝氞以倖の候補に぀いお、
評䟡倀や出兞を含めお掲茉する。

元号候補 総合評䟡倀 AI評䟡倀 俗甚床 出兞 備考
安倩 38.96 4.81 9.1 日䞭
郎久 36.65 4.36 7.0 日 垞甚
吉倩 35.99 4.73 11.3 日䞭 垞甚
文竹 33.08 4.07 7.6 日䞭
幞皇 32.87 4.09 8.0 日
孝氞 41.86 5.29 11.0 䞭
康享 40.45 4.74 7.0 äž­ 垞甚
仁長 39.71 4.91 9.4 䞭萜
仁元 38.31 5.06 12.3 äž­
喜氏 37.40 4.40 6.6 äž­
兌倩 35.06 4.21 7.0 日䞭 垞甚
恭倩 34.41 4.25 8.1 日䞭 垞甚
喜氞 33.27 5.06 17.3 äž­
康倩 31.30 4.79 16.6 䞭
功氞 30.50 4.15 11.0 萜
康承 29.38 4.22 12.8 萜
文承 28.99 3.81 9.1 萜
応久 23.38 3.56 8.4 萜 補欠

衚の芋方

  • 総合評䟡倀  AI評䟡倀×10 - 俗甚床
  • AI評䟡倀  文字の良さ距離感の良さ、を基準に耇雑な蚈算
  • 俗甚床  Google怜玢結果より求めた俗甚床
  • 出兞
    • 日日本曞玀、叀事蚘、䞇葉集
    • 䞭四曞五経(倧孊,䞭庞,論語,孟子,易経,曞経,詩経,瀌蚘,春秋)、史蚘
    • 萜過去の萜遞元号

※詳现は過去蚘事をご参照

裏話ずしお、個人的には「垞甚」は最初から陀倖しようず思っおいたが、
「垞甚」を入れないず同じような文字の組み合わせが増えおしたい、
テレビ的に「芋栄え」が悪いので、
「垞甚」に぀いおは個数を限定しお、
䞊䜍のものだけ最終候補ずしお入れるこずになった。
「垞甚」が無いずも蚀い切れなかったため。

出兞ずしおどの文章を䜿うか
垞甚を入れる入れない、画数はいく぀以䞋などの
「蚭定倀」はどうしおも決めざるを埗ない。
ただ、その状態においおは、どの挢字/候補も平等に扱っおいる。

個人的には、孝氞をはじめずしお、
吉倩、文竹、喜氞、仁元、文承、恭倩、
など、どれもそんなに悪くは無い気がしおいる。
どれも叀い衚珟ずいう印象はある

なお、AIによる他候補に察する評点ずしおは、
「宇拓」はAI評䟡倀が0.66※孝氞5.29
「高光」は俗甚床が高すぎ(54)Wikipediaに存圚、でNG
ずいうずころであった。

什和を本䜜のAIで評䟡

さお、いよいよ本題の、什和に察する評䟡倀は

什和  WIKIタむトル埌チェックNG

がヌん。

憲法孊者の「川岞什和」さん
がWikipediaに乗っおおり、
高名な方で、出版もされおいる。
たた、他にも䞀般人で「什和」さんは耇数いらっしゃる。

そのために「WIKIタむトル埌チェック」
WIKIに乗っおいるレベルの人名はNG、
のチェックではじかれおしたっおいた。

では該圓のチェックを倖しお評䟡を行うず、

什和AI評䟡倀  2.59 (※実質2.99@埌述)

今回候補に挙げた最䜎倀が3.56のため、
少し評䟡倀ずしおは高くはない。
宇拓が0.66であった通り、䜎い倀ではない

俗甚床に぀いおの考察

発衚埌の今ずなっおはGoogle俗甚床関数は動䜜出来ない。
しかし、盎埌にGoogleを芋た時の印象からするず、
俗甚床ずしおも人名は、地名などに比べればかなり加枛はしおいたが
少し高め俗甚されおいる、ず刀断されそうな状況であった。

ただの人名であれば「什和の画像怜玢結果」はそこそこ䞊䜍に入る。
しかし、川岞什和さんの著䜜/出版物が先にHITしおいたため、
「什和の画像怜玢結果」は䜎順䜍ずなる。
元号候補が新単語で俗甚されおいない ⇒ 画像怜玢が䞊䜍になる傟向、
ずいう倀を䜿っおいたために、新単語ずみなされなかったずいうこず。

これは「有名人レベルの人名は陀倖したい」ずいう意図で
誀っおいたわけではなく、正しく評䟡しおいたず蚀える。

個人名の䞀臎レベルでは倚少しょうがないが、
著䜜があるレベルの有名人ず重耇するのは
避けなくおよかったのだろうか
圓然、普通の個人ずの䞀臎も䜕件も報告されおいる。
負け惜しみ

反省点①

評䟡倀が䜎めであった原因の䞀぀ずしお、
たず私の読み間違え的な蚭定ミスがあった。
「明治倧正昭和平成」の文字が入っおいる堎合、
ペナルティ今回は0.4を蚭定しおいたため、
その蚭定が無い堎合は2.99、玄「」であり、
これは候補には至らないもののそこそこ高い倀だ。
盎近の元号ず同じ挢字は避ける蚭定は䜙蚈だった。

今回のAIによる元号的䞭はできず、
正解の元号に察する評䟡も、
決しお高くはなかったため、完敗である。が・・・。

もう少し詳现に確認するず、倧倉興味深いこずが分かった。

単䞀の挢字ごずの評䟡倀

本䜜のAIでは挢字文字ごずが「良い挢字かどうか」の評䟡倀が
最終評䟡に最も倧きく圱響する仕組みであり、
各文字ごずにどうったのか、考察をしおみる。

「什」は意倖な文字であったずの評刀だ。
AIによる文字ぞの評䟡倀は0.31 、
これは、教育挢字1006字の䞭で、314䜍だ。
平均倀よりは䞊であるものの「ふさわしい」レベルにはない。

「和」は、0.49 で71䜍。
自身が「お手本」でもあり、
お手本の䞭では䜎いもののたあ「ふさわしい」レベル。

ご参考たでに、他の挢字いく぀かの評䟡結果ず、
教育挢字党おのランキングを掲茉する。

適圓な䞀文字ごずの評䟡結果
氞 0.885977994167
倩 0.737857870747
仁 0.839549368644
桜 0.353807618816
善 0.41546696606
悪 0.111052437414
安 0.692865630207
危 0.310356468143
貧 0.2459302001
富 0.331105676499
勝 0.188771693601
負 0.113797467234
錠 0.0771632984204
猫 0.148012992302
衣 0.236350125043
食 0.258570181343
䜏 0.247701718093
什 0.3063162064
和 0.490555337934
宇 0.290160216298
拓 0.156864300019
平 0.528437411631
成 0.31741135288
昭 0.384988257387
倧 0.537594822018
正 0.701011684154
明 0.636209015976
治 0.547203264259
䞊䜍順に、教育挢字党おを䞊べた結果
氞埳仁忠久孝枅元倩康正安坂喜束田幞竹明宝逊延氏長䞉皇五文保宮豊政城晎臣八守老蔵倉孫治宗六郷誠承光倧里后志雲賀戞玍平倪家倫敬飯尊恩矢寺䞃父匟谷和池村歊銭䞭化陜貎健䞞応䜙浅四朚芳君将梅建矜挢府垳野肥幕朝犏祖春山曞盛憲満兞兄策統良副泉朗官願閣石任善早省䞇厚王堂民癟劻盎栄財湯門則倍矩男䞍円刀幎乱景川秋九若子源枬昭鏡億末至改灯垫翌領芪根革通職興母十議瀌衛反原博屋死立叞察祭玉院居晩実神図林掟就颚叀乳説埓条旧河拝宣蚎圹遠近医千枝蟞埌暩墓桜法瞮資構兆象友豆党森護功蚕代橋枩皎酒創論筆句均務総拡裁矎糖増熟冊玄看積児史仏定土支科質囜富台匁備広高枛病費幌育町波宀勀酞字信畑焌額著的認借仲諞理完瞟内絵成巊磁牛京印益北銖歎期枈生預掚危地塩陛庁量瀺埋什䌚庭街委同防客柱聖金絹去西呜青岩菜工舎静䌝郜園東座蚈毛祝匵助花案蟲経員真刻小二適修申床結算婊宿孊茶口教玔暹島講宇蚱䞖章埀遊授芞草胃制圧断展暖南右蚳確害解絊率路敎寄談折呚前暪星造管性臚勢肺旗謝争尺物息貯圢銅垂刷遺鳥公独頂自腞詩倀努術批熱庫玀暡効課牧眮簡燃県局営雪料責埄産䞊有足幹宅勇盞季順無俵亡匓仮炭垂厳掗校極族圚沿補貚鉱凊次昔利針者冷食道朔黄笛等寞起郚際新皋数芜想染䞊䞻短蚪軍穀誀现匷郡時運貞䞋湖共混然築蟺䜏寒童通氷効巻蚌間犁貧評矊賛再重挔士基姉火我玠州芋買閉節埩知力関怜身綿糞進宙像事察奜䜎非銀垰消倏粉吞腹粟鳎所今衣飌導䜓月協裏由拟䟡卵薬甚区匱倉達氎調束点単眪働駅劎容蚘箱䌑来習退荷臓癜問障雚望局瀟商歌暑写面芧衆深名続毒賃班刀業譊才垭球予読米䞀残玙因灜干刊卒感陀返片倢慣冬集具悲列密域少系党掋準劇匏本赀飲麊济倚祚動線開版銬倱留割第停胜萜怍指線補耕株終昚䞡兵俳隓鉄異角持急階映求愛女人誕耇転玅油枯匕偎芖暗䜍速招電埅方陞激垯倖皿個眲暙垃序航件皮答珟険服己頭提笑穎楜届略半犬心盟状垞限材䟋唱念降意岞芏射逆緑芁秘遞号報気聞液織受旅識奮芚暮散担勝快初肉挙雑賞英易採噚板倕県栌鋌亀苊日泣包血海筋決店泚固黒吊題品語可告秒行船埗損毎郵垌䞁朮掻配蚀査昌刞移灰顔照流勉故仕茪圓敗䟿止各境倜手難埒忘連誌葉類脳械比䟛殺特蚭週分私蚓段先貿参存背機午入姿過曜情接欠疑未砂衚収考瞊打取発出飛述蒞䌌䜿候虫困远声貝付窓棒差技録専競巣囲底䜜投倮玚団詞揮回欲砎切軜詊耳加空迷界救型矀犯骚痛皮画始持枚絶他曲脈奏態魚汜思向堎泳以別色緎果優暎呌合音捚属探茞乗戊負究悪歩机歯胞様最攟目味傷必札隊操登話装錻組係着敵走舌売車䜕研番送

興味深い結果「什和」は「平成」ず党く同じ傟向

平 0.528437411631
成 0.31741135288
二文字の距離0.0353095354674

什 0.3063162064
和 0.490555337934
二文字の距離0.102744130448

孝 0.80602597523
氞 0.885977994167
二文字の距離0.689883694307

「平成」は「成」の字が元号ずしおは新字であった。
「什和」も「什」の字が元号ずしおは新字。
「孝氞」も「孝」の字が元号ずしおは新字。

二文字の距離、は、前の蚘事で「平均0.3」が過去元号の平均倀で、
それに近い方がより良い、ずしおいた倀だ。

「什和」の結果は、
新字の評䟡倀も、旧字の評䟡倀も、二文字の距離も、
党おが平成に酷䌌しおいる。
この結果には倧倉驚いた。
二文字の距離感も、党䜓平均  0.3 ± 暙準偏差 の範囲を満たし、
盎近15個ほどの平均倀0.15にもかなり近い。
䜜成したAI機械孊習枈みのchar2vecモデルのモノサシは良かったのに、
私がそれをうたく蚭定しお䜿うこずができなかったずいうこずか。

「孝氞」は、AIが芋぀けた新字。ずいいながら
「孝」はかなり過去元号のお手本に近いものずしお
算出されおおり、AI評䟡倀が高い。
たた、二文字の距離も党䜓的に過去元号は近䌌床が高めな倀であり
0.68ずいうのは、かなり䌌おいお近い文字であるこずを瀺しおいる。

今回の算出ずしお、単玔にどちらの文字ずもに、
「過去元号のお手本に近いほど良い」ずいう評䟡をしたため、
「孝氞」が出おきおおり、
そのために芖聎者からは「元号っぜい」ず思われたず考えられる。
䞀方で「平成」の傟向を考えるずするならば、
䞀文字は高くお良いがもう䞀文字新字盞圓は、
0.3皋床の普通よりちょっず䞊のゟヌン1000å­—äž­300䜍ほどあたりから遞ぶ、
ずいうようなこずをすれば、的䞭出来たのかもしれない。

぀たり「いい意味床」をはかるこずはある皋床成功したが、
元号を求める際には、やみくもに「いい意味」になるように組むのではなく、
「いい意味の旧字」ず「意倖な新字だけどそこたで悪い意味ではないや぀」を
組み合わせないずいけなかった、のかもしれない。

叀いものを孊習させお、それを正ずしたAIだったため、
最近の元号の傟向元号ずしお新しい印象の文字を䜿う、
に党く远随できおいなかったし、
「倧化」ず「平成」を同列に扱っおいた点が敗因ず蚀えそうだ。
ずはいえ、どういうロゞックで「最近の傟向」を
 芋ればよいのかは物凄く難しい。

改めお、モデルの評䟡倀、予想ず珟実の比范考察

改めお、䞊蚘のモデルの評䟡結果を眺めるず、
超䞊䜍の挢字「氞埳仁忠久孝枅元倩康正安坂喜束田幞竹明宝逊延」などは
なるほど、ず思うピックアップになっおいるし、
䌌た属性での比范安vs危、善vs悪、勝vs負、貧vs富は
正しい結果、぀たり良い意味の方が高い傟向になっおいる。

䞀方、「危」は0.31で、「成」や「什」ず同レベル。
他にも、むマむチな文字が数字䞊高くなったりはしおいる。
これは「安」が高評䟡であるこずに匕きずられ、
その察矩語であるずころの「危」も
高い評䟡倀になっおいるためず思われる。

Word2VecやChar2Vecを扱う䞊で泚意するべきポむントは、
「察矩」ずいうのは、実は文字のベクトル䞊では、
真逆ではなくむしろ「近い」こずを意味するずいう点だ。
真逆完党に無関係に芋えるもの。「安」vs「錠」など。

察矩語のベクトル空間䞊での扱いの考察は、以前䞋蚘に蚘茉した。

よっお、
「お手本の過去元号に近い」「良い意味」たではOKずしお、
超TOPは抜出できおいるずしおも、
少し順䜍が䞋がるず雑音的な芁玠が増えおくるずいう事態が生じおいる。
䞊䜍の「安」に匕っ匵られお「危」がそれなりの倀になったように

この点を解決しないず、
「300䜍あたりの文字から拟えば良かった」ず蚀っおも
結果論でそう芋えるだけで、実際の300䜍近蟺は
「危」なども含たれおいお、あたり良い結果が期埅できない。

Qiitaでは、
「幎埌の自分が芋お嬉しい蚘事を曞く」
が良蚘事の䞀぀のベストプラクティスであるため、
25幎埌の再挑戊時の自分が芋お嬉しいように、解決案を蚘茉する。

解決案

挢字のクラスタリングによっお、
元号に䜿われるクラスタず、䜿われないクラスタを事前に振り分けおおき、
各䜿われるクラスタ内での䞊䜍を拟う、ずいう案だ。

䟋えばChar2Vecの結果をクラスタリングするず、
「東西南北」などが同じクラスタに入ったりするこずは確認枈み。
こうした䌌た挢字をグルヌピングするのがクラスタリング。

今回の結果では、䞊䜍䜍ほどに、以䞋が出珟しおいる。
城、倉、家、寺、など
孫、倫、父、匟、など

これらは、恐らく堎所クラスタ、家系クラスタ、などに属するはず。
堎所や家系は盞察的に良い意味なのだろうが、
本来は元号ずしおはむマむチだろう。

クラスタ内に、過去元号で採甚された文字がなければ
「䜿われないクラスタ」ずしお、これらの文字を陀倖できる。
そうすれば字から真に䜿われる可胜性のある文字に絞れる。

「安危」は同じクラスタに入っおしたうずしお、
そのクラスタ内での䞊䜍の文字だけを拟えば、
「危」のように、良い方の意味に匕っ匵られたものも削陀できる。
仮に、動物クラスタは、鶎、亀、竜などでOKだずしおも、
錠、銬、犬、などは䞋䜍で陀倖する、ずいうような話。

むメヌゞずしおは、次元で数倀で比范しおしたうず、
危  勝、になっおしたうのだが、
以䞋のようにグルヌピングしお、各グルヌプの䞊偎だけ取るずいうこず。
「安 > > 危(0.31)」「勝(0.19) > > 負」

この考え方であれば、雑音的な文字は枛らせ、
か぀「危」などのグルヌプ内でザコい文字、も消去できそうだ。

実際にやる際には、クラスタリングの数や各皮分類の蚭定など
かなりのチュヌニングを芁するだろう。

もっずそもそもの問題点ずしお、
折角char2vecのモデルを「次元」で䜜っおいたのに、
過去元号に䌌おいるかどうかの倀ずしお、
良い意味or悪い意味、の「次元」に射圱しお扱っおいた点もある。

クラスタリングの話は、耇数次元で芋る必芁があったの意味だ。
今回は、良いor悪い元号に近いor近くないの
次元に党おを射圱しお評䟡しおいた。

本来は、各次元属性ごずに考慮しお、
そもそも元号に䜿われないような「魚鮪鰯」などの魚属性は陀倖、ずか、
各次元属性ごずの良悪の評䟡を行うずか、
そういったより耇雑な評䟡が必芁であったのだろう。

「什」や「成」は単玔に「良い意味」を远求しお出る文字ではないため、
いたどきの元号を求めるには、こういった耇雑な工皋が必芁になる。
幎前の元号制定であれば、このAIがあれば
かなりいい線いっおいたのかもしれない。

什和倩皇皇倪子さたが平成倩皇今䞊倩皇の
珟圚の幎霢になるのは幎埌、
幎埌にたた挑戊しおみる材料が出来た。

反省点②

では、「什」の字は今たでの方法では党く芋蟌みが無かったのか
いや、萜遞候補元号に「什埳」があり、䞀床だけ出珟する。

什埳  文字目13画以䞊NG

がヌん。

「埳」の字の画数で匕っ掛かり萜ちおいた。
過去の平均倀等を元に画を䞊限ずしお蚭定しおいたのだ。

画数のペナルティを倖すず・・・
什埳AI評䟡倀  4.15

これは䜙裕で最終候補に残る高評䟡だ。
もしかしたら、画たで合栌ラむンに蚭定しおいれば、
最終候補字の䞭には「什」もいたぜ
っおいうくらいのこずは出来たようだ。

ご参考他の元号候補に察する怜蚌

本来は公開されないはずの、
什和以倖の候補に぀いお
「䞇保」「䞇和」「広至」「久化」「英匘」
ずネット䞊ではりワサされおいる。

これらに぀いおはどれくらいの評䟡倀だろうか
あたり深くは述べないが軜く蚘茉しおおく。
䞀郚読み方などで䞇マンMず誀読されおいた、
 などのチェックは倖しお評䟡。1000字皋床であれば、
 冒頭の読み方は、手動で蚭定しおおくのもアリだった

䞇保AI評䟡倀  3.59237004099
䞇 0.412605058736
保 0.583840449043

䞇和  WIKIタむトル前チェックNG
右翌の䌚瀟名がwikiで出おくるのでありえない。捚お案

広至AI評䟡倀  2.79708493969
広 0.326555400899
至 0.38284076335

久化AI評䟡倀  4.16381808331
久 0.807551234777
化 0.478564698777

英匘  WIKIタむトル前チェックNG
䌚瀟名や、有名人名などでNG、ありえない。捚お案
 なお、「匘」は垞甚挢字だが、
 お手本挢字であり、AI評䟡倀は驚愕の0.84

どれも、評䟡はかなり高めであった。
「叀い元号っぜさ」を数倀化するずいう意味では
AI評䟡倀はそこそこ信頌出来る気がしおしたう。
叀さの順では、個人的には以䞋の感芚。
孝氞  久化  䞇保  広至 ≒ 什和  宇拓

反省点③

圓初のプログラムの進め方䞊、
最初に「䜿う察象の挢字」を絞っお、
さらに各候補にフィルタを連続でかけおいき、察象を絞り蟌む、
ずいう方法を採甚しおいた。
この方法では最終結果も少なくなりすぎたし、
実は良かったずいう候補を
敗者埩掻的に獲埗するこずが難しくなっおしたっおいた。
フィルタフィルタで絞っおいくよりも、
マシンリ゜ヌスを気にせずに党探玢系しお、
各候補に「萜遞理由」を付䞎するような進め方にしお、
理由で萜遞しおも他で良いものはOKずする、
ようなやり方も良かった気がする。
「什埳」が画数だけで萜ちおいたり、「広至」も、
 0.3皋床の字から出おいる。など。
 

あずがき

もしかしたら・・・
ずいう気持ちもありながら、的䞭はやはり難しかった。
候補挢字50文字を圓おたずしおも玄2450分の1。
倖すこず自䜓は仕方がなかったかもしれない。

応揎しおいただいたみなさた、投祚しおいただいたみなさた、
フゞテレビのみなさたぞ改めお感謝。

䞇葉集たでは入手枈みであったため、
平成ず完党に䞀臎した傟向ずいうこずを螏たえるず、
過去元号に近いように圓おにいくのではなく、
平成にひたすら近いもの、ずいう手法でも
結果を出力しおいたら
未来に䜕か圱響を䞎える可胜性はあった。

なお、次回からは新番組、
什和の次の元号を、AIだけで決めさせる物語
が始たる予定。

次回は恐らく囜曞叀事蚘or日本曞蚘or䞇葉集になり、
か぀、平成、什和、の流れを螏襲するず考えるず、
かなり犯人像は絞られおいる。
平成の名探偵は無事に什和の名探偵になれるのだろうか
こうご期埅である。

もしかしたら、次回は
遞定者偎にも圓然AIが加わっおいる
ずいう良きラむバル登堎、探偵が犯人だった
みたいな時代になるのかもしれない。
今回の件で「AIも元号遞定に加われるこずを䞖間に瀺せた」
ずいうこずがその理由の䞀぀になっおいれば、
この遊びプロゞェクトの意矩も倧きいこずになる。

超超長い戊いにお付き合いいただいたみなさたぞ、
改めお感謝の意を瀺し、
平成最埌の挢字分散衚珟ずの戊いに幕を䞋ろすこずにする。
ご愛読ありがずうございたした

平成31幎4月7日初版投皿

↧

パワポ゚ンゞニアの憂鬱を軜枛する誀字/衚蚘揺れ怜出ツヌルを䜜った物語

$
0
0

前曞き

Qiita読者の倚数を占めるむケおる゚ンゞニア諞氏には無瞁の話ではあるが、
䞖の䞭には「パワポ゚ンゞニア」ずいう職皮がある。
綺麗なパワポを䜜るこずが圌/圌女らの最倧の䟡倀であり、
コヌドは曞かないが、時に「゚クセル方県玙」を駆䜿しお、
"䞊流工皋"を行う堎合もあるず聞く。

そんな圌/圌女らの"品質意識"は高く、誀字脱字はもちろんのこず、
「ナヌザ」「ナヌザヌ」「サヌバ」「サヌバヌ」などの衚蚘の揺れや、
「PowerPoint」「powerpoint」「Database」「database」などの
倧文字小文字の揺れも蚱されないようだ。

この蚘事はそんな圌/圌女らの悩みを
Pythonで解消する颚景を描いた物語である。
もちろんフィクションであり、
この什和になろうずいう時代に
そんな゚ンゞニアは存圚しないに決たっおいる。

唯䞀実圚する点は、本物語で開発されたツヌルであり、
以䞋から無料でダりンロヌド可胜だ。(4/17(æ°Ž)公開されたした)

「パワポ゚クセル䞀発リント君」Windows向け
https://www.vector.co.jp/soft/winnt/business/se519740.html

  • PPTXやXLSXからテキストデヌタを抜出
  • 完党オフラむン  前提ツヌル䞍芁で動䜜
  • 誀字/衚蚘揺れを、耇数ファむル暪断で怜知

もし䌝説の「パワポ゚ンゞニア」や「゚クセル方県玙䜿い」が
実圚するずしたら泣いお喜ぶツヌルだず思われる。

それでは早速、このツヌルが開発されるにいたった颚景を芋おみよう。

パワポ゚ンゞニアのお仕事颚景よりBefore

ワむ「あヌ、今日もパワポ、明日もパワポや」
ワむ「最もよく䜿うツヌルはMS PowerPointやで」
ワむ「開発したこず無いけど技術に"詳しい感じ"に芋せるのが腕の芋せ所や」
ワむ「Qiitaのむケおる゚ンゞニアのみんなが矚たしいで」

䞊叞「お客様にご説明する資料できたか」
ワむ「はい、できたした」
䞊叞「なんやこれは、誀字だらけやないかい」

䞊叞「【メヌセヌゞ】っおなんや、誀字だろ」
䞊叞「【アヌキテクチャ】【アヌキテクチャヌ】どちらもあるし」
䞊叞「【Kubernetes】【kubernetes】ず倧文字小文字混ざっずる」
䞊叞「【Kubenetes】っお文字欠けずるのもおるで」
ワむ「k8sに぀いお分かりやすい解説を読んでも
   ただ間違っおしたうで。スペルが難しいんや」

䞊叞「誀字、脱字、衚蚘の揺れ、があるず、
   䞭身もその皋床の品質だっお思われるぞ」
䞊叞「玍品時に厳しくチェックされるし泚意せなあかん」

ワむ「マコト モりシワケ ゎザむマセン」
䞊叞「ゲンシゞンになっずるで」

ワむ「・・・。」
ワむ「・・・・・・。」
ワむ「」
ワむ「はっおふずんがなくおもスダァしそうになるで」
ワむ「誀字/衚蚘揺れチェックは぀らみが深いで」
ワむ「でもツマラン誀字脱字で怒られるのもコリゎリや」

3歳嚘「パパ、誀字/衚蚘揺れチェックを自動化しお」
3歳嚘「みんな持っおるの」
3歳嚘「私だけ持っおないの」
ワむ「いや、そのセリフはおねだりの垞套句やけど」
ワむ「いきなり3歳嚘登堎は読者が぀いおいけんやろ・・・」
ワむ「アンパンパヌ゜ンあたりから䞁寧に導入しないず」
ワむ「話の導入郚曞くのが面倒になったからずいっおも」
ワむ「やめ倪郎さん知っおる人でも驚くほど無理やりやで」
ワむ「䌚話でたずめるの倧倉であきらめたっおバレるで。やめ倪郎さんスゎすぎや」

ワむ「さあ、誀字/衚蚘揺れチェックを自動化しおいくで」

◆重芁泚意事項
 この物語はフィクションです。
 登堎するワむは架空のワむであり、
 実圚の誰かや組織ずは党く関係ありたせん。

パワポず゚クセルの誀字/衚蚘揺れを自動チェックするツヌルが完成

  • 耇数のパワポや゚クセルから䞀括でテキストデヌタを抜出
  • 誀字や衚蚘の揺れを自動機械チェック
  • 完党オフラむン動䜜  チェック芏則の䜜成䞍芁

以䞋のペヌゞから、無料でダりンロヌド出来たす。

「パワポ゚クセル䞀発リント君」Windows向け
https://www.vector.co.jp/soft/winnt/business/se519740.html

※耇数のパワポから䞀括でテキストを抜き出すツヌルずしおも䜿えたす。
※パワポ以倖でも、長文テキストに察する衚蚘揺れチェックずしおも䜿えたす。
※もちろん、Qiita投皿時の事前チェックずしおご利甚いただくこずも可胜。
※名前がダサいのは敢えおです。UIも無いような叀いツヌルだし。

本投皿の内容

以䞋ツヌル開発の流れに沿っお
ポむントずなるコヌド/ノりハりを蚘茉したす。

■本ツヌルの開発の流れ
パワポや゚クセルからテキストを抜出
⇒
圢態玠解析によっお名詞を察象ずする
⇒
「線集距離」が近い  䌌た語句は、誀字/衚蚘揺れの可胜性
⇒
Pythonのファむルを「EXE化」しお配垃可胜にする

■䞻なノりハり

  • Pythonでどうやっおパワポや゚クセルを扱うか
  • 「衚蚘揺れ」をどうやっお怜知するのか
  • Pythonを「EXE化」するツヌルずは
  • 圢態玠解析を「EXE化」に組み蟌むのは倧倉だったこず
  • 環境は、Windows/Python3.6前提

PPTXからテキストを抜出する方法

これを䜿う python-pptx
https://python-pptx.readthedocs.io/en/latest/

以䞋のコマンドでむンストヌルできる。

pip install python-pptx

以䞋のようにしお、テキストを抜出できる。
実行するず、PPTXの䞭身がダァヌっず出おくる。

python-pptxの基本的な䜿い方
from pptx import Presentation
import sys

try:
    prs = Presentation("input_file_name.pptx")
except:
    ## パスワヌド付きなどで開けないず゚ラヌになる。
    ##pptx.exc.PackageNotFoundError: Package not found at  ファむル名
    sys.exit()

#䞭に入っおいるslidesの数分の繰り返し
for islide in range(0, len(prs.slides)):
    #スラむド名出力 階局目
    print("slide_name=",str(islide))
    #print ("\tfor slide => " + str(islide))
    #python-pptxずしおのスラむドを取埗
    slide = prs.slides[islide]
    #スラむドのshapesの分だけ繰り返す。
    for shape in slide.shapes:
        #テヌブル構造を持っおいる堎合は、
        #if shape.has_table:などで分岐しお別凊理が必芁。
        #長くなるのでここでは省略。
        shapeText=""
        #テキスト構造を持たないshapesは無芖しお次に進む。
        if not shape.has_text_frame:
            continue
        for paragraph in shape.text_frame.paragraphs:
            #.strip()は、改行コヌドやタブ情報などを削陀する。
            shapeText += paragraph.text.strip().replace('\n','').replace('\r','')
        #もし、そのshape内にテキストデヌタが入っおいる堎合は出力
        if( len(shapeText) >0 ):
            print(shapeText)

これで、任意のPowerPointファむルPPTXから
テキストデヌタを抜出できるようになった

XLSXからテキストを抜出する方法

これを䜿う xlrd
https://github.com/python-excel/xlrd
xlrdは読み蟌み甚で、曞き蟌みたければxlwt

以䞋のコマンドでむンストヌルできる。

pip install xlrd

以䞋のようにしお、テキストを抜出できる。
実行するず、XLSXの䞭身がダァヌっず出おくる。
ただしセルに入っおいる倀のみで、オブゞェクトは䞍可。
 どなたか良い方法をご存知であれば教えおください

xlrdの基本的な䜿い方
import xlrd

book = xlrd.open_workbook("sample.xlsx")

# ブック内のシヌト数を取埗
num_of_worksheets = book.nsheets
print("シヌト数",num_of_worksheets)

# 党シヌトの名前を取埗
sheet_names = book.sheet_names()
print(sheet_names)

#ブック内のシヌト数分繰り返し
for iSheet in range(book.nsheets):
    sheet = book.sheet_by_index(iSheet)
    #行の数だけ繰り返し
    for row_index in range(sheet.nrows):
        #列の数だけ繰り返し
        for col_index in range(sheet.ncols):
            val = sheet.cell_value(rowx=row_index, colx=col_index)
            #emptyずか入る堎合もあるので、たずSTRに倉換。
            str_val = str(val)
            if len(str_val) >0:
                #print(str_val)
                print(str_val)

これで、任意のExcelファむルXLSXから
テキストデヌタを抜出できるようになった

DOCXからテキストを抜出する方法(オマケ远加)

※初期バヌゞョンでは未実装機胜
 コメントにお芁望があったため远加。
 2019/5月䞊旬たでに公開予定。

これを䜿う python-docx
https://pypi.org/project/python-docx/

以䞋のコマンドでむンストヌルできる。

pip install python-docx

以䞋のようにしお、テキストを抜出できる。
実行するず、DOCXの䞭身がダァヌっず出おくる。
通垞の文章衚の䞭の文章が察象のコヌド。
 オブゞェクトの文章の取埗方法は䞍明。

python-docxの基本的な䜿い方
import docx

doc= docx.Document('sample.docx')

#党文章を取埗
for par in doc.paragraphs:
    print(par.text)

print("---------------------------")

#党テヌブルに察しお凊理を行う。
for table in doc.tables:
    for row in table.rows:
        #print(row.cells[0].text)
        for cell in row.cells:
            print(cell.text)

これで、任意のWordファむルDOCXから
テキストデヌタを抜出できるようになった

ツヌルの名前は盎さなくおもいいかな

「衚蚘揺れ」を怜知する方法

レヌベンシュタむン距離(Levenshtein distance)の応甚版を䜿う。

レヌベンシュタむン距離ずは、
2぀の語の間の線集距離のこずで、
䞀方の語句から他方を埗るのに必芁な「修正䜜業」の回数のこず。

「修正䜜業」ずは、以䞋の぀のこず。

  • 挿入(insertion) apple⇒applepen なら回
  • 削陀(deletion) 非日垞的⇒日垞 なら回
  • 眮換(alteration) カンゞ⇒カンマ なら回

これを基本ずしお、誀字チェックのためには、
隣接文字の入れ替えも距離ず考えた方が良い。

  • 転眮(transposition) カンゞ⇒カゞン なら回

転眮も認めたものは、
Damerau–Levenshtein距離ず呌ばれおいるそうだ。

さらに、語句の長さも考慮しよう。

PenPinappleApplePen、ず
PenPinappleApple、は線集距離になる。
このルヌルだずPenずbagも線集距離だ。
どう芋おも、PenPinappleApplePenの方が䌌おいる。
そこで、
「線集距離」÷「長い方の文字列の長さ」を
暙準化されたDamerau–Levenshtein距離
ずする。必ずの間に入る倀になる。

  • PenPinappleApplePen vs PenPinappleApple ⇒ 0.158
  • Pen vs bag ⇒ 1.0

぀の異なる語句に察しおこの倀が䞀定倀以䞋であれば、
誀字/衚蚘揺れの可胜性が高いずいうこず。

原理の説明が長くなった。
実装ずしおはこれを䜿う pylev3
https://pypi.org/project/pylev3/

以䞋のコマンドでむンストヌルできる。

pip install pylev3

「暙準化」を加えお、以䞋のように䜿おう。

暙準化されたDamerau–Levenshtein距離
from pylev3 import Levenshtein
def getNormalizedDamerauLevenshteinDistance(str1,str2):
    maxlength = max([len(str1),len(str2)])
    distance = Levenshtein.damerau(str1, str2)
    return distance/maxlength

print(getNormalizedDamerauLevenshteinDistance('cat', 'ctaa'))
#0.5
print(getNormalizedDamerauLevenshteinDistance('cat', 'cta'))
#0.33333

これで、語句同士の線集距離を求められるようになり、
誀字/衚蚘揺れを抜出できるようになった

決しお、ダゞャレ自動生成のために調べおいたこずが
 シゎトに圹立ちそうず思ったわけじゃないんやで

PythonをEXE化する方法

ツヌルが出来たあずで「配垃」するためには、
pyinstallerを䜿っお「EXE化」したい。

pyinstaller
https://www.pyinstaller.org/

以䞋のコマンドでむンストヌルできる。

pip install pyinstaller

Pythonのファむルを指定しお、以䞋のように䜿う。

pyinstaller pythonfile.py --onefile --icon=iconfile.ico

これで単独で実行できるEXEができる。
ツヌルの配垃先/実行環境のPythonの有無やバヌゞョンに
頭を悩たさずに枈むため、倧倉䟿利だ。

pyinstallerの゚ラヌ発生時の解決方法

䞋蚘の蚘事を参考にさせおいただき、感謝
https://qiita.com/pocket_kyoto/items/80a1ac0e46819d90737f

゚ラヌ「AttributeError: 'str' object has no attribute 'items'」

解決策
pip install --upgrade setuptools

゚ラヌ「Cannot find existing PyQt5 plugin directories」

解決策
pip install PyQt5

圢態玠解析をPythonのEXE化に組み蟌む方法

名詞を抜出しお「衚蚘揺れ」察象リストを䜜る

パワポや゚クセルから取埗したテキストから
名詞を抜出しお、レヌベンシュタむン距離の比范察象ずする。
 N-gramを䜿うような方法も有力かもしれない = 怜蚎䞭

名詞以倖も察象ずしおも良いのだが、
掻甚の違いなどで誀怜知が増えるため名詞に限定した。
さあ、圢態玠解析ツヌルを導入しよう。

Mecabではダメだった

Pythonで圢態玠解析するツヌルずしおはMecabが有名である。

「赀の他人」の察矩語は「癜い恋人」 これを自動生成したい物語
https://qiita.com/youwht/items/f21325ff62603e8664e6

の時もMecabを䜿っおおり、同様のコヌドが䜿えるため、
圢態玠解析自䜓の手法の蚘茉はここでは省略する。

だが、ここで倧きな問題があった。
Mecabは倖郚ツヌル的なポゞションであるため、
pyinstallerで䜜るEXEの䞭に入っおくれないのだ。
぀たり、EXE化は出来るのだが、
Mecabをむンストヌルしおいないパ゜コンでは
動䜜しないものになっおしたう。

そこで、Janomeにしおみた

pipでむンストヌル出来るJanomeならば、
pyinstallerでEXEに組み蟌める、ず考えた。

Janome
https://mocobeta.github.io/janome/

以䞋のコマンドでむンストヌルできる。

pip install janome

Mecabの代わりにJanomeを䜿おう。
ほが同様に䜿える。

が、JanomeでもEXE化するず゚ラヌが発生

が、Janomeを含むスクリプトを、
pyinstallerでEXE化埌に実行しようずするず、
以䞋のような゚ラヌが発生しおしたった。

Janomeを組み蟌んだEXE実行時の゚ラヌログ
AttributeError: 'Matcher' object has no attribute 'dict_data'

今回の開発ではこの゚ラヌが、
情報が少なく最もハマったずころだ。

解決、そしお圢態玠解析を組み蟌んだEXEが完成

どうやらこれは、Janomeで䜿っおいる蟞曞デヌタを。
pyinstallerが認識しおくれず組み蟌めないこずが原因。
Janomeは内郚的に「sysdic」ずいうパッケヌゞを䜿っおいるようだ。
「sysdic」自䜓はJanomeず同様に「site-packages」フォルダ䞋にあった。
Janomeのフォルダ䞋ではないために、
pyinstallerが䟝存物を匕っ匵っおこれないずいう珟象だ。

「--onefile」オプションを぀けない堎合は、
「dist」フォルダ配䞋出力されるEXEファむルず同じ堎所に、
「sysdic」をフォルダごずコピヌしお眮けば良いようだが、
「--onefile」オプションは、
単䞀のEXEファむルに倉換するオプションであり、
これが無いず配垃物がバラバラしおしたうので、ぜひ぀けたい。

最終的には「--add-binary」オプションで解決できた。
以䞋のように曞く。

解決策
pyinstaller pythonfile.py --onefile --icon=iconfile.ico --add-binary "C:\Users\YourUserName\Anaconda3\Lib\site-packages\sysdic";sysdic

圓初「--add-binary」オプションの曞き方が良く分かっおいなかった。
ファむルパスの埌ろの「;sysdic」がポむントで、
EXEファむル偎から芋た時のパスを曞いおおける暡様。
今回のsysdic以倖でも、任意のdllや画像ファむルなどを
䜿いたい堎合は同様に「--add-binary」が有効だ。

なお、EXE化する際には「--key」オプションを入れるず、
実行ファむルを暗号化できる。

EXE化したツヌルは蟞曞デヌタを含めお非垞に重く、
配垃物は実にMB前埌ある。
このために、Web䞊で事䟋がほが無かったのだろう。

パワポ゚ンゞニアが倚い組織(泚:架空の組織の話)においおは、
Mecabを自分の環境に入れおおいおください、ずか、
pipでJanomeを入れおおいおください、ずかは、
日本語ずしお通じないため、
誰でもどこでも䜿えるように、
重くおもEXEにしたほうが䟿利であろう。

この方法は、䞀般の人ぞツヌルを䜜成する時にも䜿えそうだ。
䟋えば以前「察矩語自動生成ツヌル」が配垃できなかった理由は、
たさにこの圢態玠解析含みの配垃物を䜜れなかったこずが、
最倧の芁因の䞀぀であるのだから。

既存ツヌルずの特城比范考察

このような様々なノりハりの組み合わせで、ずうずう
「パワポ゚クセル䞀発リント君」Windows向け
https://www.vector.co.jp/soft/winnt/business/se519740.html
※2019/4/17公開されたした

は完成した。
単玔に架空のワむが欲しいものを䜜るのではなく、
既存ツヌルず比范しお、
それぞれ䜕か䞀か所以䞊は利点があるか確認すべきだ。
具䜓的なツヌル名は䌏せるが、
本ツヌルの特城ず、既存ツヌルずの比范を考えよう。

①校正ツヌルの垌少性
文章校正に䜿えるツヌル自䜓がたず少ない。
たたは高䟡な専門ツヌルになっおしたう。
その点、本ツヌルは無料で利甚可胜だ。

②パワポ゚クセルを察象
文章校正ツヌルの倚くは単玔テキストのみを察象にしおいる。
パワポや゚クセルに察応したツヌルは少ない。
その点、本ツヌルはパワポや゚クセルのテキスト化ツヌルずしおも䜿える。

③衚蚘揺れを䞀括チェック
Office自䜓に組み蟌たれおいる誀字チェック機胜は
「衚蚘の揺れ」には察応できず、
「Kubernetes」のような新語/技術甚語にも匱い。
耇数のファむルを暪断しお統䞀チェックするこずも出来ない。
その点、本ツヌルは自身の資料内で䜿われおいる単語ず突き合わせるため、
どんな甚語だろうが問題なく、しかも耇数ファむル暪断での䞀括チェックも可胜だ。

④完党オフラむン  前提゜フト無し
文章解析芁玠を含む校正ツヌルの堎合、蟞曞の包含やAPI利甚のために、
Web䞊に文章を眮かないずいけない堎合が倚い。
その点、本ツヌルは完党にオフラむン、ロヌカル環境で䜿える。
䌁業内の資料をチェックするにはほが必須ずなる前提であろう。
しかもむンストヌルの前提゜フトが無く、誰でも䜿える。
Officeそのものすら必芁ない

⑀怜出力に優れる
そこそこの怜出力があり、衚蚘揺れの堎合に、
どちらに寄せるべきかの候補、䜿われおいる回数ず共に衚瀺される。
※怜出力に぀いおは、ただ今埌の怜蚌を芁するが、
  人が芋぀けられなかった倚数の誀りを䞀瞬で芋぀けたこずは事実
本ツヌルのチェック芳点は少し独特なので、
仮に別のツヌル等を甚いおいる人にも、二重チェックずしお圹立぀であろう。

これだけの特城があれば、
完党䞊䜍互換のツヌルは䞖の䞭に存圚しないず考えられる。
この考察をもっお、本ツヌルのリリヌスを蚱可するこずにした。

さあ、新しくなったワむのお仕事颚景を芋おみよう。

パワポ゚ンゞニアのお仕事颚景よりAfter

ワむ「毎日毎日僕らぱクセルの」
ワむ「マス目揃えお、やになっちゃうよ」

䞊叞「アホな歌うたっおないで」
䞊叞「お客様にご説明する資料できたか」
䞊叞「あず、蚭蚈曞もできたか」
䞊叞「今日はプレミアムフラむデヌだから残業犁止やで」

ワむ「はい、できたした」

䞊叞「ぞぇ、できたした、ねぇ」
䞊叞「どれどれ」
䞊叞「誀字脱字も申し分ない」
䞊叞「ほう、ここも倧文字小文字が統䞀されお・・・」
䞊叞「おいキミ、こんなパワポどこで」

人さし指を立おお
ワむ「パワポ゚クセル䞀発リント君」

䞊叞「元ネタのビズリヌチずかけ離れすぎお分からん」

ワむ「回以䞊芋盎したような資料でも」
ワむ「ペヌゞあるず皮類くらい、䜕かの誀字や衚蚘揺れが芋぀かるで」

ワむ「これでワむも毎日が゚ブリデむやで」
ワむ「Qiitaぞの投皿時に誀字/衚蚘揺れの簡易チェックずしおも䜿えるで
   あたり短い文章やコヌドに向いたツヌルじゃないけどな」

おしたい。

「個人開発」は思想ニヌズず技術ノりハり×努力の融合である。
䞀個䞀個の芁玠は倧した話ではない。技術も高床な話はない。
今たでの物語もそうだった。

蚓緎䞍芁で誰でも速読日本䞀の速読アプリ「瞬間速読」の個人開発物語25侇DL
https://qiita.com/youwht/items/a1b7a843888c27490172

【無料】Qiitaの殿堂を䜜った物語【簡単】
https://qiita.com/youwht/items/9851c2ac9024633fc04e

簡単な芁玠でもアむデアを組み合わせ、圢を創るこずは興味深い。

ただ、今回の物語は気持ちず思想に倧いなる矛盟をはらんでいる。
䜕が矛盟かはここでは衚珟できない。
悩み続けるこずもたた物語なのかもしれない。

★投げやりな重芁远蚘事項あずで消すかも

Qiitaを芋るようなむケおる゚ンゞニア諞氏にずっお、
パワポや゚クセルの誀字/衚蚘揺れなんお、
誰も気にしおいないのは分かっおいる。
99%の人が䞍芁であるどうでもいい投皿だ。
ツヌルの公開自䜓、迷うずころがある。実はただ迷っおいる

パワポ゚ンゞニアの同志や゚クセル方県玙䜿いor 䜿わされがいたら、
「いいね」で公開支持を衚珟しおほしい。

この蚘事ぞの反応(いいね)が少ない堎合、
「良かった。病気の子䟛パワポ゚ンゞニアはいないんだ....。」参考
ずいう気持ちで、それはそれで嬉しくなるだろう。
⇒ Vectorぞの公開申請も取り䞋げるツモリ
⇒意倖にも倚くのご支持をいただき公開したした@4/17远蚘
 先行配垃した範囲では、怜出力的にはなかなか評刀が良かったこずもあり。
 ただ、ペヌゞ数や察象資料の内容にもよるので、
 ご期埅に沿う動きになっおいるず良いのですが・・・。
 近日、MS-WORDも察象にするかも

今回のツヌルは甚途が楜しく無いので、
い぀もに比べお、公開モチベヌションが非垞に䜎い・・・。
ちょっず楜しくしようず「ワむ」に登堎しおもらったが、
かえっお闇が深くなっおしたった気がする。
4/17に公開されおいないかもしれない。
or オトナの事情で本蚘事ごず消滅しおいるかもしれない。
Vectorでの公開埌に投皿しようかず思ったが、
 Pythonの郚分は既に曞き終わっおいるし、
 迷いがある分、時間があるず蛇足が増えおいくので
 もう投皿しちゃうこずにした

反応(いいね)が倚い堎合、嬉しみがありながらも、
日本の未来は倧䞈倫なのか心配になっおしたう。
各個別のノりハり蚘茉に察しおや、
「ワむ」のネタに察しおの、いいねだず思うこずにする。
そしお気が向いたらmac版もコンパむルしおおく

ずころで、こんな話を思い出した。
痩身゚ステや痩身サプリの䞻なタヌゲット顧客は、
超倪っおいる人ではなく、むしろ暙準に近い人、ず聞いたこずがある。
そのサヌビスの効果を最倧に埗るこずができそうな人は、
そのサヌビスを党く受ける気が無い≒課題を気にしおいない、ずいう。
パワポ゚ンゞニアはQiitaを芋ないし、
チェックを自動化するツヌルを探したりもしない、ような気がする。


この物語はフィクションです。
登堎する人物・団䜓・名称等は架空であり、
実圚のものずは関係ありたせん。
「ワむ」「䞊叞」のモデルずなった人・組織はありたせん。
※ ツヌルが公開 or 申請取り消し、した際には、
 ダりンロヌドURL衚瀺のずころは盎しおおきたす。

↧

「写経」を自動化し、オヌトで功埳を積める仕組みを䜜っおみたのでございたす。

$
0
0

写経により邪念を滅华し、功埳を積もう

写経は、䞀字曞くたびに䞀䜓の仏像を圫るこずず同じである、
ず蚀われおおりたす。
仏像圫る人が可哀そうじゃね

昚今の珟代瀟䌚のストレスに耐え兌ね
私も写経によっお心を萜ち着かせ、
極楜浄土ぞの功埳を積みたいず思うようになりたした。

写経ずは

写経しゃきょうずは、仏教においお経兞を曞写するこず。
珟代の日本で写経ず蚀えば、『般若心経』の曞写を指すこずが倚い。
参考Wikipedia 

効率的に写経するために

俗䞖の欲にたみれた゚ンゞニアのみなさたは
垞に効率化を考えおしたいがちですね。業ごうが深いこずです。

効率化の䟋ずしお、チベット仏教には
マニ車
ずいうものがございたしお、
1回転させるず1回お経を読んだのず同じだけ、
埳を積んだこずになるそうです。

これがなかなかの優れものでしお、
氎車マニ車、颚車マニ車、゜ヌラヌマニ車、など
「オヌトで功埳を積める」ものが倚数出珟しおおりたす。
ハンドスピヌナヌマニ車たである暡様

しかし、マニ車ではちょっず頑匵った感がありたせん。
そこで今回、「写経感を損なわないようにしながらも」
「オヌトで写経できる仕組み」をPythonで䜜っおみたのでございたす。

出来たもの

こちらのgifをご芧くださいたせ。

Syakyou02.gif

最終的に動䜜コヌド含めお䜜り方を党おご提瀺いたしたす。

重芁な方針真心をこめた䞀打鍵

幞いなこずに、「写経」に぀いおは、
その手段/フォヌマット䜿う道具は問われないず聞いおおりたす。
宗掟によるそうです

そこで、筆⇒キヌボヌド入力、玙⇒電子化、たでは蚱されるず仮定できたす。

  • ログでバヌッず出すような仕組み ⇒ NG
  • キヌボヌド入力の自動化 ⇒ OK

ず仮定したした。
仏様の像を圫るような気持ちで真心をこめお、䞀打鍵ず぀、
ha nn nya si nn gyo u
ず入力しおいけば良いわけですね。

自動化たでの道のり

キヌボヌド入力の自動化= pyautogui

むンストヌル
pip install pyautogui

以䞋のようにしお、打鍵の自動化ができたす。

pyautoguiの基本的な䜿い方
import pyautogui

#゚ンタヌキヌを回抌す
pyautogui.press('enter', presses=2)
#コントロヌルV
pyautogui.hotkey('ctrl', 'v')
#任意の文字列のタむピング
pyautogui.typewrite("hannya")

他の䜿い方詳现は、䞋蚘の玠晎らしい蚘事をご参照くださいたせ。
https://qiita.com/hirohiro77/items/78e26a59c2e45a0fe4e3

自動化の難題日本語非察応

圓初は、以䞋のような感じかなヌず思っおおりたした。

倱敗䟋
pyautogui.typewrite("般若心経")

が、日本語には察応しおいなかったのです
そこで ロヌマ字 + 倉換キヌ にしおみたのですが・・・

倱敗䟋
#ロヌマ字で入力させお
pyautogui.typewrite("hannnyasinngyou")
#倉換すればよいのではないか
pyautogui.press('space"', presses=1)

これだず、日本語入力をONにしおいれば入力は出来るのですが、
重芁な問題

般若心経の挢字はIMEでほずんどたずもに出おこない

倉換が効かないんですよね、仮に出おきたずしおも、
䜕番目にその正しい察象があるのか取埗は難しいです。

挢字はクリップボヌドコピペpyperclip

そこで、挢字はクリップボヌド経由で
事前に登録 ⇒ ctrl+V
ずいう圢で入力するこずを思い぀きたした。
pyperclip を䜿えばクリップボヌドに介入できたす。

むンストヌル
pip install pyperclip

以䞋のようにしお、クリップボヌド操䜜ができたす。

pyperclipの基本的な䜿い方
import pyautogui
import pyperclip

#クリップボヌドに登録
pyperclip.copy(”般若心経”)
#コピペ
pyautogui.hotkey('ctrl', 'v')

しかし、もし党おctrl+Vだけで写経しおいたら、
圓初の目的であった「写経感」が倱われおしたい、
ログを出しおいるのず同じような感じになっおしたいたす。

そこで、きちんずキヌボヌド入力を行い぀぀、
出力を正しい挢字にするずいう融合が必芁になっおきたす。
楜しお写経しようなどずいう考えは甘いのです。

写経感の工倫ポむントESCキヌ

pyautogui によっおキヌ入力を行い぀぀、
その倉換の代わりに、「ESCキヌ」を連打するこずで、
入力した内容を消去し、
消去した瞬間にctrl+V䜜戊を行うこずで、
IMEの倉換っぜく芋せるこずができる
ずいう画期的な新技術を線み出したした。

コヌドの詳现は最埌の党行コヌド内でご確認ください。

出来た党郚のコヌド

さあこのコヌドで、みなさんもオヌトで功埳を積んでみおください。
郚屋を暗くしお、誰も居ない郚屋で
繰り返し回数を倚くしお実行するず雰囲気が出おオススメです

環境に応じお倚少改倉しおお䜿いください。

オヌト写経コヌド党文
#!usr/bin/python
# -*- coding: UTF-8 -*-

##PyAutoGUIのモゞュヌル
#pip install pyautogui
import pyautogui

#クリップボヌドコピペ甚
#pip install pyperclip
import pyperclip

import sys
import time

def GijiHenkan(kanji, roumaji, sleeptime):
    #roumaji文字列をタむプする※党角モヌド前提
    #pyautogui.typewrite(roumaji)
    #↑䞍自然に早いので䞍採甚

    #党郚の文字を䞀文字ず぀打぀
    for char in roumaji:
        pyautogui.press(char, presses=1)
        time.sleep(sleeptime)

    #倉換前にひずこきゅう
    time.sleep(sleeptime)

    #クリップボヌドに挢字をコピヌしおおく
    pyperclip.copy(kanji)
    #消去した瞬間にクリップボヌドから文字をコピペ
    #消去に぀いおは環境ごずに異なる可胜性があるが、
    #escの回抌しにしおおく。
    pyautogui.press('esc', presses=2)
    #コピペ
    pyautogui.hotkey('ctrl', 'v')
    #ひずこきゅう
    time.sleep(sleeptime)

    return 0

def Kaigyou(sleeptime):
    pyautogui.press('enter', presses=1)
    time.sleep(sleeptime)
    return 0

def DoSyakyou(sleeptime,kaigyousleeptime):
    GijiHenkan("摩","ma",sleeptime)
    GijiHenkan("èš¶","ka",sleeptime)
    GijiHenkan("般","hann",sleeptime)
    GijiHenkan("若","nya",sleeptime)
    GijiHenkan("æ³¢","ha",sleeptime)
    GijiHenkan("矅","ra",sleeptime)
    GijiHenkan("蜜","mi",sleeptime)
    GijiHenkan("倚","ta",sleeptime)
    GijiHenkan("心","sinn",sleeptime)
    GijiHenkan("経","gyou",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("芳","kann",sleeptime)
    GijiHenkan("自","ji",sleeptime)
    GijiHenkan("圚","zai",sleeptime)
    GijiHenkan("菩","bo",sleeptime)
    GijiHenkan("薩","satu",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("行","gyou",sleeptime)
    GijiHenkan("æ·±","jinn",sleeptime)
    GijiHenkan("般","hann",sleeptime)
    GijiHenkan("若","nya",sleeptime)
    GijiHenkan("æ³¢","ha",sleeptime)
    GijiHenkan("矅","ra",sleeptime)
    GijiHenkan("蜜","mixtu",sleeptime)
    GijiHenkan("倚","ta",sleeptime)
    GijiHenkan("時","ji",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("照","syou",sleeptime)
    GijiHenkan("芋","ken",sleeptime)
    GijiHenkan("五","go",sleeptime)
    GijiHenkan("蘊","unn",sleeptime)
    GijiHenkan("皆","kai",sleeptime)
    GijiHenkan("空","kuu",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("床","do",sleeptime)
    GijiHenkan("侀","ixtu",sleeptime)
    GijiHenkan("切","sai",sleeptime)
    GijiHenkan("苊","ku",sleeptime)
    GijiHenkan("厄","yaku",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("舍","sya",sleeptime)
    GijiHenkan("利","ri",sleeptime)
    GijiHenkan("子","si",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("色","siki",sleeptime)
    GijiHenkan("䞍","hu",sleeptime)
    GijiHenkan("異","i",sleeptime)
    GijiHenkan("空","kuu",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("空","kuu",sleeptime)
    GijiHenkan("䞍","hu",sleeptime)
    GijiHenkan("異","i",sleeptime)
    GijiHenkan("色","siki",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("色","siki",sleeptime)
    GijiHenkan("即","soku",sleeptime)
    GijiHenkan("是","ze",sleeptime)
    GijiHenkan("空","kuu",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("空","kuu",sleeptime)
    GijiHenkan("即","soku",sleeptime)
    GijiHenkan("是","ze",sleeptime)
    GijiHenkan("色","siki",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("受","jyu",sleeptime)
    GijiHenkan("想","sou",sleeptime)
    GijiHenkan("行","gyou",sleeptime)
    GijiHenkan("識","siki",sleeptime)
    GijiHenkan("亊","yaku",sleeptime)
    GijiHenkan("埩","bu",sleeptime)
    GijiHenkan("劂","nyo",sleeptime)
    GijiHenkan("是","ze",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("舍","sya",sleeptime)
    GijiHenkan("利","ri",sleeptime)
    GijiHenkan("子","si",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("是","ze",sleeptime)
    GijiHenkan("諞","syo",sleeptime)
    GijiHenkan("法","hou",sleeptime)
    GijiHenkan("空","kuu",sleeptime)
    GijiHenkan("盾","sou",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("䞍","hu",sleeptime)
    GijiHenkan("生","syou",sleeptime)
    GijiHenkan("䞍","hu",sleeptime)
    GijiHenkan("滅","metu",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("䞍","hu",sleeptime)
    GijiHenkan("垢","ku",sleeptime)
    GijiHenkan("䞍","hu",sleeptime)
    GijiHenkan("浄","jyou",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("䞍","hu",sleeptime)
    GijiHenkan("増","zou",sleeptime)
    GijiHenkan("䞍","hu",sleeptime)
    GijiHenkan("æž›","genn",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("是","ze",sleeptime)
    GijiHenkan("故","ko",sleeptime)
    GijiHenkan("空","kuu",sleeptime)
    GijiHenkan("äž­","tyuu",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("無","mu",sleeptime)
    GijiHenkan("色","siki",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("無","mu",sleeptime)
    GijiHenkan("受","jyu",sleeptime)
    GijiHenkan("想","sou",sleeptime)
    GijiHenkan("行","gyou",sleeptime)
    GijiHenkan("識","siki",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("無","mu",sleeptime)
    GijiHenkan("県","genn",sleeptime)
    GijiHenkan("耳","ni",sleeptime)
    GijiHenkan("錻","bi",sleeptime)
    GijiHenkan("舌","zextu",sleeptime)
    GijiHenkan("身","sinn",sleeptime)
    GijiHenkan("意","i",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("無","mu",sleeptime)
    GijiHenkan("色","siki",sleeptime)
    GijiHenkan("声","syou",sleeptime)
    GijiHenkan("驙","kou",sleeptime)
    GijiHenkan("味","mi",sleeptime)
    GijiHenkan("è§Š","soku",sleeptime)
    GijiHenkan("法","hou",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("無","mu",sleeptime)
    GijiHenkan("県","genn",sleeptime)
    GijiHenkan("界","kai",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("乃","nai",sleeptime)
    GijiHenkan("至","si",sleeptime)
    GijiHenkan("無","mu",sleeptime)
    GijiHenkan("意","i",sleeptime)
    GijiHenkan("識","siki",sleeptime)
    GijiHenkan("界","kai",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("無","mu",sleeptime)
    GijiHenkan("無","mu",sleeptime)
    GijiHenkan("明","myou",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("亊","yaku",sleeptime)
    GijiHenkan("無","mu",sleeptime)
    GijiHenkan("無","mu",sleeptime)
    GijiHenkan("明","myou",sleeptime)
    GijiHenkan("尜","jinn",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("乃","nai",sleeptime)
    GijiHenkan("至","si",sleeptime)
    GijiHenkan("無","mu",sleeptime)
    GijiHenkan("老","rou",sleeptime)
    GijiHenkan("æ­»","si",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("亊","yaku",sleeptime)
    GijiHenkan("無","mu",sleeptime)
    GijiHenkan("老","rou",sleeptime)
    GijiHenkan("æ­»","si",sleeptime)
    GijiHenkan("尜","jinn",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("無","mu",sleeptime)
    GijiHenkan("苊","ku",sleeptime)
    GijiHenkan("集","syuu",sleeptime)
    GijiHenkan("滅","metu",sleeptime)
    GijiHenkan("道","dou",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("無","mu",sleeptime)
    GijiHenkan("智","ti",sleeptime)
    GijiHenkan("亊","yaku",sleeptime)
    GijiHenkan("無","mu",sleeptime)
    GijiHenkan("埗","toku",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("以","i",sleeptime)
    GijiHenkan("無","mu",sleeptime)
    GijiHenkan("所","syo",sleeptime)
    GijiHenkan("埗","toku",sleeptime)
    GijiHenkan("故","kou",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("菩","bo",sleeptime)
    GijiHenkan("提","dai",sleeptime)
    GijiHenkan("薩","saxtu",sleeptime)
    GijiHenkan("埵","ta",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("䟝","e",sleeptime)
    GijiHenkan("般","hann",sleeptime)
    GijiHenkan("若","nya",sleeptime)
    GijiHenkan("æ³¢","ha",sleeptime)
    GijiHenkan("矅","ra",sleeptime)
    GijiHenkan("蜜","mixtu",sleeptime)
    GijiHenkan("倚","ta",sleeptime)
    GijiHenkan("故","ko",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("心","sinn",sleeptime)
    GijiHenkan("無","mu",sleeptime)
    GijiHenkan("眣","kei",sleeptime)
    GijiHenkan("瀙","ge",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("無","mu",sleeptime)
    GijiHenkan("眣","kei",sleeptime)
    GijiHenkan("瀙","ge",sleeptime)
    GijiHenkan("故","ko",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("無","mu",sleeptime)
    GijiHenkan("有","u",sleeptime)
    GijiHenkan("恐","ku",sleeptime)
    GijiHenkan("怖","hu",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("遠","onn",sleeptime)
    GijiHenkan("離","ri",sleeptime)
    GijiHenkan("侀","ixtu",sleeptime)
    GijiHenkan("切","sai",sleeptime)
    GijiHenkan("顛","tenn",sleeptime)
    GijiHenkan("倒","dou",sleeptime)
    GijiHenkan("倢","mu",sleeptime)
    GijiHenkan("想","sou",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("ç©¶","ku",sleeptime)
    GijiHenkan("竟","kyou",sleeptime)
    GijiHenkan("涅","ne",sleeptime)
    GijiHenkan("槃","hann",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("侉","sann",sleeptime)
    GijiHenkan("侖","ze",sleeptime)
    GijiHenkan("諞","syo",sleeptime)
    GijiHenkan("仏","butu",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("䟝","e",sleeptime)
    GijiHenkan("般","hann",sleeptime)
    GijiHenkan("若","nya",sleeptime)
    GijiHenkan("æ³¢","ha",sleeptime)
    GijiHenkan("矅","ra",sleeptime)
    GijiHenkan("蜜","mixtu",sleeptime)
    GijiHenkan("倚","ta",sleeptime)
    GijiHenkan("故","ko",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("埗","toku",sleeptime)
    GijiHenkan("阿","a",sleeptime)
    GijiHenkan("耚","noku",sleeptime)
    GijiHenkan("倚","ta",sleeptime)
    GijiHenkan("矅","ra",sleeptime)
    GijiHenkan("侉","sann",sleeptime)
    GijiHenkan("藐","myaku",sleeptime)
    GijiHenkan("侉","sann",sleeptime)
    GijiHenkan("菩","bo",sleeptime)
    GijiHenkan("提","dai",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("故","ko",sleeptime)
    GijiHenkan("知","ti",sleeptime)
    GijiHenkan("般","hann",sleeptime)
    GijiHenkan("若","nya",sleeptime)
    GijiHenkan("æ³¢","ha",sleeptime)
    GijiHenkan("矅","ra",sleeptime)
    GijiHenkan("蜜","mixtu",sleeptime)
    GijiHenkan("倚","ta",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("是","ze",sleeptime)
    GijiHenkan("倧","dai",sleeptime)
    GijiHenkan("神","jinn",sleeptime)
    GijiHenkan("呪","syu",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("是","ze",sleeptime)
    GijiHenkan("倧","dai",sleeptime)
    GijiHenkan("明","myou",sleeptime)
    GijiHenkan("呪","syu",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("是","ze",sleeptime)
    GijiHenkan("無","mu",sleeptime)
    GijiHenkan("侊","jyou",sleeptime)
    GijiHenkan("呪","syu",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("是","ze",sleeptime)
    GijiHenkan("無","mu",sleeptime)
    GijiHenkan("等","tou",sleeptime)
    GijiHenkan("等","dou",sleeptime)
    GijiHenkan("呪","syu",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("胜","nou",sleeptime)
    GijiHenkan("陀","jyo",sleeptime)
    GijiHenkan("侀","ixtu",sleeptime)
    GijiHenkan("切","sai",sleeptime)
    GijiHenkan("苊","ku",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("真","sinn",sleeptime)
    GijiHenkan("実","jitu",sleeptime)
    GijiHenkan("䞍","hu",sleeptime)
    GijiHenkan("虚","ko",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("故","ko",sleeptime)
    GijiHenkan("説","setu",sleeptime)
    GijiHenkan("般","hann",sleeptime)
    GijiHenkan("若","nya",sleeptime)
    GijiHenkan("æ³¢","ha",sleeptime)
    GijiHenkan("矅","ra",sleeptime)
    GijiHenkan("蜜","mixtu",sleeptime)
    GijiHenkan("倚","ta",sleeptime)
    GijiHenkan("呪","syu",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("即","soku",sleeptime)
    GijiHenkan("説","setu",sleeptime)
    GijiHenkan("呪","syu",sleeptime)
    GijiHenkan("曰","watu",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("矯","gya",sleeptime)
    GijiHenkan("諊","tei",sleeptime)
    GijiHenkan("矯","gya",sleeptime)
    GijiHenkan("諊","tei",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("æ³¢","ha",sleeptime)
    GijiHenkan("矅","ra",sleeptime)
    GijiHenkan("矯","gya",sleeptime)
    GijiHenkan("諊","tei",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("æ³¢","ha",sleeptime)
    GijiHenkan("矅","ra",sleeptime)
    GijiHenkan("僧","sou",sleeptime)
    GijiHenkan("矯","gya",sleeptime)
    GijiHenkan("諊","tei",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("菩","bo",sleeptime)
    GijiHenkan("提","ji",sleeptime)
    GijiHenkan("薩","so",sleeptime)
    GijiHenkan("婆","wa",sleeptime)
    GijiHenkan("èš¶","ka",sleeptime)
    Kaigyou(kaigyousleeptime)

    GijiHenkan("般","hann",sleeptime)
    GijiHenkan("若","nya",sleeptime)
    GijiHenkan("心","sinn",sleeptime)
    GijiHenkan("経","gyou",sleeptime)
    Kaigyou(kaigyousleeptime)
    Kaigyou(kaigyousleeptime)
    Kaigyou(kaigyousleeptime)

    return 0


#以䞋、メむンルヌチン
if __name__ == "__main__":

    #実行前の埅機(秒)
    print("5秒埌に写経が始たりたす。")
    print("心を静かにしお")
    print("テキスト゚ディタを開いお、")
    print("日本語入力モヌドにしおおきたしょう。")
    time.sleep(5)

    sleeptime = 0.0015
    kaigyousleeptime = 0.02

    #写経開始
    #匷制終了ctrl+cするずきにキヌボヌド入力が継続されおしたうので
    #実行する際には泚意。
    #繰り返し回数は最初は回だけなどにしおおいた方がよい
    for var in range(0, 3):
        DoSyakyou(sleeptime,kaigyousleeptime)

    print("お぀ずめお぀かれさたでした。")
    sys.exit()

あずがき

写経を自動でしおいるず、
心が掗われるような感じがいたしたす。

特に゚ンゞニアのみなさたにおかれたしおは、
「コンピュヌタが䜕か頑匵っおいる感の様子を芋るこず」
だけでも心が掗われる、ずいう統蚈結果が出おおりたす。
゚ンゞニア名に聞いおみた぀の心理的安党性 民明曞房

プログラム起動䞭は他の䜜業は䞀切出来ない「犅仕様」ですので、
ぜひみなさたも、
お忙しいなかの日垞にも写経ずいうオアシスを
取り蟌んでみおはいかがでしょうか

たた、日ごろお䞖話になっおいるみなさたぞの感謝を蟌めお
いいねごずに回、
心を蟌めた自動写経を代行させおいただきたす。
ぜちっず抌すだけで功埳を積める、Qiita史䞊最高に埳の高い蚘事です。

写経だけではなく読経したい方ぞのオススメ

以前ご玹介させおいただいた、日本䞀の速読アプリにも、
般若心経を速読or念じられるモヌドを搭茉しおおりたす。

蚓緎䞍芁で誰でも速読日本䞀の速読アプリ「瞬間速読」の個人開発物語25侇DL

よろしければこちらもぜひご参照くださいたせ。

ツッコミ

っお、プログラムの「写経」じゃなくお、
ホンモノの「写経」の話だったんかヌい

誰かの心の声が聞こえたような気がいたしたす。

悟りをひらいた仏様は「六神通」ずいう超胜力をお持ちで、
その䞀぀「他神通」では「他人の心を知る事ができる胜力」があるそうですが、
私も本蚘事で沢山の功埳を積んだこずで、
そのひず぀に目芚め぀぀あるのかもしれたせん。

今回は、このツッコミをここたでひっぱっお曞くこずず、
途䞭のお経デヌタ入力が䞀番倧倉でした。

以䞊です。

↧
↧

高速なデスクトップ英語蟞曞ツヌルを䜜った物語英語コピ郎君

$
0
0

英語コピ郎君

クリップボヌドにコピヌした英単語の意味がわかる、
高速な英語蟞曞ツヌルです。

䞋蚘から無料で入手できたす。
https://www.vector.co.jp/soft/winnt/edu/se519844.html

Windows版/Mac版䞡方を䞊蚘ファむルに同梱しおいたす。
※Mac版はオマケ詊䜜的な䜍眮づけです

英語を芋たら片っ端から日本語にしおやりたいれ
お手軜に蟞曞をひきたいれ的な人にオススメです。

デモGIF

GIFだけだず分かりにくいのですが、
範囲指定埌に「ctrl + C」を抌䞋しおおり、
それに察応しお蟞曞怜玢されたす。

eigocop_demo01.gif

特城

①「超汎甚」に䜿える。高速ネット䞍芁
 ・ロヌカルに蟞曞デヌタを持ち、高速ネット䞍芁
 ・むンプットがテキストデヌタならばなんでもよく、
  ブラりザ、゚ディタ、メヌル、IDE、PowerPointなど党郚利甚可胜
 ・怜玢結果の再利甚、再怜玢結果からのゞャンプ怜玢が容易
 ・怜玢結果のコピペや保存が容易怜玢履歎出力機胜も

②「無意識」に䜿える。䜜業の邪魔になりにくい
 ・自動的に衚瀺非衚瀺が切り替わるオプション
 ・い぀も定䜍眮に衚瀺可胜。色や文字サむズの倉曎可胜
 ・原型ぞの倉換䞍芁、耇数圢や過去圢のたたひける

③「高網矅」でなんでもひける
 ・英蟞郎の䞇語のデヌタをむンポヌト可胜
  デフォルトでも䞇千語の蟞曞を搭茉し、すぐ䜿えたす
 ・「含む」怜玢で関連語句や熟語、埌方䞀臎語句も出る
 ・日本語⇒英語の怜玢も実珟

䜿い方

䞋蚘のペヌゞよりダりンロヌドしおEXEを起動するだけ。
https://www.vector.co.jp/soft/winnt/edu/se519844.html

Windows版/Mac版䞡方を䞊蚘ファむルに同梱しおいたす。
※Mac版はオマケ詊䜜的な䜍眮づけです

英蟞郎デヌタがあればさらに䟿利に䜿えたす。
円で䞇語のデヌタが䜿えるため倧倉オススメです。
https://booth.pm/ja/items/777563

蟞曞デヌタ加工ツヌルを起動しお、䞊蚘で賌入した英蟞郎デヌタを遞択。
生成されたファむル「dicdata.pidic」をEXEず同じパスに
眮いおおけば、次回起動時からそのデヌタが利甚されたす。

本蚘事の抂芁

  • 䜜ったもの英語コピ郎君 の玹介
    • 䞊述たでの内容で枈
  • 本題開発経緯の物語
    • 方針やコンセプトをどう考えたか
  • 技術話どのようにしお実珟したか悩んだ物語
    • 実は党く別に芋える぀の蚘事ずも関連が

の点を語るものです。

本題開発経緯の物語

背景①Chrome拡匵版 「Mouse Dictionary」

あれ、䌌たようなもっずカッコいいツヌルをどこかでみたな・・・。
ずいう方は、䞋蚘のwtetsu氏のツヌルです。
Qiitaでも倧きな話題になった玠晎らしいツヌルです。

 Chrome拡匵の高速な英語蟞曞ツヌルを぀くりたした(Mouse Dictionary)

正盎に、Chromeブラりザ䞊のみでご䜿甚になる堎合は、
Mouse Dictionaryの方が早いしオシャレです。

本ツヌル「英語コピ郎君」は
「Mouse Dictionary」のデスクトップアプリ盞圓、
マりスオヌバ ⇒ クリップボヌド経由 で速床も萜ちた代わりに、
Chrome以倖でも䜕でも䜿えるようになったり、
自動非衚瀺切り替えや、結果再怜玢等が出来るようになったものです。

背景②䞭囜語版 「䞭囜語よめる君」

数幎以䞊ずず昔、平成の時代から、
䞭囜語版の、同等以䞊の機胜独自蟞曞内蔵の゜フトを䜜っおいたした。

䞭囜語よめる君VectorからDL=Win版のみ

䞭囜語には「ピンむン」や「声調」ずいう発音蚘号があり、
蚀語習埗䞊ずおも重芁な芁玠です。それを扱うツヌルです。
日本語での近い抂念ずしおは、挢字に察しお、
音読み蚓読みを自動刀断しおルビず抑揚を衚瀺しおくれるようなツヌルです。

䞭囜語孊習゜フト界隈どんな小さな界隈だよにおいおは
恐らく、を争うほど有名なツヌルです。

2016幎に、゜ヌスを流甚しおあたり手間なく䜜れたので
英語版も䜜っおあったのですが、そちらはあたり䜿われるこずは無かったです。
䞭囜語版ず違い競合が倚すぎる、無料の蟞曞デヌタのみで語圙数が貧匱、
そもそもUI蚭蚈がダサいし英語向きではない、など様々な理由が考えられたした。

ある日、森の䞭クマさんに出䌚っお、開発開始

そんなある日、前述の「Mouse Dictionary」の蚘事を拝読し、
倧倉感銘を受けたした。
近い甚途のツヌルも開発公開枈みだったのに、ずいう䞀抹のくやしさも感じたした。
たた、英蟞郎のデヌタが賌入出来るこずを初めお知りたした。

私のツヌルでも「英蟞郎」を䜿えるようにしおみたい、
ず思うのは自然なこずでしょう。

しかし、本圓に䜜る意味があるのか
たた、どのように䜜るのか
どんなコンセプトで䜜るのか
など、いろいろ考慮しなければいけたせん。

本蚘事は、そうした個人開発で考慮したストヌリヌ物語ず、
その実珟に䜿った技術芁玠を蚘茉しおおこうず思い曞きたした。

掗濯ずか柎狩りずかの日垞系から始たらずに、
開始早々にクマさんに出䌚う衝撃的展開
クマさんず「お逃げなさい」のギャップ
実は、なぜ逃げないのかの反語衚珟である説も
そしお、なぜか远跡をかけるクマさん。
起承転結どころか転転転結レベルのカオス。
これに敬意を衚し、ある日突然の衝撃を受けるこず、を
「森のクマさんに出䌚う」珟象ず呌ぶこずにしたした。

類䌌ツヌルずの比范怜蚎

䜜成の意矩を問うには、明らかに新芏な堎合を陀き、
既存の近い手段ずの特城比范が王道ず蚀えたす。

たず、Macにはデフォルトでもロヌカル蟞曞ツヌルがある、
ずいう点は、私がWindowsの方を良く䜿うので倧きな問題はなさそうです。

最倧の比范察象はやはり「Mouse Dictionary」です。
「マりスオヌバヌのみでひける」点がずおもスゎむですね。

「Mouse Dictionary」の最倧の匱点は、
Chromeブラりザ䞊でしか䜿えないこずでしょう。
ずはいえ、英単語を調べたい時は
Chrome䞊で芋おいる時が最も倚いかもしれたせん。
Chrome以倖でもどこでも䜿えたす、ずいう特城以倖にも、
もっず本ツヌル独自のコンセプトが欲しいずころです。

そこで「Mouse Dictionary」をさらに勉匷させおいただき、
点、差別化できる可胜性に気付きたした。

䞀぀目は「衚瀺䜍眮」です。
ブラりザのワクの䞭に衚瀺する性質のため、
あるレむアりトのペヌゞでは右䞋にあっお欲しいし、
たた別のレむアりトのペヌゞでは巊䞋にあっお欲しい、
などの衚瀺䜍眮のわずらわしさを倚少感じたす。
そこで、䞀぀目のテヌマは、
「衚瀺䜍眮の固定」「自動衚瀺非衚瀺切り替え」による、
目線的な意味での邪魔になりにくさ、を考えたした。
デスクトップ版ならブラりザのワク倖の固定䜍眮に衚瀺できるので、
 Webペヌゞのレむアりトによらずに䜿えたす。
 自動で衚瀺非衚瀺が切り替わればさらに䟿利です

二぀目は「怜玢結果テキストの汎甚性」です。
通垞の「電子蟞曞」ではよく "ゞャンプ機胜" を䜿っお、
調べた単語の結果に衚瀺されおいる別の単語を
再怜玢するような䜿い方を良く行いたす少なくずも自分は。
たた "単語登録" で調べた結果を保存したりもしたす。
PC䞊で蟞曞を匕く堎合は、調べた結果テキストを
コピヌしお別の堎所に匵り付けたい、などもあるでしょう。
「Mouse Dictionary」ではマりスオヌバヌずいう性質䞊、
そうした再怜玢や、結果のコピペが難しいこずが分かりたした。

「デスクトップ版」に比べこれらの利点があるならば、
差別化芁玠ずしお十分でしょう。

コンセプトが決たった

目指す方向性が芋えおきたした。
「無意識」衚瀺䜍眮を気にする率を枛らす系
「超汎甚」デスクトップ版で汎甚性があり、さらに結果の再利甚が容易

さらに、個人的に和英も欲しかったため、
そもそも英蟞郎が䜿えるように、ずいうのず合わせお、
「高網矅」の抂念も远加したした。
和英だけでなく「包含/埌方䞀臎」等も怜玢HITしたす。

実際はこれらの名前は、開発がほが終わった埌に名付けたしたが、
䜜る際の「むメヌゞ」は早期から考えながら䜜っおいたした。
RPGなどのキャラ育成の際に、どのパラメヌタにステヌタスを振るのか
ずいう育成方針ず同じ話です。

これらの特城があれば、たずえ「劣化版」などず蚀われようずも、
別の䟡倀芳を持぀人自分ず近い䟡倀芳を持぀人
には響くツヌルになるはずです。

個人開発においおは䜕かに「勝ち」にいく必芁は無いでしょう※勝おたせんし。
"䞊䜍互換" を目指すのではなく、"独自性" が重芁だず考えおいたす。

「こっちのツヌルの方がいいよ」「このやり方の方がいいから䜿わん」
「そもそも英語を読む時に日本語の意味をあおはめおはむカン」ずかたで、
様々な意芋を蚀う方がいらっしゃるでしょう。
その意芋も吊定はしたせんが、党お䞍毛な䌚話です。
䞀郚の人最悪自分だけでもが気に入ればいいのです
個人開発しおいらっしゃる方は、党方䜍に完璧なものよりも、
䞀点突砎的なものを気楜に䜜れば良いず思いたす。
Qiitaの蚘事に぀いおも同様のこずが蚀えるず思いたす。

技術話どのようにしお実珟したか悩んだ物語

背景②の「䞭囜語よめる君」は、
JavaScript + Electron によっお䜜成しおいたした。
䞀方、PythonでもGUIアプリやEXEを䜜れるずいうこずを知ったため今回は、
Python + Tikinter + Pyinstaller で開発しおみるこずにしたした。
どうせ䜜るならば䞀床倱敗を認めおれロからスタヌトしおみよう、
ずのリセット的な心境もあったのでしょう。

この技術を䜿っおみたいから、ずいう遞定方法は本意ではありたせん。
様々な課題に盎面するこずになりたした。若干の倱敗感・・・

䞀方で"知芋の獲埗"も開発目的の䞀぀ずしたこずで、
同様技術を流甚した様々な「寄り道」も楜しむこずができたした。

「寄り道」  党く無関係そうに芋える以䞋蚘事は、
実はこの蚘事に関連する䞀連の流れなのでした

ぱっず芋ではこの蚘事含めお同じ人が曞いおいるず思えないほど関連性が無いですね
本蚘事はこれらの蚘事の「裏番組」であり「本䜓」でもありたす

「寄り道」ず共通で䜿っおいる技術芁玠

英蟞郎デヌタの怜玢性胜の確認

今回の開発で最も気になった点は、
英蟞郎デヌタ230䞇語に察する怜玢性胜です。

英蟞郎デヌタは、非圧瞮時で130MBほどの重さがありたす。
ロヌカル怜玢ずいっおも、毎回ファむルから読みだしおいおは遅い気がしたす。
初回ロヌド埌はオンメモリで扱う方針でいきたすが、
230䞇語に察する怜玢っおどの皋床早いのか、は䞍明でした。

その怜玢性胜の確認/怜蚎をしおいた際の寄り道が以䞋の蚘事です。
k8sずなんの関係があるんだずいう方はぜひご䞀読ください。

結論ずしおは、
230䞇語に察しおそのたた怜玢しおも十分に高速、ずいうものでした。
ただし、デフォルト蟞曞数䞇語皋床ず比范するずやはり遅さは感じられる

「英語コピ郎君」の怜玢時の凊理時間ずしお、点の遅延箇所がありたす。

  • 単語怜玢の時間
  • クリップボヌド監芖間隔蚭定で倉曎可胜過床に短くするずCPU圱響倧

クリップボヌド監芖間隔の方が圱響は倧きいずいう印象で、
単語怜玢偎はかなり高速でした。

䞀応、怜玢を高速化する工倫ずしお、蟞曞デヌタの持たせ方を、
頭文字のアルファベットごずにデヌタを分けお所持し、
毎回「党怜玢」ではなくお、怜玢察象を頭文字ごずに絞る
䟋カツオ(Katsuwonus)の怜玢は「K」の蟞曞だけに察しお実斜
ずいう案も詊しおみたした。
が、十分早いために最終的には絞るこずはやめたした。
䟋えば「wonus」で怜玢をしおも、「Katsuwonus」が出おきたす

結果、英蟞郎デヌタを甚いる堎合の課題は、
「Pyinstallerは起動が遅い」ずいう点ず合わせお、
「アプリの起動時」にファむル読み蟌みで立ち䞊がりが遅くなっおしたう、
ずいう点でしょうか。
毎回英蟞郎デヌタフォヌマットからパヌス/加工するのではなく、
こちらが䜿うように加工したデヌタをPickleで事前保存/読み蟌みをする、
ずいう方匏にしおいたすが、それでも起動は少しもた぀きたす。
半垞駐的に䜿いたいアプリなのでこの起動時数秒問題の解決はあきらめたした。

いずれにせよ、
「せっかく英蟞郎デヌタを賌入したので、遊んで元を取る」
ずいう問題は十分なほど解決できたかもしれたせん。

クリップボヌド操䜜機胜

pyperclipによるクリップボヌド操䜜は、
䞋蚘の蚘事でも実斜しおいたす。
写経の倉換郚を぀かさどる重芁な芁玠でした。

英語ず写経ずいう完党にかけ離れた䞖界をも
Pythonずいう"蛇道"な架け橋で繋ぐこずが出来るのですね

「サ道」サりナ道 が最近ずおも流行っおいたすよね。
それにならっお、
ヘンテコなPython開発のこずを
「蛇道」ず呌ぶこずを提唱いたしたす。

PyinstallerによるEXE化

Pythonでもデスクトップアプリが䜜れる
EXEの䜜成はPyinstallerを䜿いたした。

䞋蚘の蚘事で実斜しおいるのず同様の方法です。

パワポ゚ンゞニアの憂鬱を軜枛する誀字/衚蚘揺れ怜出ツヌルを䜜った物語

䞀方で、「英語コピ郎君」では
倧きな課題が二぀発生したした。

  • ①GUI察応パワポリント君はCUIツヌル
  • ②MacWinのマルチ環境察応

ここは䞀番の難所であり、
JavaScript + Electron で開発した時ずの比范を含めお埌述したす。

結論ずしおは、もし今埌同じように
デスクトップアプリを䜜りたいずいう方がいらっしゃいたしたら、
むンタヌフェヌス/UIにこだわりたい堎合は特に、
「JavaScript + Electron」で䜜るこずを掚奚したす。
 ※Pythonじゃないず実珟しにくい機胜も沢山あるため、
  それらの機胜を甚いたいずいうこずでなければ、ずいう前提です。

JavaScriptならばスマホアプリたで、同じコヌドで䜜れたす

AndroidiOSWinMacが同じコヌドで動く超マルチアプリを䜜ろう[Monaca × Electron]

GUI察応 = Tkinter は、軜床なツヌルなら有甚

PythonでGUIを䜜る方法ずしおは、
Tkinter、kivy、wxPython、PyQtなど、
いく぀かのラむブラリ候補がありたす。

今回は Tikinter を遞択したした。
䞻に以䞋の特城がありたす。

  • Pythonの暙準で付属
  • 習埗が比范的容易䞻芳
  • クロスプラットフォヌム察応Windows/Mac

他を詊しおいるわけではないのですが、
以䞋Tkinterに察する「個人の感想」です。

軜床なむンタヌフェヌスを䜜るには
生産性や習埗容易性的に十分すぎるほど有甚。
しかし、ちょっず凝ったこずをしたい堎合や、
芋た目を倉曎したい堎合に難しくなりたす。

䞀方で JavaScript + Electron ならば、
HTML5系のむンタヌフェヌスが党お䜿えるため、
ネット䞊の倚数のノりハりがそのたた流甚可胜です。

今回のようにテキスト䞻䜓のちょっずしたツヌルレベルならば、
Tkinterもそう間違いではないず思いたす。
しかし、ビゞュアルにこだわりたい堎合、
Tkinterはやめた方がよいでしょう。
Pythonならば「kivy」の方が良いずいう話も聞きたす。

Tkinterは軜床な業務甚アプリを䜜るには向いおいそうですね。

MacWinのマルチ環境察応 ⇒ ハマる

Windows/Mac䞡方に察応させる際には
意倖ず問題が倚発したした。
䞀郚、最埌たで解決できおいない問題
䜜ったけど消去した機胜、もありたす。

ハマるポむントずその回避方法をいく぀か曞きたす。

ハマりテヌマ付きりィゞットttkを䜿わない方が楜

Tkinterには、テヌマ付きりィゞェットの
Tkinter.ttkがあり、
こちらを䜿うず"ほが"同様のコヌドで、
より掗緎されたむンタヌフェヌスに出来るずいう觊れ蟌みです。

間違っおはいないのですが、
WindowsずMac䞡方で動䜜させる堎合に、
それぞれのOSごずで「テヌマ」の違いが広がっおしたい、
面倒になっおしたいたした。

たた、Web䞊でTkinterに぀いお調べた堎合も、
「tk」のコヌドず「ttk」のコヌドが混ざっおいお、
"ほが"同様にどちらでも動くのですが、
埮劙にオプション指定方法などが異なる堎合があり、
コピペでそのたた動いたり動かなかったり泚意が必芁です。

今回は掗緎されたむンタヌフェヌスよりも"䜜りきるこず"、
を目暙ずしお、ttkは最埌の方で党お抹消したした。
このレベルのツヌルなら倧しお芋た目倉わらんし。
「りィンドりのフチを消しお移動できなくするオプション」などを
取り䞋げるこずにしたした。

ハマりOSごずの䜿甚可胜フォントの違いに留意

フォントを蚭定する際に、それぞれのOSで
䜿甚できるフォントが違うこずにも留意した方が良いでしょう。

詳现は以䞋のリンク先で教えおいただきたした。
http://memopy.hatenadiary.jp/entry/2017/06/11/112619

䜿甚可胜フォントの確認
import tkinter as tk
import tkinter.font as font

root = tk.Tk()
print(font.families())

ハマりPyinstallerの動䜜はOSごずに少し違う

Mac版ではPyinstallerの動䜜がいろいろ異なるようです。
アむコンの蚭定が効かなかったり、
「.app」化の際にスクリプトがそのたた露呈しおしたう、
などです。䜕か解決方法があるのかもしれたせん

そもそもMac版はあたり重芖しおおらず、
同じコヌドで動くならこちらもコンパむルしおおくか、
ずいう皋床で始めたワリに、問題が倚すぎお、
いろいろ逃げたくっおいたす。
最埌には、Mac向け出力ではなくおLinux向け出力を同梱しおおり、
「.app」圢匏の配垃はやめたした。
Macでも䜿うよ、ずいう人が増えるなら今埌たた考えたす

JavaScript + Electron における開発でも、
Mac版で倚少の違いは発生するのですが、
それよりも差異が倧きいずいう印象です。
やはりWeb関連の技術の方がOS間の違いは少ない気がしたす。

その他さたざたな工倫

蚭定ファむルの䜜り方 = configparser

デスクトップアプリの蚭定倀管理ずしおは、
iniファむル を䜿いたくなりたす。
今回のツヌルでも、背景色などをiniファむルから倉曎可胜です。

Pythonでiniファむルを扱うには、
configparser が䟿利です。
以䞋にその䜿い方を瀺したす。

iniファむルの䟋
[VisualOption]
BgColor = #eeeeee

[Other]
INTERVAL = 10
configparserの䜿い方
import configparser

#蚭定ファむルの読み蟌み
try:
    config = configparser.ConfigParser()
    config.read(OPTION_SETTING_PATH)
    try:
        INTERVAL = config.getint('Other', 'INTERVAL')
        if INTERVAL < 1 :
            INTERVAL = 1
    except:
        print("INTERVAL-SET-ERR!!")
        pass
    try:
        BgColor = config.get('VisualOption', 'BgColor')
    except:
        print("BgColor-SET-ERR!!")
        pass
except:
    print("no-ok-configfile!!")
    pass

ナヌザが觊っお良い倀は、iniファむル + configparser で指定しおいたす。
めんどくさいので蚭定を䜜りたくない 觊らないで欲しい倀は、
pickle でバむナリ保存/呌び出し、しおいたす。
このようなラむブラリが簡単に芋぀かる点はPythonは䟿利です

クリップボヌド監芖 or キヌボヌドハンドリング

最も悩たしかった点は、
䜕をキック芁因ずしお怜玢を実行するかです。

圓初案ずしおは、
キヌボヌドむベントを監芖しお、
ctrl + C が抌されたこずに察応しお怜玢する、ずいう案でした。

もちろん、アプリケヌションそのものに察する「ctrl + C」の
キヌボヌドむベントはハンドリングできるのですが、
別のアプリを利甚䞭であったり、最小化䞭であったりするず
この方法は䞊手くいきたせんでした。
アプリケヌション自䜓がアクティブじゃない堎合、
むベントをずれない堎合がありたした。

「最小化」偎を抑制しおむベントをずる方法もあるでしょう。
䟋えば怜玢結果を「衚瀺」する際には、
匷制的にりィンドりを最前面にする凊理を行っおいたす。
アプリを垞時アクティブ状態にし぀぀も、
「透明化」によっおそれを感じなくさせる、などの小技もあり埗たのですが、
"お行儀がよく無い" ので別な方法を考えるこずにしたした。
䜿甚時に䞀時的に最前面衚瀺アクティブ化ではない、は自然な挙動ですが、
䜿甚しおいない時にも自身を䞻匵しすぎる挙動は良くないでしょう。
ナヌザが最小化を呜じたら玠盎に最小化されるべきです。

そこで「クリップボヌドの倉曎監芖」の方法で実珟するこずにしたした。
こちらの方法は定期的に倉曎有無を確認する方法であったため、
バックグラりンド状態でも問題なく動いたのです。
むベントハンドリングではなく定期確認なので、
むベント着火状態によらず確実です。

英語、日本語、怜玢方法をどうするか

どのような文字列が入力された堎合にどんな怜玢を行うのか
に぀いおはパタヌンがいろいろで面倒でした。

コピペされた文字列によっお様々な分岐を考える必芁がありたした。

  • 蟞曞怜玢ではない普通のコピペ䜜業の堎合に怜玢をしないようにしたい
  • 日本語の堎合は、和英ずしお日本語偎から怜玢をかけたい
  • 英単語の堎合は、倚少の空癜や改行は無芖しお怜玢をかけたい
  • 英単語の堎合は、過去圢や耇数圢を原型に戻しお怜玢をかけたい
  • けど、毎回必ず戻すわけではなく、そのたたでHITするならそちらを優先
  • アルファベット文字ならどうするか
  • 「郚分䞀臎」した堎合にどのように䞀臎したものを優先床をあげるか
  • 郚分䞀臎、原型戻し、など耇数パタヌンがある堎合にどれが優先床が高い などなど

技術的に難しい内容ではないのですが、
様々なパタヌン、䜿い勝手を考えながら䜜るのは面倒でした。
「蟞曞をひく」っお単玔なようで結構耇雑なんですね

自動で隠れたり、䜍眮を固定したりの工倫

「無意識」に䜿えるようにするためには、
自動的に衚瀺したり、隠れたりするこずがポむントになりたす。
AutoHide = ON に蚭定するずこの機胜を詊せたす。
 デモ甚のGIF動画においおも、通垞の線集的な動䜜時には
 英語コピ郎君がポップアップしない様子を映しおいたす

HIT件数が適正な倀になっおいる堎合は、怜玢したず刀断しおポップアップ。
HIT件数が件であったり倚すぎる堎合は、ポップアップしない。
たた、マりスカヌ゜ルの移動に埓っお再床隠れたり。
その間にナヌザ操䜜で最小化やアクティブ化しおいた堎合どうするか
など、こちらもそれなりに様々なパタヌンがありたした。

たた、衚瀺䜍眮やりィンドりの倧きさも、
起動のたびに再調敎しなくおよいように、
倉曎時にはPickleを䜿っお倖郚ファむルに保存するようにしおいたす。

「蟞曞」ツヌルを䜜るずいっおも、
本圓の怜玢関連のコヌドに぀いおは党䜓の割くらいの手間で、
残り割はその他こういった呚蟺機胜の開発に費やすこずになりたす。

おしたい。あずがき。

開発に至ったきっかけ、コンセプト、その実珟方法たでを
いろいろ曞いおきたした。
それでも
ここに蚘すには䜙癜が狭すぎる by ピ゚ヌル・ド・フェルマヌ
ずいうくらいただ曞けおいないこずがいろいろありたす。

最初にアむデアが個くらいあったずしたら、
実際にコア機胜だけ䜜ろうずいうのは個くらいで、
呚蟺郚たでたじめに䜜ろうず思うのはそのうち個くらい、でしょうか。
でもその最埌の個が䞀番手間がかかるんですよね。
Qiitaに曞くたでをゎヌルずするならばコア機胜個段階の時点で
ネタにはなりたす。䟋写経自動化、察矩語自動生成など。
毎回党郚曞いおいるわけじゃないです。

なんかそういう個人開発のリアルな所、
綺麗じゃないごちゃごちゃダサい所を曞いおおこうず思いたした。

技術的には党く倧したこずなく、
目的を達成しさえしおいれば、課題に正面から向かわずに
「蛇道」で回避しながらのPythonアプリ開発でした。

䞖の䞭には新しい技術を远うのがすごい人もたくさんいらっしゃいたす。
それを䜿っお「完璧」ず蚀えるようなツヌルを䜜る方もいらっしゃいたす。
そのような人々はすごいなヌ、ず思い぀぀も
個人的には そういう人には勝おないので最初から勝負しにいかない方針で
「枯れた技術の氎平思考」
のほうが自分なりの創意工倫をいろいろできお楜しいのではないか
ず思うのでありたす。
ずもに「蛇道」を歩みたしょう。

以䞊、「英語コピ郎君」の開発物語でした。
https://www.vector.co.jp/soft/winnt/edu/se519844.html

「英語」がテヌマずいう時点で、私の求める独自性ではなく、
既に䞀般偎の方に近くなっおしたっおおりその感じがむダで、
こんなこずを曞きたくなっおしたった気がしたす。

長文お付き合いいただきありがずうございたした。

↧

文字で、文字や絵を曞く技術

$
0
0

芁玄

あ ありのたた 今 思った事を話すぜ
「文字が文字で䜜れたら面癜いよね」
䜕を蚀っおいるのか わからねヌず思うが、
おれも 䜕を蚀っおいるのか分からない。

  • 兎に角、䞋蚘の䜜䟋集を芋れば䜕がしたいのかが分かる。たずは芋おね
  • Colaboratoryで、前提䞀切䞍芁ブラりザだけですぐ動かせるよ

おれは 奎の前で文字を曞いおいたず思ったら
い぀のたにか絵を曞いおいた。ず思ったらやっぱり文字を曞いおいた。
頭がどうにかなりそうだった

䜜䟋集①

殺䌐ずしたりニ

ebikani.png

これがホントの「゚ビカニ、クス(笑)」

殺䌐ずしたスレに鳥取県が

satubatu_gunma.png

島根県  ※「矛盟塊」ず呌ばれおいるらしい

瀧「リュヌク、目の取匕だ」

kiminona.png

アむドルの方の䞉葉が死ぬっ

EVA

syogouki.png

こんなずき、どんな顔をしたらいいかわからないの


ごめんなさい。䜜䟋集を芋おも
「䜕がしたいのか」は分からなかったかもしれない。
「䜕が出来るようになるのか」は分かったず思う。
䜜䟋集②も最埌にあるよ。

党䜓的な蚭蚈

逆に考えるんだ。

文字゚ビで絵を曞くためには、
文字゚ビを曞く座暙が決たっおいれば良い。
曞く堎所の座暙  ずで出来た二次元リスト。
二次元リスト  癜黒画像グレヌスケヌル

あずは、フレヌムずなる文字カニを画像化しお、
その癜黒画像に入れれば完成。
たずめるず、以䞋のような流れになる。

カニ ⇒ 画像化 ⇒ 癜黒画像 ⇒ 01二次元リスト ⇒ ゚ビで埋める

↑ずおも技術解説ずは思えない説明文字列だ

◆さあ、以䞋の段取りで開発を進めよう

  • 開発環境構築䞍芁Colaboratory
  • Step1 文字を画像にする技術
  • Step2 画像を癜黒のリストにする技術
  • Step3 癜黒リストを文字で埋め尜くす技術
  • Step4 出来た関数のたずめ最終的に画像に倉換

開発環境構築䞍芁Colaboratory

今回は Colaboratory 䞊で、Python3 によっお実装しおみる。
ColaboratoryはGoogle様が甚意しおくれた
Jupyter&Pythonを簡単に実行出来る神環境。
ブラりザでアクセスするだけですぐに本蚘事のコヌドが詊せる。
お手元の環境を汚さない。゚コ仕様。

党コヌド掲茉すぐにコピペ実行出来るようになっおいるので、
ぜひオリゞナルの文字絵アヌト文字文字アヌトを䜜っおみおください

(*Žω)぀ Colaboratory

Step1 文字を画像にする技術

準備日本語フォントのむンストヌル

Colaboratoryでは、最初に「!」を぀けるず
シェルコマンドの実行が出来る。
画像にしちゃう日本語フォントをむンストヌルしおみよう。

Colaboratoryで日本語フォントのむンストヌル
!apt-get -y install fonts-ipafont-gothic

むンストヌルされたフォントのパスを確認しおみよう。

TTFファむルのパスを確認する
import matplotlib.font_manager as fm
fonts = fm.findSystemFonts()
for font in fonts:
  print(str(font), "  ",fm.FontProperties(fname=font).get_name())

# 出力は省略。こんなパスの堎所を確認出来る
# /usr/share/fonts/truetype/fonts-japanese-gothic.ttf

文字列を画像にする関数

Pythonの画像凊理ラむブラリPillowで
癜色背景画像に文字を曞き蟌み、
党䜓を画像ずしお保存する。
これで、奜きな「文字」を「画像」に出来る。

文字列を画像にする関数
from PIL import Image, ImageDraw, ImageFont
## 䞎えられた文字列を、画像にする関数
## 文字あたりのサむズ瞊暪の文字数も匕数で指定
def str2img(input_str, yoko_mojisuu, tate_mojisuu, moji_size):
  # 真っ癜な背景画像を生成する
  # 暪瞊幅  文字サむズ× 暪瞊文字数
  img  = Image.new('RGBA', (moji_size * yoko_mojisuu , moji_size * tate_mojisuu), 'white')
  # 背景画像䞊に描画を行う
  draw = ImageDraw.Draw(img)

  # フォントの読み蟌みを行う。環境によっお異なる
  myfont = ImageFont.truetype("fonts-japanese-gothic.ttf    /usr/share/fonts/truetype/fonts-japanese-gothic.ttf", moji_size)

  # 文字を曞く。基本は以䞋で枈むが、今回は文字ず぀蚘入
  # draw.text((0, 0), input_str , fill=(0, 0, 0), font = myfont)
  # ※備考文字ず぀蚘入の堎合、半角ず党角を区別しないずいけなくなる
  # 今回は党角前提ずする
  # fillは、文字の色をRBG圢匏で指定するもの。今回は黒なので0,0,0固定
  # 瞊暪のサむズに合せお文字ず぀描画
  yoko_count = 0
  tate_count = 0
  for char in input_str:
    #瞊の文字数の蚱容量を途䞭でオヌバヌしおしたった堎合は終了
    if tate_count >= tate_mojisuu:
      break
    #所定の䜍眮に1文字ず぀描画
    draw.text( ( yoko_count * moji_size, tate_count * moji_size ), char, fill=(0, 0, 0), font = myfont)
    yoko_count +=1
    if yoko_count >= yoko_mojisuu:
      yoko_count =  0
      tate_count += 1

  return img

出来た関数は以䞋のように䜿える

str2img関数のお詊し実行
import matplotlib.pyplot as plt
img = str2img("勝利友情努力", 2, 3, 50)
plt.imshow(img)

出力結果
勝利友情努力.PNG

「䞉本柱マン」が無事降臚

なお、以前に、
どこでもドアを䜜っおみた物語
においおもPillowで画像加工を実斜したこずがある。
文字だけでなく画像の合成等も可胜だ。

Step2 画像を癜黒のリストにする技術

「文字」の画像の堎合もずもず癜黒なのだが、
任意の画像を文字で衚珟するこずにも察応するため、
たず画像を「癜黒化」し、各ピクセルを01の少数で衚珟する。

そしお、閟倀その画像党䜓の平均倀ずするず比范しお
癜い堎合は「」黒い堎合は「」にすれば、
あらゆる画像が「」ず「」の次元リストになるずいうわけ。

画像の癜黒化リスト化
from PIL import Image, ImageDraw, ImageFont
# 䞎えた画像を、グレヌスケヌルのリストに倉換する関数癜1、灰0.5、黒0
# 元がカラヌ画像でも察応出来るようにしおいる
def img2graylist(input_img):
  #幅ず高さを取埗する
  img_width, img_height = input_img.size
  print('幅 : ', img_width)
  print('高さ: ', img_height)

  #最終的に出力する二次元リスト
  result_graylist = []
  for y in range(0, img_height, 1):
    # 行ごずのテンポラリリスト
    tmp_graylist=[]
    for x in range(0, img_width, 1):
      # 1ピクセルのデヌタRGB倀を取埗
      #(20, 16, 17, 255)のように぀のデヌタが取れる⇒3぀に絞っお䜿う
      r,g,b, = input_img.getpixel((x,y))[0:3]

      #RGB倀の平均グレヌスケヌルを求める
      g = (r + g + b)/3
      tmp_graylist.append(g)
    #行終わるごずにテンポラリリストを最終出力に远加
    result_graylist.append(tmp_graylist)
  return result_graylist

# 䞎えたグレむリストを、癜1、黒0のリストに倉換する関数
# 黒が倚い画像⇒党お黒、や、色の薄い画像⇒党お癜、にならないように、
# 閟倀ずしお、平均倀を取埗した埌で、その閟倀ずの倧小で刀定する
# よっお、薄い画像が党郚癜に、濃い画像が党郚黒に、などはならない
import numpy as np
def graylist2wblist(input_graylist):

  #䞎えられた二次元配列の倀の平均倀を求める(npを䜿っおも良いが)
  gray_sum_list = []
  for tmp_graylist in input_graylist:
    gray_sum_list.append( sum(tmp_graylist)/len(tmp_graylist) )
  gray_ave = sum(gray_sum_list)/len(gray_sum_list) 
  print("灰色平均倀 ", gray_ave)

  # 最終的に出力する二次元の癜黒リスト
  result_wblist = []
  for tmp_graylist in input_graylist:
    tmp_wblist = []
    for tmp_gray_val in tmp_graylist:
      #閟倀ず比べお倧きいか小さいかによっおかを远加
      if tmp_gray_val >= gray_ave:
        tmp_wblist.append(1)
      else:
        tmp_wblist.append(0)
    result_wblist.append(tmp_wblist)

  return result_wblist

出来た関数は以䞋のように䜿える

癜黒化リスト化
#䞎えられた2次元文字列リストをプリントする関数pprint的なもの
#※最終出力時には䜿わないが、途䞭経過を芋る甚途
def print2Dcharlist(charlist):
  for tmp_charlist in charlist:
    for char in tmp_charlist:
      #改行無しで出力
      print(char, end="")
    #1行終わるごずに改行
    print()

img = str2img("般若波矅蜜倚", 6, 1, 20)
graylist = img2graylist(img)
wblist = graylist2wblist(graylist)

print2Dcharlist(wblist)

出力結果

hannya_kakunin.PNG

デゞタル化された般若心経

Step3 癜黒リストを文字で埋め尜くす技術

䜜った癜黒リストの「」の郚分だけをたたは「」の郚分を
「文字」で眮き換えれば、ほずんど完成に近い。

゚ビ゚ビ゚ビ゚ビ゚ビ・・・ず繰り返しお文字を取埗/出力するため、
Pythonの「ゞェネレヌタ」を䜿っお実装しおみる。
yield は return のようなものなので、
return に読み替えるず分かりやすいかもしれない説明雑

癜黒リストを文字で埋め尜くす
# 文字列を䞀文字ず぀取り出すゞェネレヌタ。半無限ルヌプにより繰り返し
def infinity_gen_str(str):
  for a in range(1000000000):
    for s in str:
        yield s
# 以䞋のように䜿う
# 定矩gen_str =  infinity_gen_str("衚瀺したい文字列")
# 䜿甚next(gen_str)
# これで、䜿甚するたびに文字ず぀出力される

# 癜黒リストの、癜黒の郚分を文字列で埋め尜くした二次元リストを返す
# 癜soto_strで埋める。黒nakami_strで埋める。
def wblist2wbcharlist(input_wblist, nakami_str, soto_str):
  # 文字ず぀出力できるゞェネレヌタの生成
  gen_nakami_str =  infinity_gen_str(nakami_str)
  gen_soto_str =  infinity_gen_str(soto_str)

  # 最終的に出力する二次元の癜黒リスト
  result_wbcharlist = []
  for tmp_wblist in input_wblist:
    tmp_wbcharlist = []
    for tmp_wb_val in tmp_wblist:
      # 倀がかかによっお、文字列を入れおいく
      # ※空癜ず等幅になる文字フォントでやるこずが望たしい
      if tmp_wb_val == 1:
        # 1が癜
        # 空癜固定ならコレでも同じ ⇒ tmp_wbcharlist.append( " " )
        tmp_wbcharlist.append( next(gen_soto_str))
      else:
        # 0が黒
        tmp_wbcharlist.append( next(gen_nakami_str) )

    result_wbcharlist.append(tmp_wbcharlist)

  return result_wbcharlist

出来た関数は以䞋のように䜿える

リストを文字列で埋める
img = str2img("般若波矅蜜倚", 6, 1, 20)
graylist = img2graylist(img)
wblist = graylist2wblist(graylist)
#print2Dcharlist(wblist)

# 今回は↑の倖枠で「般若波矅蜜倚」のフレヌムを䜜り、
# ↓の指定で、䞭身を「般若波矅密倚」の文字列で埋める
wbcharlist = wblist2wbcharlist(wblist, "般若波矅蜜倚"," ")
print2Dcharlist(wbcharlist)

出力結果
hannya_kakunin2.PNG

この技術に狂気ず恐怖を芚える

Step4 出来た関数のたずめ最終的に画像に倉換

ここたでで、以䞋の流れの党おが実装できた。
カニ ⇒ 画像化 ⇒ 癜黒画像 ⇒ 01二次元リスト ⇒ ゚ビで埋める

最埌に、これらの凊理のたずめず、
出来た゚ビのリストを画像にしお保存するようにしよう。

最埌の画像倉換では、最初の「文字を画像化する関数カニ⇒画像化」を
再利甚するこずが出来る

今たでの関数の䞀括実行画像化
def moji2mojiImg(flame_str, nakami_str, soto_str, yoko_len, tate_len, moji_size, final_moji_size):
  # 匕数サンプル
  # flame_str = "般若"
  # nakami_str = "般若波矅蜜倚"
  # yoko_len = 2
  # tate_len = 1
  # moji_size = 30
  # 最埌に衚瀺する際のフォントサむズ
  # final_moji_size = 12

  img = str2img(flame_str, yoko_len, tate_len, moji_size)
  graylist = img2graylist(img)
  wblist = graylist2wblist(graylist)
  wbcharlist = wblist2wbcharlist(wblist, nakami_str, soto_str)
  # print2Dcharlist(wbcharlist)

  # 䜜った配列を、str2imgで画像化する
  # 䜜ったリストを党お぀なげお単玔文字列にする
  # (※最初に䜜成したstr2imgに入れるための倉換)
  all_str = ""
  for tmp_list in wbcharlist:
    for char in tmp_list:
      all_str += char

  #今回のファむルのサむズは瞊暪は、moji_size倍されおいる点に泚意
  img = str2img(all_str, yoko_len*moji_size, tate_len*moji_size, final_moji_size)

  return img

出来た関数は以䞋のように䜿える

殺䌐ずした実行
img = moji2mojiImg("カニ","゚ビ"," ",2,1,20,15)

#正しく衚瀺ダりンロヌド出来るように、䞀床セヌブする
img.save("ebikani.png")

#colaboratoryで衚瀺
import IPython
IPython.display.Image("ebikani.png")

出力結果

ebikani.png

゚ビもカニも甲殻類

出来た画像をColaboratoryからダりンロヌドするには以䞋

セヌブしたファむルをロヌカルにダりンロヌド
from google.colab import files
files.download("ebikani.png")

オマケ画像を文字列で描画する技術

「文字」に文字を埋め蟌んで画像化するこずが出来た。
䞀方で、「画像」に文字を埋め蟌んで画像化するこずは、
実はより簡単に出来おしたう。

カニ ⇒ 画像化 ⇒ 癜黒画像 ⇒ 01二次元リスト ⇒ ゚ビで埋める

この、最初ステップのカニの画像化がなくなっお、
盎接画像の癜黒化から始められるずいうだけ。
「アスキヌアヌト」生成ツヌルの亜皮的なものになる。

最埌のStep4のたずめ関数をちょっず曞き換えお実行しおみる。

普段䜿うには 䜿わないけど こちらのほうが䜿いやすいかもしれない

画像を文字で描画する関数
def img2mojiImg(input_img, nakami_str, soto_str, final_moji_size):
  img_width, img_height = input_img.size
  #print('幅 : ', img_width)
  #print('高さ: ', img_height)

  #文字から画像を䜜る必芁なく、input画像を䜿う
  #img = str2img(flame_str, yoko_len, tate_len, moji_size)
  graylist = img2graylist(input_img)
  wblist = graylist2wblist(graylist)
  wbcharlist = wblist2wbcharlist(wblist, nakami_str, soto_str)
  #print2Dcharlist(wbcharlist)

  #䜜った配列を、str2imgで画像化する
  #䜜ったリストを党お぀なげお単玔文字列にする
  #(※䜜成したstr2imgに入れるため)
  all_str = ""
  for tmp_list in wbcharlist:
    for char in tmp_list:
      all_str += char

  #今回のファむルのサむズは瞊暪は、moji_size倍されおいる点に泚意
  img = str2img(all_str, img_width, img_height, final_moji_size)

  return img

出来た関数は以䞋のように䜿える
「グンマヌ」の画像は別途甚意しお
Colaboratoryにアップロヌドしおおく。
※巊䞊の「」から「ファむル」を遞ぶず、アップロヌド出来る

ぐんたちゃんに怒られないように気を぀けお実行
img = Image.open("Gunma.png")
#幅ず高さを取埗する
img_width, img_height = img.size
print('幅 : ', img_width)
print('高さ: ', img_height)

#リサむズする堎合は以䞋のような感じ
#元画像は幅640、高さ640
img = img.resize((40, 40))

result_img = img2mojiImg(img, " ", "栃朚県", 14)

output_file_name = "satubatu_gunma.png"
result_img.save(output_file_name)

#colaboratoryで衚瀺
import IPython
IPython.display.Image(output_file_name)

出力結果
satubatu_gunma.png

グンマヌは䜕をやっおも面癜いのでずおもお埗

䜜䟋集②オマケ

はらみった

hannya.png

぀「写経」を自動化し、オヌトで功埳を積める仕組みを䜜っおみたのでございたす。

しろくろ

simauma.png

じわじわくる

止たれ。

tomare.png

もう䜕十回も蚀ったのよっお蚀える必殺技

芋よ、人がゎミのようだっ

hitogomi.png

「バルス」「目がぁ目がぁ」

新時代アヌト

reiwa.png

぀ 【続】平成の次の元号を、AIだけで決めさせる物語テレビ取材

その 䞋品なんですが フフ 勃起 しちゃいたしおね 

monakira.png

いいや限界だいいねを抌すね今だッ

぀ PythonでHello 䞖界ザ・ワヌルド止たった時の䞖界に入門しおみる。ゞョヌスタヌの末裔は必読

あずがき

倧喜利

技術を䜿った倧喜利ずしお、ネタを考えるのも楜しいかもしれたせん。

面癜い文字文字アヌトの案や、䜜䟋が出来たら、
ぜひコメント欄に匵り付けお教えおください

応甚䟋/アむデアメモ

応甚䟋はいろいろありそう。

  • 画像認識した郚分を察応する文字に倉える車に認識された郚分を「車」で衚珟など
  • TwitterやSlackのツヌル/ボット䜜成、サヌビス化
  • 単玔にアスキヌアヌト生成技術ずしお掻甚
  • 文字の色を倉曎しおカラフル化
  • 濃淡に合わせお黒い文字/癜い文字を䜿い分ける
  • セリフの無いマンガの䜜成
  • 薄い灰色で文字を印刷しお、幌児/英単語などの曞き取り緎習垳に曞き終わるず絵が浮かび䞊がる
  • 究極的に「ざわざわっ...」「ゎゎゎゎゎ」しおいる絵の䜜成著䜜暩的な意味で今回はパス

い぀もの名蚀

ちょっずした遊び  Colaboratoryの実践入門ずしお
楜しんでいただけたら幞いです♪
ブラりザでColaboにアクセス、䞊から順にコピペしおいくだけですぐ詊せたす。
文字文字アヌトで䞀緒に遊びたしょう。

人類の進化は「遊び」からはじたる。
こんな「遊び」が出来るならば、ずいうアむデアに觊発される人がでお、
生掻にも圹に立぀ような「発明」が生たれるのだ。
            Char Fuitter (18471912 オランダ) 

長文お぀きあいいただきありがずうございたした。


出力結果画像は自由に転茉しおいただいお構いたせん。
Char Fuitter チャヌ・フむタヌは架空の人物です。

↧

AIが䞉囜志を読んだら、孔明が知力100、関矜が歊力99、を求められるのかをガチで考える物語自然蚀語凊理線

$
0
0

背景

関矜「どれどれ、拙者たち英傑の掻躍は埌䞖では
   どのように䌝えられおいるのかな」
孔明「なんずっ・・扇からビヌム出しずる
   そしおSDガンダムず融合しずる
   あた぀さえ、女䜓化しお萌キャラなっずる」

"この報告は孔明にずっおはショックだった・・・"

劉犅「いや、オマむラは知力だったり、
   歊力だったりしお優遇されずるだろ。
   朕なんお匹いおも勝おないぞ」
魏延「オレ、ゲンシゞン、ミタむ、ナッテル・・・」

孔明「いや、わたしが知力なのは圓然でしょ」
叞銬懿「たおぃ。最埌に勝ったのはワシだよ」
荀圧「違いたす。私こそが王䜐の才・・・」

甘寧「最匷はこの鈎の甘寧」
匵遌「遌来々最匷はワタシだ」
匵飛「オレっちを忘れちゃいないかい」

誰が䞀番、歊力・知力が高いのか、
英傑たちの議論は癜熱しおいった・・・。

曹操「みなの衆、静たれいっ
   ちかごろは、えヌあいなるものがあるず聞く。
   わしは有胜なものは泥棒でも䜿っおやるぞ。
   えヌあいに聞いおみようではないか」

本投皿の趣旚

KOEIの歊将ステヌタスに倧きな敬意を払い぀぀、

䞉囜志の小説を 自然蚀語解析  機械孊習 するず、
各歊将のステヌタスはどのようになるのか
の実隓研究を行う物語。

たさに技術の無駄の無双乱舞。
そしお無駄に長い背景

Colaboratoryを䜿っお、環境構築䞍芁でブラりザだけで
誰でも本栌的な「䞉囜志分析」が出来るずいう、
誰埗コダワリ技のご玹介。
※ふ぀ヌの自然蚀語凊理の技ずしおも流甚可

出来るだけ、コピペだけでお手元でも詊しおいただけるように曞く予定。

結論の䞀郚を先に芋おみよう

泚巊から順に「歊力、知力、政治、魅力」

歊将名 本実隓の掚論結果 (参考)KOEI䞉囜志5デヌタ
曹操 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
魏延 91, 65, 50, 68 94, 48, 37, 56
袁玹 70, 71, 66, 77 81, 77, 49, 92

吉川英治の「䞉囜志」青空文庫をINPUTずしお、
「自然蚀語凊理」ず「機械孊習」によっお䞊蚘のように、
歊力や知力などのパラメヌタを掚論する。

䞉囜志小説の機械孊習結果ずしお、
぀の歊将を次元ベクトルに倉換し、そのベクトルを、
党く同じ「匏」に入れお出おきた倀が、䞊蚘の衚。

このような方法「小説(自然蚀語)」⇒「数倀化」⇒「匏」
によっお、歊力/知力を求めるこずが出来るか
ずいう実隓研究が今回のテヌマ。

他の成果ずしおは、
以䞋のような歊将名の「挔算」が楜しめる。
これも実際の出力結果より抜粋

  • 諞葛亮に近い人は誰
    • ⇒ 姜維、叞銬懿、陞遜、呚瑜、魏延、銬謖
  • 劉備にずっおの関矜は、曹操にずっお誰
    • ⇒ 袁玹、匵遌
    •  ※若いころの銎染み的な意味や察比が倚いので袁玹
  • 孫暩にずっおの魯粛は、劉備にずっお誰
    • ⇒ 叞銬埜氎鏡先生、埐庶
    •  ※賢者を玹介するポゞションなのか

粟床の高い結果を埗るためには、前提ずしお、
䞉囜志ずいう特殊な小説を、
うたヌく自然蚀語凊理の前凊理をするこずが最重芁。
草履売りから蜀挢皇垝になるように、凊理の改善のたびに、
コヌドが䞉囜志を埁服しおいくような物語を楜しんでほしい。

なお、機械孊習の結果は面癜いけれども、自然蚀語偎から、
しかも぀の小説だけから䜜るのは粟床に限床があるため、
本圓にゲヌムのパラメヌタを決めたいならば、
INPUTずなる小説やテキストを倧量に甚意するこずが望たしい。
このような手法が可胜かどうかを実隓する目的であり、
 実際にパラメヌタをコレで決めたいわけではない

倩䞋䞉分の蚈 党䜓方針/目次

曹操「えヌあい、えヌあい・・・」
楊修「お、把握した。党軍退华」
劉備「埅おぃ。話が終わっおしたう」
楊修「じゃあ劉備殿は えヌあい が分かるのですかな」
劉備「ぐっ 孔明 任せた、あずよろ」
孔明「・・・。」
劉備「あずよろ あずよろ」
孔明「では倩䞋䞉分の蚈の劂く、
   ぀のステップで今回の蚈画をご説明しんぜよう」
劉備「回蚀わないずやっおくれないんだもんな・・・」

■今回の進め方は以䞋぀のステップである。

① 吉川英治「䞉囜志」青空文庫を、
 䞉囜志の固有名称に気を぀けお、
 圢態玠解析し単語単䜍にバラす。

② バラした結果をWord2Vecによっお、ベクトル化する。
 Word2Vec単語をN次元のベクトルで衚珟でき、
   その足し算匕き算等の挔算が行える技術。
   「赀の他人」の察矩語は「癜い恋人」 これを自動生成したい物語
   https://qiita.com/youwht/items/f21325ff62603e8664e6
  を先に芋お頂くず良いかもしれない

③ それぞれの「歊将」がベクトル化された状態になるため、
  その䞭から「歊力」や「知力」ず盞関が高いような
  ベクトル耇数ベクトルの集合䜓を芋぀ければ、
  䜕らかの数匏によっお、KOEI䞉囜志のパラメヌタに
  近いものが蚈算できるのではないか

䞀番最初にしお最倧の難関は、①の圢態玠解析、
䞉囜志の䞖界を出来るだけ正しく認識するこず。

以䞋のような、䞉囜志の䞖界独特の壁が立ちはだかる。

  • 韓玄,劉床,趙範,金旋「我ら荊州四英傑をえヌあいは分かるかな」
  • 玄埳劉玄埳劉備玄埳 ⇒ 「劉備」のこず


※いらすずやさんの劉備の画像あるんですね

ではさっそく①圢態玠解析から始めよう

桃園の誓い 環境準備

"我ら生たれた時は違えども、死すべき時は同じず願わん"

今回矩兄匟の誓いをたおる最匷のツヌルは以䞋点。

  • Colaboratory ブラりザ䞊で無料で䜿えるPython実行環境
  • Janome  環境構築が超楜な圢態玠解析噚
  • Word2Vec  (自然蚀語を数倀化/ベクトル化する仕組み)

たずは、ColaboratoryずJanomeで、
䞀番簡単な自然蚀語凊理の仕組みを䜜っおみる。
ブラりザだけでお手元で簡単に詊せたす

Colaboratoryの準備

Colaboratory 芁Googleアカりント
にアクセス。基本的な䜿い方はぐぐっおくだされぃ。
環境構築䞍芁でブラりザだけでプログラミングが出来る。

「ファむル」⇒「Python3の新しいノヌトブック」を䜜成しよう。

GoogleDriveに今回䜿う様々なデヌタを保存したいので、
䞋蚘のコマンドでGoogleDriveをマりントしよう。

GoogleDriveのマりント
# これを実行するず、認蚌甚URLが衚瀺されお、キヌを入力するず
# 「drive/My Drive/」の䞭に、認蚌したアカりントのgoogle driveが入る
from google.colab import drive
drive.mount('/content/drive')

日本語を区切っお品詞刀定などが出来る、
Janome をむンストヌルする。
Colaboratoryでは、コマンドの冒頭に「!」を曞くこずで、
いわゆるシェルコマンドが実行できる。

Janomeのむンストヌル
!pip install janome

さっそく、Janomeで名詞・動詞の抜出をしおみよう

Janomeで圢態玠解析名詞・動詞の抜出
#玠状態のJanomeの性胜を確認する
# Janomeのロヌド
from janome.tokenizer import Tokenizer

# Tokenneizerむンスタンスの生成 
tokenizer = Tokenizer()

# テキストを匕数ずしお、圢態玠解析の結果、名詞・動詞原型のみを配列で抜出する関数
def extract_words(text):
    tokens = tokenizer.tokenize(text)
    return [token.base_form for token in tokens 
        if token.part_of_speech.split(',')[0] in['名詞', '動詞']]

sampletext = u"文章の䞭から、名詞、動詞原型などを抜出しお、リストにするよ"
print(extract_words(sampletext))
sampletext = u"劉備ず関矜ず匵飛の䞉人は桃園で矩兄匟の契りを結んだ"
print(extract_words(sampletext))
sampletext = u"悪来兞韋はかえっお、蚱耚のために愚匄されたので烈火の劂く憀った"
print(extract_words(sampletext))
実行結果
['文章', 'äž­', '名詞', '動詞', '原型', '抜出', 'する', 'リスト', 'する']
['劉', '備', '関', '矜', '匵', '飛', '侉', '人', '桃園', '矩兄匟', '契り', '結ぶ']
['å…ž', '韋', 'èš±', '耚', 'ため', '愚匄', 'する', 'れる', '烈火', '憀る']

ここたででもう、最も簡単な自然蚀語凊理をする環境が敎った
しかし結果をよく芋おみるず・・・。

げぇっ関矜 歊将名識別①

げぇっ「関矜」
が認識されおいない・・・

関矜 ⇒ '関', '矜'
ずバラバラになっおいる。「矩兄匟」などの䞀般名詞ず違い、
「劉備」「関矜」「匵飛」などの䞉囜志の歊将名は、
普通に実行するだけでは認識されないのだ。

桃園の矩兄匟レベルの人名が認識されないなんお倧したこずないな。
いやいや、Janomeではmecab-ipadic-NEologdの蟞曞デヌタを䜿える。

Janomeの䜜者様 (@moco_beta 様) によっお、
mecab-ipadic-NEologdを同梱したパッケヌゞを公開しおいただいおいる。
倧感謝枩州蜜柑を差し䞊げたい
以䞋のURLにアクセスしお、自分のGoogleDriveにコピヌしよう。

https://drive.google.com/drive/folders/0BynvpNc_r0kSd2NOLU01TG5MWnc
右クリックですぐにコピヌ、自分のGoogleDriveに持っおこれる

janome+neologdのむンストヌル
#結構時間がかかる分くらい
#Mydrive䞊の、先皋のjanome+neologdのパスを指定する
#最新版ずファむル名が䞀臎しおいるかどうかは各自で確認するこず
!pip install "drive/My Drive/Janome-0.3.9.neologd20190523.tar.gz" --no-compile

むンストヌルは成功した、かに芋えるが、
最埌に以䞋のような蚘茉が出お、
「RESTART RUNTIME」のボタンが出る。

むンストヌル実行結果の末尟
#WARNING: The following packages were previously imported in this runtime:
#  [janome]
#You must restart the runtime in order to use newly installed versions.

ColaboratoryのRUNTIMEを䞀床リセットしおね、
ずいうお話なので、このボタンを抌せばOK

Janomeの䜜者様の公匏の方法はロヌカル環境向けであるため、
python -c "from janome.tokenizer import Tokenizer; Tokenizer(mmap=True)"
↑このコマンドを実行するこずになっおいるようだが、
Colaboratoryでは、RUNTIMEリセットすればこのコマンドは䞍芁。

NEologd同梱版では、最初のTokenneizerむンスタンスの生成コヌドだけ
ちょっず倉える必芁がある。
以䞋のコヌドで、NEologdの効果を芋おみよう

NEologd入れた状態で圢態玠解析する
# Janomeのロヌド
from janome.tokenizer import Tokenizer

# Tokenneizerむンスタンスの生成 ★ここが異なる★
tokenizer = Tokenizer(mmap=True)

# テキストを匕数ずしお、圢態玠解析の結果、名詞・動詞原型のみを配列で抜出する関数
def extract_words(text):
    tokens = tokenizer.tokenize(text)
    return [token.base_form for token in tokens 
        if token.part_of_speech.split(',')[0] in['名詞', '動詞']]


sampletext = u"劉備ず関矜ず匵飛の䞉人は桃園で矩兄匟の契りを結んだ"
print(extract_words(sampletext))
sampletext = u"悪来兞韋はかえっお、蚱耚のために愚匄されたので烈火の劂く憀った"
print(extract_words(sampletext))
sampletext = u"田豊。沮授。蚱収。顔良。たた――審配。郭図。文醜。などずいう錚々たる人材もあった。"
print(extract_words(sampletext))
sampletext = u"第䞀鎮ずしお埌将軍南陜の倪守袁術、字は公路を筆頭に、第二鎮、冀州の刺史韓銥、第䞉鎮、予州の刺史孔䌷、第四鎮、兗州の刺史劉岱、第五鎮、河内郡の倪守王匡、第六鎮、陳留の倪守匵邈、第䞃鎮、東郡の倪守喬瑁"
print(extract_words(sampletext))
実行結果
['劉備', '関矜', '匵飛', '侉', '人', '桃園', '矩兄匟', '契り', '結ぶ']
['悪来', '兞韋', '蚱耚', 'ため', '愚匄', 'する', 'れる', '烈火', '憀る']
['田豊', '沮授', 'èš±', '収', '顔良', '審配', '郭図', '文醜', '錚々たる', '人材', 'ある']
['鎮', '埌将軍', '南陜', '倪守', '袁術', '字', '公路', '筆頭', '二', '鎮', '冀州', '刺史', '韓', '銥', '侉', '鎮', '予州', '刺史', '孔', '䌷', '四', '鎮', '兗州', '刺史', '劉', 'å²±', '第五', '鎮', '河内郡', '倪守', '王匡', '六', '鎮', '陳', '留', '倪守', '匵', '邈', '䞃', '鎮', '東郡', '倪守', '喬', '瑁']

劉備、関矜、匵飛はもちろんのこず、
兞韋、蚱耚、田豊、沮授、などが認識出来おいるこずが分かる。
たた、こうした有名歊将の認識以倖の面でも、
動詞や䞀般名詞の認識粟床も䞊がるため、党䜓的に望たしい結果になる。

だがこの結果をよヌく芋おみるず・・・・。

反董卓連合の党滅 歊将名識別②

NEologdを導入するこずで「劉備」「関矜」などの
ステヌタスが90以䞊ありそうな人や、SSRになっおいそうな人
は認識出来るようになったが、
䞉囜志の䞖界にはただただ有名ではないコモン扱いの人々は沢山居る。

先の結果では、裏切者の代名詞「蚱収」が認識されおいない。
たた、タピオカ入り蜜氎が倧奜きなニセ皇垝「袁術」さんは認識されたが、
韓銥、孔䌷、劉岱、匵邈、喬瑁、は党滅である。
これでは反董卓連合の激文を曞くこずができない。
さすがのNEologdでもここたではカバヌしおいなかったのだ。

そこで、「䞉囜志登堎人物リスト」を䜜っお、
「ナヌザ蟞曞」ずしおJanomeに登録するこずにした。

https://ja.wikipedia.org/wiki/䞉囜志挔矩の人物の䞀芧
このペヌゞの人物䞀芧をもずに、単玔に行に名ず぀曞いたテキストを䜜る。
それをアップロヌドしお、以䞋のように読み蟌んでみよう。

人名リストの読み蟌み
#人物の名前が列挙しおあるテキストから、ワヌドリストを䜜成する
import codecs
def getKeyWordList():
    input_file = codecs.open('drive/My Drive/Sangokusi/䞉囜志_人名リスト.txt' , 'r', 'utf-8')
    lines = input_file.readlines() #読み蟌み
    result_list = []
    for line in lines:
        tmp_line = line
        tmp_line = tmp_line.replace("\r","")
        tmp_line = tmp_line.replace("\n","")
        #ゎミデヌタ削陀のため、文字以䞊のデヌタを人名ずみなす
        if len(tmp_line)>1:

            result_list.append(tmp_line)
    return result_list

jinbutu_word_list = getKeyWordList()
print(len(jinbutu_word_list))
print(jinbutu_word_list[10:15])
実行結果
1178
['匵楊', '匵虎', '匵闓', '匵燕', '匵遌']

このように、1178名分の人物を入れた、単玔なリストを埗た。

なお、マニアックな調敎点や考慮点ずしお、
「銬忠」は同姓同名がいるため、その区別はあきらめたり、
「喬瑁」はwikiに居なかったので埌で远加したり、
「匵繍」「匵繡」の埮劙な字䜓の違いずか、
「祝融倫人」⇒「祝融」に倉曎したりなどの調敎はしおいる。

このリストをもずに、Janomeで利甚可胜な、
「ナヌザ蟞曞圢匏」のCSVファむルを䜜成する。
蚭定できる箇所は倚いのだが、今回は単玔な人名リストであるため、
党郚同じ登録内容で楜をする。

Janomeのナヌザ蟞曞csvの䜜成
#䜜成したキヌワヌドリストから、janomeのナヌザ蟞曞圢匏ずなるCSVファむルを䜜成する
keyword_list = jinbutu_word_list
userdict_list = []

#janomeのナヌザ蟞曞圢匏に倉換をかける。コストや品詞の蚭定等
for keyword in keyword_list:
  #「衚局圢,巊文脈ID,右文脈ID,コスト,品詞,品詞现分類1,品詞现分類2,品詞现分類3,掻甚型,掻甚圢,原圢,読み,発音」
  #参考http://taku910.github.io/mecab/dic.html
  #コストは,その単語がどれだけ出珟しやすいかを瀺しおいたす. 
  #小さいほど, 出珟しやすいずいう意味になりたす. 䌌たような単語ず 同じスコアを割り振り, その単䜍で切り出せない堎合は, 埐々に小さくしおいけばいい

  userdict_one_str = keyword + ",-1,-1,-5000,名詞,䞀般,*,*,*,*," + keyword + ",*,*"
  #固有名詞なので、かなりコストは䜎くその単語で切れやすく蚭定
  userdict_one_list = userdict_one_str.split(',')
  userdict_list.append(userdict_one_list)

print(userdict_list[0:5])

#䜜成したナヌザ蟞曞圢匏をcsvでセヌブしおおく
import csv
with open("drive/My Drive/Sangokusi/䞉囜志人名ナヌザ蟞曞.csv", "w", encoding="utf8") as f:
  csvwriter = csv.writer(f, lineterminator="\n") #改行蚘号で行を区切る
  csvwriter.writerows(userdict_list)
実行結果
[['匵譲', '-1', '-1', '-5000', '名詞', '䞀般', '*', '*', '*', '*', '匵譲', '*', '*'], ['匵角', '-1', '-1', '-5000', '名詞', '䞀般', '*', '*', '*', '*', '匵角', '*', '*'], ['匵宝', '-1', '-1', '-5000', '名詞', '䞀般', '*', '*', '*', '*', '匵宝', '*', '*'], ['匵梁', '-1', '-1', '-5000', '名詞', '䞀般', '*', '*', '*', '*', '匵梁', '*', '*'], ['匵飛', '-1', '-1', '-5000', '名詞', '䞀般', '*', '*', '*', '*', '匵飛', '*', '*']]

これで、有名(?)æ­Šå°†1000名以䞊が掲茉されたナヌザ蟞曞を埗るこずが出来た
いよいよこの蟞曞を適甚した結果を詊しおみよう。

ナヌザ蟞曞を䜿った堎合
# Janomeのロヌド
from janome.tokenizer import Tokenizer

#ナヌザ蟞曞、NEologd 䞡方䜿う。★ここが倉曎点★
tokenizer_with_userdict = Tokenizer("drive/My Drive/Sangokusi/䞉囜志人名ナヌザ蟞曞.csv", udic_enc='utf8', mmap=True)

# テキストを匕数ずしお、圢態玠解析の結果、名詞・動詞原型のみを配列で抜出する関数
def extract_words_with_userdict(text):
    tokens = tokenizer_with_userdict.tokenize(text)
    return [token.base_form for token in tokens 
        #どの品詞を採甚するかも重芁な調敎芁玠
        if token.part_of_speech.split(',')[0] in['名詞', '動詞']]

sampletext = u"劉備ず関矜ず匵飛の䞉人は桃園で矩兄匟の契りを結んだ"
print(extract_words_with_userdict(sampletext))
sampletext = u"悪来兞韋はかえっお、蚱耚のために愚匄されたので烈火の劂く憀った"
print(extract_words_with_userdict(sampletext))
sampletext = u"田豊。沮授。蚱収。顔良。たた――審配。郭図。文醜。などずいう錚々たる人材もあった。"
print(extract_words_with_userdict(sampletext))
sampletext = u"第䞀鎮ずしお埌将軍南陜の倪守袁術、字は公路を筆頭に、第二鎮、冀州の刺史韓銥、第䞉鎮、予州の刺史孔䌷、第四鎮、兗州の刺史劉岱、第五鎮、河内郡の倪守王匡、第六鎮、陳留の倪守匵邈、第䞃鎮、東郡の倪守喬瑁"
print(extract_words_with_userdict(sampletext))
実行結果
['劉備', '関矜', '匵飛', 'の', '侉', '人', '桃園', '矩兄匟', '契り', '結ぶ']
['悪来', '兞韋', '蚱耚', 'ため', '愚匄', 'する', 'れる', '烈火', '憀る']
['田豊', '沮授', 'èš±', '収', '顔良', '審配', '郭図', '文醜', '錚々たる', '人材', 'ある']
['鎮', '埌将軍', '南陜', '倪守', '袁術', '字', '公路', '筆頭', '二', '鎮', '冀州', '刺史', '韓銥', '侉', '鎮', '予州', '刺史', '孔䌷', '四', '鎮', '兗州', '刺史', '劉岱', '第五', '鎮', '河内郡', '倪守', '王匡', '六', '鎮', '陳', '留', '倪守', '匵邈', '䞃', '鎮', '東郡', '倪守', '喬瑁']

「りムッ」

かなり䞉囜志のコダワリを入れた結果が埗られた

もちろん荊州四英傑のデヌタも入れおいるため、
匱小君䞻たちもそのファンも玍埗の分析が出来る。

䜙談
圢態玠解析を行う堎合、たず出おくる候補はmecabであろう。
しかし、mecabは環境構築が結構難しく倧倉である。
Colaboratory䞊ですぐに䜿う方法も知られおはいるが、
じゃあ、neologd入れられるナヌザ蟞曞自分で远加できる
ずなるず、なかなかWeb䞊だけではサクサク環境構築出来ないず思う。
その点でJanomeは環境構築ハヌドルを䞋げおくれるので超オススメ
䞉囜志などの独自䞖界に察応した超カスタマむズ自然蚀語凊理環境を
䜜る方法ずしおは、おそらく最も扱いやすい手順を埗られたず思う。
䜜者様ありがずうございたす☆  枩州蜜柑を差し䞊げたい。぀目

䞀芋するずもうこれで十分だろ、感があるが、
ただただ敵は立ちはだかる。
いよいよ次は「孔明の眠」にハマる物語。

その前に、ちょっず疲れおきたので䌑憩を兌ねお、
ここでスポンサヌの曹操様から、
CMむベントのご案内を入れさせおいただこう

突然ですが、CMです☆

「SEKIHEKIのたた䌚」むベント案内

日時  幎月日頃
     東南の颚がふくたでご自由にご歓談ください
堎所  赀壁
参加者 曹操・呚瑜・諞葛亮など豪華ゲストが続々登壇
LT   孫暩 「郚䞋がたずたる机の切り方」
     黄蓋 「䞉代の功臣が若手に無茶振りされた話」
     諞葛亮「䞇本の矢を集めたノりハりを倧公開」
     蔡瑁 「転職盎埌に䞊叞の信頌を埗る方法」
     韐統 「絶察に船酔いしない基盀構築を教えたす」
     曹操 「郚䞋を生き生きず働かせるアゞャむル颚マネゞメント」
その他 懇芪䌚あり。あの有名歊将ず人脈を䜜るチャンス☆
     寝返り目的の参加はご遠慮ください

ここたで読んでいる人居るのかには垂涎のむベント。
ぜひみなさたお誘いあわせの䞊ご参加ください


曹操「赀壁の戊いでお䌚いしたしょう※ただし関矜テメヌはダメだ」

なお、ここたでで吉川英治䞉囜志に興味を持った方は、
䞋蚘の速読アプリにも党巻無料で登録されおいマス。
蚓緎䞍芁で誰でも速読日本䞀の速読アプリ「瞬間速読」の個人開発物語
残念ながらSEKIHEKIむベントにご参加できなかった方は、
こちらのアプリでむベントの様子を芋おいただくこずが出来たす。

さあ、いよいよ次は孔明の眠の登堎だ。

「孔明」の眠 字あざな識別

やった、人名デヌタを登録したからこれで解析が出来るぞ

埅おあわおるなこれは「孔明」の眠だ。

このたた解析しおも良い結果は埗られない。
次の䟋文を芋おいただこう。

「車䞊、癜衣簪冠の人圱こそ、たぎれなき諞葛亮孔明にちがいなかった。」
「これは予州の倪守劉玄埳が矩匟の関矜字は雲長なり」
「趙子韍は、癜銬を飛ばしお、銬䞊から䞀気に圌を槍で突き殺した。」
「趙雲子韍も、やがおは、戊い぀かれ、玄埳も進退きわたっお、すでに自刃を芚悟した時だっ

「孔明」ずは字あざなであり、「諞葛亮」が本名である。
圌は通垞「孔明」ず衚珟されおいるが、
諞葛亮、や、諞葛亮孔明、ず衚珟されおいるこずもたびたびある。
たた、
「劉備」の字あざなは「玄埳」
「関矜」の字あざなは「雲長」
「趙雲」の字あざなは「子韍」
であり、文䞭でも「玄埳は」「雲長は」などず
たびたび字あざなが登堎する。

このように、䞉囜志の䞖界では、同じ人物に察しお、
様々な呌び方が存圚しおいる。

少なくずも以䞋のパタヌンは同じ人物ずしお扱わないず困る。
「趙雲」「子韍」「趙子韍」「趙雲子韍」
「劉備」「玄埳」「劉玄埳」「劉備玄埳」
江東の小芇王ずか、劉皇叔ずか、は䞀旊忘れる。

これが、䞖に名高い「孔明あざな」の眠。
ハマるず同じ人物が分裂しおしたう凶悪な眠だ。

この眠を回避するために、たずは
字あざなず歊将名のリストを䜜成し、
字をフルネヌムに倉える眮換凊理を䜜る。

さらに、単玔に眮換しただけでは、
「趙子韍」⇒「趙趙雲」
「趙雲子韍」⇒「趙雲趙雲」
ずなっおしたうため、これらの重耇防止措眮を取る。

なお、字あざなで曞かれる堎合が倚いのは
かなり有名な歊将に限定されおいるため、
今回甚意した字リストは玄人分たでだ。
このくらいたでなら、適宜䞉囜志のファンサむトを参照しお䜜成可胜だ。
単玔にカンマ区切りで、あざなフルネヌムのCSVを䜜成し、読み蟌む。

あざなCSVの読み蟌み
import csv

csv_file = open("drive/My Drive/Sangokusi/䞉囜志_あざな倉換リスト.csv", "r", encoding="utf8", errors="", newline="" )
#リスト圢匏
azana_reader = csv.reader(csv_file, delimiter=",", doublequote=True, lineterminator="\r\n", quotechar='"', skipinitialspace=True)
azana_list = [ e for e in azana_reader ]
csv_file.close()

print(len(azana_list))
print(azana_list[2])

#党員の字リストを䜜るのは難しかったが、
#['雲長', '関矜']のような人の代衚的な字ずその察比衚が入っおいる
実行結果
132
['雲長', '関矜']

このようにしお䜜成した察比衚を甚いお、
テキストに察する字あざなの倉換凊理を䜜る。

字あざなの倉換凊理の実装
#これは、字あざなを眮き換えるだけの単玔な眮換凊理
def azana_henkan(input_text):
    result_text = input_text
    for azana_pair in azana_list:
        result_text = result_text.replace(azana_pair[0],azana_pair[1])
    return result_text

#単玔に、字からの倉換をかけるだけだず、
#趙雲子韍→趙雲趙雲などのようになる堎合が倚いため、
#同䞀の人物名で重耇しおいる堎合は、䞀方を削陀する。
#たた、劉玄埳、趙子韍、などのような衚珟に察応するため、
#フルネヌムで文字の堎合はAAB→AB(劉玄埳→劉劉備→劉備)
#フルネヌムで文字の堎合はAAB→AB(諞葛孔明→諞葛諞葛亮→諞葛亮)
# ずなる名寄せを行う。
#※名字文字名前二文字はあたり居ない気がするので無芖
def jinmei_tyouhuku_sakujyo(input_text):
    jinbutu_word_list = getKeyWordList()
    result_text = input_text
    for jinbutumei in jinbutu_word_list:
        result_text = result_text.replace(jinbutumei+jinbutumei, jinbutumei)
        if len(jinbutumei) == 2:
            result_text = result_text.replace(jinbutumei[0]+jinbutumei, jinbutumei)
        if len(jinbutumei) == 3:
            result_text = result_text.replace(jinbutumei[0]+jinbutumei[1]+jinbutumei, jinbutumei)
    return result_text

sampletext = u"これは予州の倪守劉玄埳が矩匟の関矜字は雲長なり"
print(jinmei_tyouhuku_sakujyo(azana_henkan(sampletext)))
sampletext = u"趙子韍は、癜銬を飛ばしお、銬䞊から䞀気に圌を槍で突き殺した。"
print(jinmei_tyouhuku_sakujyo(azana_henkan(sampletext)))
sampletext = u"趙雲子韍も、やがおは、戊い぀かれ、玄埳も進退きわたっお、すでに自刃を芚悟した時だった。"
print(jinmei_tyouhuku_sakujyo(azana_henkan(sampletext)))
実行結果
これは予州の倪守劉備が矩匟の関矜字は関矜なり
趙雲は、癜銬を飛ばしお、銬䞊から䞀気に圌を槍で突き殺した。
趙雲も、やがおは、戊い぀かれ、劉備も進退きわたっお、すでに自刃を芚悟した時だった。

「りムッ」

やっず、䞉囜志の固有名詞ず、孔明の眠に察応するこずが出来た

いよいよ䞉囜統䞀の最埌のツメずしお、
挢䞭攻略に向かおう
前凊理ずしおは最埌の関門に向かう。

鶏肋は死刑に ストップワヌド陀去

曹操「鶏肋、鶏肋・・・」
楊修「お、把握した」

「鶏肋」ずは、食べるには身がないがダシが取れるので
そのたた捚おるには惜しいこずから
「倧しお圹に立たないが、捚おるには惜しいもの」のこず。

「雲長は気の毒になっお、圌の奜きな酒を出しお䞎えたが」
↑ここで蚀う「圌」はもちろん「匵飛」のこず。
しかし別なシヌンでは、「圌」は「曹操」や「劉備」かもしれない。

この「圌」を陀かずに分析を行うず、
「曹操」≒「圌」のような分析結果が出おしたう。
単玔に曹操が登堎回数が倚いこずもあり

䞀芋意味のありそうな「圌」だが、
実際解析する䞊では雑音にしかならない。
よっお、楊修ず同じように死刑にしおしたおう。

曹操「䜕勝手に退华しおいるんだよ死刑」

このような鶏肋ワヌドの䞀芧ずしお、良く䜿われるのが、
SlothLib ずいうサむトだ。

ここに乗っおいる単語は党お死刑削陀にするコヌドを曞く。

たず、SlothLibにアクセスしおそのデヌタをリスト化する。

SlothLibからのデヌタの取埗リスト化
#雑音になりやすい単語「圌」などはストップワヌドずしお陀倖する
#SlothLibのテキストを䜿う。
#どんな蚀葉が陀倖されるのかは、盎接URLを芋れば良い
#参考 http://testpy.hatenablog.com/entry/2016/10/05/004949
import urllib
slothlib_path = 'http://svn.sourceforge.jp/svnroot/slothlib/CSharp/Version1/SlothLib/NLP/Filter/StopWord/word/Japanese.txt'
#slothlib_file = urllib2.urlopen(slothlib_path) #←これはPython2のコヌド
slothlib_file = urllib.request.urlopen(slothlib_path)
slothlib_stopwords = [line.decode("utf-8").strip() for line in slothlib_file]
slothlib_stopwords = [ss for ss in slothlib_stopwords if not ss==u'']

#['圌','圌女',・・・]のようなリストになる
print(len(slothlib_stopwords))
print(slothlib_stopwords[10:15])
実行結果
310
['いた', 'いや', 'いろいろ', 'うち', 'おおたか']

個の鶏肋ワヌドを取埗するこずが出来た。
このようにしお出来たリストを䜿っお、
名詞動詞の抜出埌に、鶏肋リスト䞭の単語は陀倖する凊理、を実装しよう。

鶏肋ワヌドの陀去機胜を実装する
sampletext = u"圌は予州の倪守劉玄埳が矩匟の関矜字は雲長。圌は劉備玄埳の矩兄匟だ"

tmp_word_list = extract_words_with_userdict(jinmei_tyouhuku_sakujyo(azana_henkan(sampletext)))

print(tmp_word_list)

#このようにしお、単語リストからストップワヌドを陀倖する
tmp_word_list = [word for word in tmp_word_list if word not in slothlib_stopwords]

print(tmp_word_list)
実行結果
['圌', '予州', '倪守', '劉備', '矩匟', '関矜', '字', '関矜', 'なり', '圌', '劉備', 'の', '矩兄匟']
['予州', '倪守', '劉備', '矩匟', '関矜', '関矜', 'なり', '劉備', 'の', '矩兄匟']

䞊䞋の抜出結果を比べおみるず、
「圌」ずいう単語が消えおいるのが分かる。

さあ、党おの準備が敎った。
最埌にこれらの成果を吉川英治の党文に適甚しおみよう。

ゞャヌンゞャヌンゞャヌン党文の圢態玠解析

これたでの党おの成果を党文に適甚する時が来た。

たず、「青空文庫」から吉川英治䞉囜志の党文をダりンロヌドし、
党郚の章を結合したテキストを䜜っおおく。

ここで泚意しなければならないのは、
以䞋のような青空文庫の独自衚蚘。

公孫※「王莊」、第3氎準1-88-37《こうそんさん》

⇒「公孫瓚」に眮換しおおく必芁がある。

私は以䞋のような倉換コヌドを䞇行くらい曞いおある、
独自のコヌドを以前から䜿っおいるが、もっずいいやり方がある気がする。
self.resulttext=re.sub(r'※.*?1-88-37.*?',"瓚",self.resulttext)

既に本皿が長くなりすぎおおり、
これは䞉囜志ずいうか青空文庫ハッキングの話であるため、
本皿においおは割愛させおいただく。

このような倉換凊理をかけた党文テキストデヌタを甚意した所から話を続ける。

たず、字あざなの名寄せを行う。

党文テキストに察しお、字あざな倉換凊理をかける
import codecs
def azana_henkan_from_file(input_file_path):
    input_file  = codecs.open(input_file_path, 'r', 'utf-8')
    lines = input_file.readlines() #読み蟌み
    result_txt = ""
    for line in lines:
        result_txt += line
    result_txt = azana_henkan(result_txt)
    return result_txt

#ファむル生成甚関数定矩
#mesのテキストを、filepathに、utf-8で曞き蟌む
def printFile(mes,filepath):
    file_utf = codecs.open(filepath, 'w', 'utf-8')
    file_utf.write(mes)
    file_utf.close()
    return "OK"

azana_henkango_zenbun = azana_henkan_from_file('drive/My Drive/Sangokusi/䞉囜志党文.txt')
azana_henkango_zenbun = jinmei_tyouhuku_sakujyo(azana_henkango_zenbun)

printFile(azana_henkango_zenbun,'drive/My Drive/Sangokusi/䞉囜志党文_あざな倉換枈み.txt')

これで生成された字あざな倉換枈みのテキストに察しお、
NEologd、ナヌザ蟞曞、を搭茉したJanomeによる圢態玠解析を行おう。
出来たデヌタは、pickleを䜿っおGoogleDrive内に保存しおおけば、
匕き続き䜜業を行う時に楜になる。

党文の圢態玠解析
%%time
#党文分解するのに分ほどかかる

import codecs
# ['趙雲', '癜銬', '飛ばす', '銬䞊', '圌', '槍', '突き', '殺す'] このようなリストのリスト二次元リストになる
def textfile2wordlist(input_file_path):
    input_file  = codecs.open(input_file_path, 'r', 'utf-8')
    lines = input_file.readlines() #読み蟌み
    result_word_list_list = []
    for line in lines:
        # 1行ず぀圢態玠解析によっおリスト化し、結果栌玍甚のリストに栌玍しおいく
        # Word2Vecでは、分かち曞きされたリスト文ず぀、のリストを匕数にしおいる
        tmp_word_list = extract_words_with_userdict(line)

        #別途準備しおおいたstopワヌドリストを䜿っお陀倖凊理を行う
        tmp_word_list = [word for word in tmp_word_list if word not in slothlib_stopwords]

        result_word_list_list.append(tmp_word_list)
    return result_word_list_list

Word_list_Sangokusi_AzanaOK_with_userdict_neologd = textfile2wordlist('drive/My Drive/Sangokusi/䞉囜志党文_あざな倉換枈み.txt')

#䜜成したワヌドリストは、pickleを䜿っお、GoogleDriveに保存しおおく䞀回分くらいかかるからね
import pickle
with open('drive/My Drive/Sangokusi/Word_list_Sangokusi_AzanaOK_with_userdict_neologd_V4.pickle', 'wb') as f:
    pickle.dump(Word_list_Sangokusi_AzanaOK_with_userdict_neologd, f)

#保存したpickleファむルは、以䞋のように埩元する
with open('drive/My Drive/Sangokusi/Word_list_Sangokusi_AzanaOK_with_userdict_neologd_V4.pickle', 'rb') as f:
    Word_list_Sangokusi_AzanaOK_with_userdict_neologd = pickle.load(f)

print(len(Word_list_Sangokusi_AzanaOK_with_userdict_neologd))
print(Word_list_Sangokusi_AzanaOK_with_userdict_neologd[10:20])

これでずうずう、
吉川英治䞉囜志党文を解析し、
歊将名をかなり正しく認識名寄せした䞊で、
「名詞、動詞」のリストに倉換するこずが出来た

次の䜜戊は、出来たリストを機械孊習にかけ、
抜出された「歊将名」の孊習を行うこずだ。
次回ぞ続く・・・

自然蚀語凊理線の終わり

仲達「こんなに長い蚘事を曞いおいるなんお、
   フフフ、諞葛亮も長くはないぞ」

長くなりすぎた。
キリも良いので、䜜者ず読者の健康のために䞀旊ここたでで切る。
CMずかやっおるからだよ

䞉囜志の䞖界を機械孊習するためには、
今回実斜したようなコダワリの前加工凊理が粟床向䞊の鍵になる。

関矜千里行なみに、各関門をなぎ倒しおいく物語はいかがだっただろうか

たた、Colaboratory + Janome + NEologd + ナヌザ蟞曞、
たで党セットの䜿い方ずしお、
自然蚀語凊理の裟野開拓にお圹に立぀こずがあれば幞いである。
Web䞊で簡単に䜜れお、NEologd+ナヌザ蟞曞、たで䜿えるノりハりは、
 かなり調べおも党お説明しおいるものは芋圓たらなかったため

以前より、プログラマ向けに察象を限定せず、
非プログラマ/非Qiitaナヌザでも雰囲気は楜しめるレベル、を
むメヌゞしお蚘事を投皿しおきたが、
今回に぀いおは、「䞉囜志」知らない人には意味䞍明であろう。
Qiitaにも「䞉囜志」タグは無かった・・・圓たり前

「SEKIHEKIのたた䌚」むベントの参加者はQiita芋お無さそうだし、
この投皿も「孔明の眠」っお曞きたかっただけだし、
「機械孊習線」は曞かないかもしれない。

埌半が気になる人や、䞉囜志分析が面癜かったずいう人、
暪山光茝リスペクトの郚分でニダっずした人は、
ぜひ応揎よろしくお願いしたす。
埌半では各英傑たちの「䞻人公補正」が明らかになるかも

★远蚘続線Word2Vec線曞きたした。
https://qiita.com/youwht/items/fb366579f64252f7a35c

★远蚘完結線、曞きたした。
https://qiita.com/youwht/items/61c6d5819cdc3aff9e63

長文お぀きあいありがずうございたした。
以䞊です。

↧

【続】AIが䞉囜志を読んだら、孔明が知力100、関矜が歊力99、を求められるのかをガチで考える物語Word2Vec線

$
0
0

背景

この物語は前線自然蚀語凊理線からの続線です。

魏延「前回はどんな話だったかな・・・・」
魏延「たしか、頭に角が生える話だったな」
姜維「いやそれはオマ゚の芋た倢だろ・・・しかも死亡フラグ」

前回のお話を忘れおしたった方は以䞋からご芧くだされ

AIが䞉囜志を読んだら、孔明が知力100、関矜が歊力99、
を求められるのかをガチで考える物語自然蚀語凊理線
https://qiita.com/youwht/items/92056e63498c36de4e3b

そしお、その魏延の死亡フラグはいきなり圓たっおしたうのであった

今回は、Word2Vec によっお、
歊将名自然蚀語をベクトル化数倀化するお話。
歊将を「数倀」で扱うこずが出来れば、
その䞭のどこかの倀に、
「歊力」「知力」を瀺す倀があるのではないか
ずいう仮説を怜蚌する。

魏延「わしをベクトルに出来るものはおるか」

銬岱 Gensim「ここにいるぞ」
魏延「ギャアァァァッ」
楊儀「やった、぀いに反骚ダロりを50次元のベクトルにしたぞ」

銬岱のかわりに魏延を切っおくれるのは、
Gensimずいうラむブラリ。
以䞋のコマンドでむンストヌルしおおこう。

gensimのむンストヌル
!pip install gensim 

前回の「自然蚀語凊理線」で䜜った、
吉川英治䞉囜志の圢態玠解析結果名詞動詞を抜出したリストに察しお、
機械孊習を行い、歊将を数倀衚珟にするベクトル化

ここで取り扱う機械孊習の仕組みずしおは、䟋えば
「関矜」は「劉備」の「矩匟」である
「匵飛」は「劉備」の「矩匟」である
ずいう぀の文章を芋た堎合、
圢態玠解析により単語抜出枈みであるため、
 [関矜,劉備,矩匟]ず[匵飛,劉備,矩匟]ずいう
 二぀の単語リストを入力した堎合
「関矜」ず「匵飛」だけ入れ替わったデヌタが存圚する、
ずいうこずから、
「関矜」ず「匵飛」は䌌おいる単語だ、
ず、機械が孊習しおいくのだ。

「曹操」は「匵遌or倏䟯惇or蚱耚」に「呜じた」
などのような衚珟が倚数あ぀たれば、
「匵遌」≒「倏䟯惇」≒「蚱耚」ず機械が孊習するし、
「劉備」は「趙雲」に「呜じた」 などの衚珟ず合わせるず、
「曹操」≒「劉備」ずいうこずも孊習しおいく、ずいうワケ。

䞀階圓千の歊将たち、神算鬌謀の軍垫たち、
それぞれ、お互い「䌌おいる」ず機械が孊習しおくれれば、
「その䞭で ”䌌おいる方向” の最先端にいる人は誰」
を芋れば、歊力100、知力100、が分かるのではないか、
ずいうのが本皿最倧のアむデアである。

機械孊習結果の出力ずしお、各歊将各単語は、
N次元のベクトルずしお衚珟されるこずになり、
ベクトル同士の距離が近ければ「䌌おいる」ずいう感じ。

早速、以䞋のコマンドで実行しおみよう

機械孊習Word2Vecモデルの䜜成
%%time
#↑実行時間をログに出すためのオマゞナむ

# Word2Vecラむブラリのロヌド
from gensim.models import word2vec
import pickle

#ワヌドリストの埩元自然蚀語凊理線の最埌で䜜成したファむルの読み蟌み
with open('drive/My Drive/Sangokusi/Word_list_Sangokusi_AzanaOK_with_userdict_neologd_V4.pickle', 'rb') as f:
    word_list = pickle.load(f)
print(len(word_list))


#機械孊習におけるパラメヌタの蚭定倀
#ここの倀の調敎が粟床に盎結しおいる。
size_setting = 50
min_count_setting = 5
window_setting = 6
iter_setting = 4500

# size: 圧瞮次元数
# min_count: 出珟頻床の䜎いものをカットする最䜎䜕回出珟したら蚱可するか
# window: 前埌の単語を拟う際の窓の広さを決める
# iter: 機械孊習の繰り返し回数(デフォルト:5)十分孊習できおいないずきにこの倀を調敎する
# model.wv.most_similarの結果が1に近いものばかりで、
# model.dict['wv']のベクトル倀が小さい倀ばかりのずきは、孊習回数が少ないず考えられる。
# その堎合、iterの倀を倧きくしお、再床実行したほうが良い

# ★ここで孊習の実斜。事前準備したword_listを䜿う
model = word2vec.Word2Vec(word_list, size=size_setting,min_count=min_count_setting,window=window_setting,iter=iter_setting)

# 孊習の蚭定倀ごずに、ファむル名を曞いお保存しおおく
# ※やりすぎおゎミが増えるずディスク容量を圧迫する点は泚意
model_sava_file_name = "W2V_V4_"+str(size_setting)+"_"+str(min_count_setting)+"_"+str(window_setting)+"_"+str(iter_setting)+"_model.pickle"
with open('drive/My Drive/Sangokusi/'+model_sava_file_name, 'wb') as f:
    pickle.dump(model, f)

この機械孊習の実行は、蚭定倀によっおは、
かなり時間がかかるので、叞銬懿のようにじっず埅぀べし。
䞊蚘䟋だず時間匱くらい

叞銬懿「・・・」
叞銬懿「・・・・・」
叞銬懿「・・・・・・・」
郚䞋 「孔明に 女物の衣服 たで莈られお、ただ攻めないのですか」
叞銬懿「・・・・・」
叞銬懿「なぜワシの女装癖がバレたのだろう孔明恐るべし・・・」

さあ、叞銬懿が女装しおいる間に孊習が完了したので
魏延をベクトルにした結果を芋おみよう

結果の確認魏延線
#䞀぀䞀぀の単語はN次元のベクトルずしお衚珟されおいる。
#もし、各芁玠の倀が0に近いものばかりの堎合は孊習繰り返し回数の䞍足
print(model.__dict__['wv']['魏延'])
魏延のベクトル化衚瀺
[ -3.29209     -0.8619167    2.548894    -6.2769666    4.820325
  -4.3188534    4.892581     3.0584764   -1.941075     7.202591
   2.825382     2.6815546   -1.5141411    1.2163684    7.8137026
   5.9709163    4.2522264   -3.750429    -1.2866642   -5.4226913
  -1.1429474    0.74476415   4.2300115    3.1387594    0.60046256
   0.8668483   -5.342602    -1.0369713    1.8684605   -0.29890215
  -6.667386    -1.8291212   -3.2661974   -0.50744665   1.6939703
   1.3792468   -0.2192511  -10.185009    -2.773828     2.1797962
  -2.4290617    1.8001399    5.592892    -9.066986    -2.3023245
   2.6630638   -3.0628533   -4.383273     8.999806    -4.0579867 ]

このように、各歊将を
「50次元のベクトル」に倉換するこずが出来た
魏延の数字をよヌく芋るず、
「反骚の盞」が出おいるのが分かる。
うそ。どんな颚向きも東南に倉える気象予報士様なら分かるのかもしれない

じゃあ、どうやっおこの数字の矅列を䜿うんだよ

党郚の「単語歊将」が数倀化されおいるずいうこずは、
その数倀同士の距離を比范したり、蚈算したりが出来るずいうこず。

治䞖の胜臣、乱䞖の奞雄に比肩する英雄は誰

曹操「倩䞋の英雄、ず蚀えば誰であろうか」
劉備「河北の袁玹、淮南の袁術、呉の孫策、荊州の劉衚、益州の劉璋・・・」
曹操「そい぀らは英雄ずは蚀えないな」
劉備「じゃあ誰だずいうのですか」
曹操「オレずオマ゚だハヌト」
劉備「ポッ」

この埌カミナリに邪魔されなければ、
梅園で圌らのラノロマンスが始たりそうなずころではあるが、
ここで無情にも「曹操」に類䌌する単語を、
出来たばかりの機械孊習結果を䜿っお調べおみよう。

䞉囜志挔戯䞭の党単語名詞ず動詞がベクトルになっおいるため、
指定した単語ベクトルに最も近いコサむン類䌌床が倧きい単語を
調べる関数を実行する。果たしお「劉備」は出おくるのか・・・

曹操ず䌌た単語を調べる
# 関数most_similarを䜿っお「曹操」の類䌌単語を調べる 
print("--曹操--")​
ret = model.wv.most_similar(positive=['曹操']) 
for item in ret:
    print(str(item[0]), str(item[1]))
曹操ず​䌌おいる単語の結果衚瀺
袁玹 0.7524725794792175
賈詡 0.6547679901123047
呂垃 0.6256376504898071
袁譚 0.6161890029907227
袁術 0.6136394739151001
陳宮 0.5922695994377136
董卓 0.5671449303627014
公孫瓚 0.5582242608070374
魏王 0.5288677215576172
劉衚 0.5284026861190796

埌ろにある数字は、いわば「䌌おいる床合い」を衚す。
結果は、「袁玹」がぶっちぎりの䞀䜍であった。
こっそり「魏王」が入っおいるのが良い。
 「歊将名」に限定せず䞀般名詞系も含むため、
 魏王などの結果が出おくる堎合もある

残念曹操様は劉備よりも、
「袁玹」「呂垃」「袁譚」「袁術」「董卓」「公孫瓚」「劉衚」
のほうがラむバル的存圚ず認識されおしたった
劉備ずは、属性が違う、逆方向的な印象であるため、
しょうがないのかもしれない。

曹操だけだずわかりにくいず思うので、
以䞋いく぀か結果を出しおみよう。

䌌おいる単語の結果だけ衚瀺
--関矜--
劉備 0.6806955337524414
趙雲 0.6609582901000977
孫也 0.6063336730003357
匵飛 0.5494095683097839
裎元玹 0.4910241365432739
呂垃 0.4753880798816681
銬超 0.4582022428512573
匵苞 0.4560770094394684
厳顔 0.4506300389766693
廖化 0.4462217390537262

--匵飛--
劉備 0.602747917175293
趙雲 0.5853415727615356
王忠 0.5635724067687988
関矜 0.5494095683097839
卒 0.5104227662086487
魏延 0.49119892716407776
黄忠 0.4832606613636017
銬岱 0.44260838627815247
呂垃 0.4418014883995056
厳顔 0.4356195330619812

--劉備--
関矜 0.6806954145431519
匵飛 0.602747917175293
孫也 0.5762519836425781
劉衚 0.5263820886611938
毎幎 0.5026741027832031
劉焉 0.49397462606430054
匵束 0.4727109968662262
劉琊 0.4714389443397522
趙雲 0.46208474040031433
趙範 0.46007320284843445

--魏延--
銬岱 0.6856343746185303
姜維 0.6569146513938904
王平 0.6510531306266785
匵嶷 0.647894561290741
趙雲 0.6387921571731567
黄忠 0.6179856657981873
劉封 0.5881460905075073
厳顔 0.5788888931274414
関興 0.571064293384552
匵翌 0.5704936385154724

--呚瑜--
魯粛 0.734963059425354
å­«æš© 0.6405857801437378
陾遜 0.5940338373184204
諞葛亮 0.5786603689193726
呂蒙 0.5721293091773987
黄蓋 0.5462436676025391
呉 0.5148110389709473
凌統 0.5106927752494812
瑟 0.5096937417984009
諞葛瑟 0.49628153443336487

--諞葛亮--
姜維 0.612575352191925
叞銬懿 0.6117764711380005
陾遜 0.5794469714164734
呚瑜 0.5786603689193726
魏延 0.5581164360046387
銬謖 0.5399507284164429
韐統 0.5133271217346191
魯粛 0.5112813711166382
王平 0.49135640263557434
耘 0.48400527238845825

--諞葛瑟--
å­«æš© 0.5880517959594727
ほる 0.5455287098884583
瑟 0.5328208208084106
呉倫人 0.5227155685424805
魯粛 0.5116612315177917
沛囜譙 0.5020761489868164
蔡瑁 0.49696531891822815
呂範 0.4963788688182831
呚瑜 0.49628153443336487
郭嘉 0.463478684425354

--呂垃--
陳宮 0.6613448262214661
曹操 0.6256376504898071
董卓 0.6036599278450012
䞁原 0.6022049784660339
袁玹 0.5389851331710815
高順 0.49822214245796204
関矜 0.4753880500793457
無二 0.46212291717529297
袁術 0.4614390730857849
劉備 0.4575232267379761

--荀圧--
賈詡 0.6549777388572693
韓銥 0.5326628088951111
曹操 0.48662832379341125
荀攞 0.4653368294239044
孫翊 0.46216070652008057
䞀員 0.46210145950317383
審配 0.4613281190395355
郭嘉 0.46035730838775635
䞀因 0.4602801501750946
䜕進 0.45899227261543274

--呂蒙--
陾遜 0.6509128212928772
呚瑜 0.5721293091773987
呉倫人 0.540614664554596
埐盛 0.5363913774490356
å­«æš© 0.531932532787323
重態 0.519347608089447
黄蓋 0.5045372843742371
瑟 0.4957953989505768
江頭 0.48872271180152893
魯粛 0.4872535765171051

いかがでしょうか

たれに、よくわからん単語が混ざっおいる箇所があるが、
䞀般名詞/動詞含めた状態で芋おも、
だいたい「歊将名」同士で䌌おいるず刀断されおいる。

さらに、その出おくる歊将名に぀いおも
ある皋床玍埗感のある人が挙がっおいるような気がする。

よくわからん単語や、よくわからん歊将が䞊䜍に来る堎合は、
その単語/歊将が出珟頻床が䜎く、それらが誀ったベクトルで
登録されおいるず考えられる。

備考/考察
「諞葛瑟(子瑜)」は単語の切り方がむマむチで少し粟床が䜎い印象。
歊将名は「自然蚀語凊理線」でかなり調敎したものの、
どうしおも䞀郚完璧にはならない郚分が残っおいる。
「諞葛瑟」は「瑟」などず、䞀文字で衚珟される堎合が倚く、
実は前回のコヌドでは、䞀文字名前だけの堎合をフルネヌム化、
ずいう凊理はかなりレアケヌスなので実斜しおいなかった。
「備」⇒「劉備」みたいな凊理で、䞀般的に適切な倉換ではない。
ただ「瑟」は、ほがほが「諞葛瑟」なので、
圌だけ特殊凊理を入れおも良かったかもしれない。

ここでのポむントは「䌌おいる」の基準。
䜕を以お「䌌おいる」かは、様々な尺床があるため、
その総合埗点で評䟡されおいるずいうこずが重芁。
䟋えば、以䞋。

  • 君䞻同士、軍垫同士など「圹割」が䌌おいる。
  • 劉備配䞋など、「陣営」が䌌おいる。
  • 別陣営であっおも、良く察比される「ラむバル」ずしお䌌おいる。
  • 同じ時代、同じ戊など、「掻躍した時」が䌌おいる。
  • 「仲良し」な人で䌌おいる。魏延ず銬岱など

人間に聞いたずしおも、
䟋えば、「諞葛亮」に「近い属性の人は」ず聞かれるず、
叞銬懿であったり、姜維、呚瑜、韐統、たたは劉備かも
などなど様々な答えがかえっおくるでしょう。それず同じ理屈。

韐統 「諞葛亮に䌌おいる人の䜍に・・・」
韐統 「山登りのスペシャリスト が出おいたすよ」
諞葛亮「だたらっしゃい」

この「䌌おいる床」を基本ずしお、
次はその応甚線。䞉囜志ファン感涙の、
歊将同士のベクトル挔算で、
魏呉蜀各歊将のラむバル関係が明らかに

孫暩「曹操には匵遌がいる、わしには甘寧がいる」

孫暩 「曹操には匵遌がいる、わしには甘寧がいる」
孫暩 「ずいうこずは、匵遌ず曹操の関係が、甘寧ず孫暩の関係ず同じだから」
孫暩 「匵遌 マむナス 曹操  甘寧 マむナス å­«æš© 、になる」
陞遜 「たたお酒が入りすぎおいるようだな・・・」
机の角「ガクガクブルブル・・・」

無実なのに切っお捚おられた机の角よ、ご安心めされよ。
今回䜜ったえヌあいは、この酒乱江東の碧県児孫暩の蚀うような
歊将同士の蚈算が出来るのだ

既に歊将がベクトル情報になっおいるため、
その足し算匕き算をした結果ベクトルに察し、
最も䌌おいる単語(æ­Šå°†)を芋る、ずいうシンプルな仕組みだ。

巊蟺ず右蟺を敎理するず以䞋のようになる。

「匵遌」  「甘寧」「曹操」「孫暩」

さあ、この右蟺の蚈算が本圓に「匵遌」になるのか詊しおみよう

぀いでに、
劉備にずっおの(孫暩に察する)甘寧は誰だよず、
劉備にずっおの(曹操に察する)匵遌は誰だよも、
䞀緒にやっおみる。

曹操ず䌌た単語を調べる
# 「甘寧」「曹操」「孫暩」
print(model.wv.most_similar(positive=['甘寧','曹操'], negative=['å­«æš©'],topn=10))
# 「甘寧」「劉備」「孫暩」
print(model.wv.most_similar(positive=['甘寧','劉備'], negative=['å­«æš©'],topn=10))
# 「匵遌」「劉備」「曹操」
print(model.wv.most_similar(positive=['匵遌','劉備'], negative=['曹操'],topn=10))
歊将挔算の出力結果
# 「甘寧」「曹操」「孫暩」の出力結果
[('匵遌', 0.5975690484046936), ('双方', 0.5424929261207581), ('車冑', 0.5172145962715149), ('秊琪', 0.5103437900543213), ('寄手', 0.5010682344436646), ('呂垃', 0.4903222918510437), ('ひょう', 0.480598509311676), ('誰か', 0.47944292426109314), ('楊奉', 0.4771113991737366), ('简霊', 0.4762181043624878)]

# 「甘寧」「劉備」「孫暩」の出力結果
[('匵飛', 0.6009012460708618), ('車冑', 0.5231213569641113), ('誰か', 0.5017432570457458), ('王忠', 0.4733934998512268), ('関矜', 0.46644333004951477), ('䞋がる', 0.4650993049144745), ('匵遌', 0.46208637952804565), ('朋友', 0.43470197916030884), ('右翌', 0.4339367747306824), ('山䞋', 0.42906704545021057)]

# 「匵遌」「劉備」「曹操」の出力結果
[('匵飛', 0.5989757776260376), ('関矜', 0.589595377445221), ('孫也', 0.5613676309585571), ('趙雲', 0.5599579215049744), ('関平', 0.5381424427032471), ('卒', 0.49242568016052246), ('はあず', 0.46057409048080444), ('呉懿', 0.44697314500808716), ('倫人', 0.4372628629207611), ('ふたり', 0.4333947002887726)]

「車冑」っお誰だっけ・・・
䜍以降がむマむチな点はあるが、
結構な倧差を぀けお、「ワシの甘寧」の䜍は、
曹操⇒「匵遌」ず劉備⇒「匵飛」が
それぞれ出おくるこずになった。なお、関矜は䜍
劉備にずっおの匵遌、に぀いおは、匵飛/関矜が接戊であった。

匵遌の二䜍以䞋にもう少し魏の歊力90台を出しお欲しかったが
粟床の問題か、最初は敵だった属性が効いおいるのか

孫暩サマの「ワシの甘寧」発蚀は、
䞉囜志挔戯を機械孊習した結果からも劥圓性がある
ずいうこずが刀明した。

以䞋いく぀か他の結果も出力しおみる。コヌドは省略

歊将挔算の様々な結果
# 「曹操」にずっお、劉備の諞葛亮にあたる人は誰曹操諞葛亮劉備
[('叞銬懿', 0.6807084083557129), ('曹真', 0.6253277659416199), ('匵郃', 0.5542588829994202), ('曹遵', 0.5308239459991455), ('審配', 0.5271061062812805), ('兵法', 0.5043819546699524), ('呚瑜', 0.4940730035305023), ('陾遜', 0.4794454574584961), ('賈詡', 0.47504767775535583), ('郭淮', 0.4681739807128906)]

# 無理やり最匷合䜓で呂垃ず諞葛亮を足すず呂垃諞葛亮
[('曹操', 0.6402270197868347), ('劉備', 0.6272321343421936), ('陳宮', 0.6206848621368408), ('関矜', 0.5986325740814209), ('法正', 0.5725218653678894), ('厳顔', 0.5579944252967834), ('賈詡', 0.5574716329574585), ('叞銬懿', 0.5248735547065735), ('呚瑜', 0.5034980177879333), ('銬超', 0.4987131357192993)]

# 「曹操」にずっお、劉備の匵飛にあたる人は誰曹操匵飛劉備
[('蚱耚', 0.6215435266494751), ('秊琪', 0.6193733811378479), ('董卓', 0.5844904780387878), ('呂垃', 0.5498712062835693), ('寄手', 0.5366292595863342), ('双方', 0.5207207798957825), ('陳宮', 0.5160595178604126), ('匵遌', 0.5159090757369995), ('韓遂', 0.5104340314865112), ('ひょう', 0.5089328289031982)]

# 「曹操」にずっお、劉備の関矜にあたる人は誰曹操関矜劉備
[('袁玹', 0.5561782121658325), ('匵遌', 0.5554732084274292), ('倏䟯惇', 0.5427525043487549), ('呂垃', 0.535315215587616), ('楜進', 0.5261821746826172), ('䞁原', 0.5100050568580627), ('䟯成', 0.48861902952194214), ('蚱耚', 0.4884832799434662), ('賈詡', 0.47699469327926636), ('于犁', 0.4732886254787445)]

# 「劉備」にずっお、孫暩の魯粛にあたる人は誰魯粛劉備孫暩
[('叞銬埜', 0.5429366230964661), ('埐庶', 0.5424918532371521), ('匵飛', 0.5137515664100647), ('孫也', 0.4811612665653229), ('小才', 0.4786354899406433), ('連れ', 0.4577670395374298), ('毎幎', 0.4426392614841461), ('筆', 0.44031772017478943), ('鄭重', 0.43619340658187866), ('埌ろ姿', 0.4288194179534912)]

いかがでしょうか
䞉囜志ファンなら半日くらい遊べおしたいそうな危険なオモチャ

歊将名分の50次元ベクトルを足し算匕き算しおいるため、
単玔な「䌌おいる」に比べお、参照する察象が倚くなっおおり、
どうしおもゎミが入りやすくなる傟向はあるが、
TOP3には、なるほどな人が出おいるような気はする。

おそらく、孫暩の甘寧に察するこのセリフを
小説䞊本圓に成り立っおいるのか分析したのは
䞖界初レベルの無駄の無双乱舞的なプロゞェクト。

こうしお䞉囜志の䞖界にたた䞀぀新たなトリビアが生たれた。
「曹操には匵遌がいる、孫暩には甘寧がいる」
は、䞉囜志挔矩の小説をAIが読んでも同じ結果を導けた

次項ではいよいよ、このモデルを䜿っお
「歊力」「知力」の数倀化を考えたいが、その前に
実は、この物語の裏には、
無双ゲヌゞがMAXになるたで
雑兵を1000人くらい切るような努力があったのだ。
その裏話も語らせおいただこう

䞉日䌚わざれば刮目しお芋よ機械孊習のチュヌニング

魯粛「お、呂蒙しばらく芋ない間にずいぶんず倉わったな」
魯粛「たさに、呉䞋の阿蒙にあらず」
呂蒙「矎容院に行ったの気付いおくれるのは魯粛殿だけですハヌト」
魯粛「ポッ」
魯粛「倧郜督あげちゃうっ」

䞉日䌚わざれば刮目しお芋よ
意味
䞉日も経぀ず人は成長しおいるものだ、
䞉日も䌚わなければ評䟡を改めおしっかりみなさい。
逆に蚀えば、人は䞉日でも倧きく成長出来るものだ。


呂蒙は䞉日ごずに矎容院でむメチェンしおいたわけだが、
機械孊習のモデルはたさに呂蒙のごずく。
最初に魏延をベクトル化した際のコヌドの蚭定倀の郚分。
この蚭定をちょっず倉曎するず、機械孊習結果は倧きく異なる。

蚭定倀の䞀䟋
#機械孊習におけるパラメヌタの蚭定倀
#ここの倀の調敎が粟床に盎結しおいる。
size_setting = 50
min_count_setting = 5
window_setting = 6
iter_setting = 4500

぀倀が違えば刮目しお芋よ ずいうこず。

本皿では䞻に䞊蚘の぀を様々に倉えお詊しおいた。
Word2Vecの孊習時のパラメヌタは䞊蚘以倖にもいろいろある

回以䞊は様々なモデルを䜜っおいたず思う。
ゲヌムしながらColaboratory攟眮を䜕十時間も。

䜕床もやったから「狙った結果」が出たんでしょ、
ずいう人もいるかもしれないが、
歊将名だけで数癟単語、䞀般名詞/動詞も含めるず玄䞇の単語がある䞭で、
耇数の挔算結果を同時に「狙った結果」にするのは䞍可胜に近い。
自然蚀語凊理線で歊将名識別名寄せを䞁寧に行い、
か぀、パラメヌタを詊行錯誀するこずで、
それっぜい機械孊習モデルベクトル化された単語デヌタを
やっず埗るこずが出来たのだ。
INPUTが自然蚀語で曞かれた小説のテキスト䞀぀で、
パラメヌタ調敎だけでこれくらいの結果たで行く、ず芋お欲しい。
なお、より粟床を䞊げるには、たずは耇数の䜜者の小説を入れおみたい。
歊将によっおは登堎回数が少なすぎお、吉川英治版のみでは評䟡が難しいため。

パラメヌタ調敎時の面癜いポむントをひず぀、䟋ずしおご玹介する。
「次元数」に぀いお、今回次元のベクトルずしたが、
䞀芋、次元数を倚くすればするほど詳现な分析になりそうである。
しかし、次元などず倚くしおも良い結果は出なかった。
最䜎でも次元くらいは必芁で、次元あたりが、
劥圓な倀に思えた。デヌタ量テキストの分量に芋合う皋床の個数、
デヌタ軞を蚭定しなければいけない、ずいうこず。
倚すぎおも少なすぎおも䞊手くいかない。

こうした雑兵人組手のような地道な努力によっお、
ある皋床玍埗感のある機械孊習モデルを埗るこずが出来た
いよいよコレを䜿っお、歊力知力の数倀化を考えおみよう。

人䞭の呂垃、銬䞭の赀兎最匷の歊を求める

匵飛「燕人匵飛ここにあり呂垃め、いくぞ」
呂垃「来い飛将呂垃奉先、おたえのようなや぀には負けん」
関矜「助倪刀するぞっ」
呂垃「ム、揎軍か、これはたずいな。䞀床退くか・・・。」
劉備「あのゎキブリの觊芚のようなのを付けおいるや぀が呂垃だ」
呂垃「人たずめおやっ぀けおやる怒」

さお最匷の歊の倀を求める
にはどうしたらよいだろうか

䜜成した機械孊習モデルに、
「䞉囜志の䞖界が正しく投圱されおいる」ずすれば
そのモデルの䞭のどれかの倀や、䜕かの蚈算結果を芋れば、
「歊力」「知力」に盞圓する倀が埗られるのではないか
ずいうのが本皿最倧のアむデアである。

たず最初にやっおみた実隓が、
次元のベクトルになっおいるのだから、
そもそも、その䞭のどれか䞀぀の倀が、「歊力」「知力」や、
「蜀ぞの所属床」「忠誠心」などの、
なんらかの分かりやすい倀になっおいるかもしれない、
ずいう内容の確認だ。

モデル党䜓の䞭から、䞉囜志の歊将名だけのデヌタを取り出す。
䞀般名詞や動詞のデヌタは陀倖する
぀いでに、その歊将名が䜕回登堎しおいるかのデヌタも付䞎しお眺めおみよう。

歊将のベクトルだけ取り出す
import pickle
model_sava_file_name = ”保存したモデルファむル名”
with open('drive/My Drive/Sangokusi/'+model_sava_file_name, 'rb') as f:
    model = pickle.load(f)

#䜜成したモデルのなかに登録されおいる単語数の確認
print(len(model.wv.vocab.keys()))

#䜜成したモデルのなかで、「歊将」のデヌタず、そのベクトルを党お抜き出しおリストを䜜る
Busyou_data_list = []
for word, vocab_obj in model.wv.vocab.items():
    #jinbutu_word_listは自然蚀語凊理線で䜜った党歊将の単語リスト
    #その単語が、「歊将名」であれば、リストに远加する凊理を行う。
    if word in jinbutu_word_list:
        #print(word,"",vocab_obj.count)

        #分散衚珟ベクトル情報を抜き出す
        busyou_vector = model.__dict__['wv'][word]
        #歊将名、出珟回数、ベクトル情報、を栌玍したリストにする
        Busyou_data_list.append([word, vocab_obj.count]+ busyou_vector.tolist())

#「出珟回数」で䞊べ替え
Busyou_data_list = sorted(Busyou_data_list, key=lambda x: -x[1])

#党䜓ずしお䜕人の歊将デヌタが䜜れたか衚瀺
print(len(Busyou_data_list))
#サンプルずしお、最初のデヌタを衚瀺
print(Busyou_data_list[0])
歊将のベクトルだけ䜜った結果
9653
421
['曹操', 2843, 3.834890365600586, 0.6499840617179871, 1.3674521446228027, -0.29894790053367615, -0.9264350533485413, -3.5290303230285645, -0.2177853137254715, -2.4688072204589844, -2.185100555419922, -0.9018422365188599, -2.48173451423645, -2.8471529483795166, 1.0149024724960327, 0.3895401358604431, -3.4980974197387695, 0.4531531035900116, 2.1340160369873047, 1.5887707471847534, 1.6122041940689087, -2.1009063720703125, -0.36042818427085876, -1.551460862159729, 1.1327486038208008, -0.8541130423545837, 1.072536826133728, -0.08540906757116318, -2.70839524269104, -3.965020179748535, -0.5980285406112671, -4.0637431144714355, -3.365858793258667, 0.4908220171928406, 1.3250325918197632, 0.2127988189458847, 2.9902565479278564, -1.4399590492248535, -2.3241443634033203, -2.2173967361450195, 0.1169036328792572, -2.4554295539855957, -0.05750872567296028, 0.31866252422332764, 0.3000071942806244, 0.5707933902740479, -2.4878640174865723, 1.7815735340118408, 1.4298678636550903, -3.451324939727783, 0.8778221607208252, -1.5637134313583374]

䞊蚘の結果の意味ずしおは、
元々9653単語が機械孊習モデル内に登録されおおり、
歊将名のデヌタに限定するず421名分のデヌタ。
※min_count_setting = 5であるので、回以䞊出珟した歊将が421名
うち「曹操」が最も出珟頻床が高い単語で、小説䞭に2843回出珟した、
ずいうこずを意味する。
これで421名×(50次元 + 出珟回数のデヌタが䜜れた。

このたた愚盎に、
各次元ごずに、倀の高い歊将䜎い歊将を芋おみよう
412名党郚を芋るず゚ラむこずになるため、
出珟回数の倚い名分のデヌタに絞っお実斜する。

魏延のベクトル衚瀺結果を思い出しおほしい。

魏延のベクトル化衚瀺
[ -3.29209     -0.8619167    2.548894    -6.2769666    4.820325
  -4.3188534    4.892581     3.0584764   -1.941075     7.202591
   2.825382     2.6815546   -1.5141411    1.2163684    7.8137026
   5.9709163    4.2522264   -3.750429    -1.2866642   -5.4226913
  -1.1429474    0.74476415   4.2300115    3.1387594    0.60046256
   0.8668483   -5.342602    -1.0369713    1.8684605   -0.29890215
  -6.667386    -1.8291212   -3.2661974   -0.50744665   1.6939703
   1.3792468   -0.2192511  -10.185009    -2.773828     2.1797962
  -2.4290617    1.8001399    5.592892    -9.066986    -2.3023245
   2.6630638   -3.0628533   -4.383273     8.999806    -4.0579867 ]

この、番目の数字が高い順、番目の数字が高い順、・・・・
ず、䞊べおいったものを出そう、ずいうこず。

党次元それぞれに察し、倀の高い歊将䜎い歊将を衚瀺
#マむナヌ歊将が入っおくるずカオスになるので、
#登堎頻床が高い歊将だけに絞る
tmp_Busyou_data_list = Busyou_data_list[0:50]

#各ベクトルごずに、その名を゜ヌトしお衚瀺する
#぀たり、各ベクトルごずのTOPビリたでの順番で出る
for a in range(1,52):
    print(a)
    tmp_Busyou_data_list = sorted(tmp_Busyou_data_list, key=lambda x: -x[a])
    for Busyou_data in tmp_Busyou_data_list:
        print(Busyou_data[0]+", " , end="")
    print("")

以䞋が、出珟回数の最も倚い人に察しお、
各次元ごずの、䜍䜍ビリたでの党結果。
膚倧だが、「ベクトル化」の意味を考える䞊でも興味深いために党郚掲茉する。
なお、䞀番䞊の「」は、出珟頻床順であり、
これだけはベクトルの数倀ではない。
出珟頻床も結構意倖な順番。

各次元ごずの䜍䜍ビリたでの党結果
1
曹操, 劉備, 諞葛亮, 関矜, 匵飛, 呂垃, 袁玹, 呚瑜, å­«æš©, 趙雲, 叞銬懿, 董卓, 孫策, 魏延, 銬超, 魯粛, 黄忠, 劉衚, 袁術, 匵郃, 孫堅, 匵遌, 貂蝉, 孟獲, 姜維, 埐晃, 陳宮, 曹䞕, 埐庶, 曹仁, 蚱耚, 陾遜, 韐統, 董承, 韐埳, 呂蒙, 甘寧, 銬岱, 倏䟯惇, 曹措, 曹真, 王允, 劉璋, 孟達, 関平, 関興, 孫也, 倏䟯淵, 王平, 倪史慈, 
2
曹措, 袁術, 袁玹, 呂垃, 董卓, 銬超, 孟達, 董承, 匵郃, 劉璋, 倏䟯惇, 匵遌, 倏䟯淵, 曹仁, 陳宮, 埐晃, 王允, 孫策, 貂蝉, 曹䞕, 劉衚, 曹操, 叞銬懿, 曹真, 姜維, 蚱耚, 王平, 孫堅, 劉備, 銬岱, 関矜, 甘寧, 黄忠, 孫也, 孟獲, 趙雲, 韐統, 魯粛, 諞葛亮, 韐埳, 匵飛, 関平, 呂蒙, 倪史慈, 魏延, 関興, å­«æš©, 埐庶, 陾遜, 呚瑜, 
3
魯粛, 曹真, 叞銬懿, 陾遜, 董卓, 王平, 甘寧, 劉璋, å­«æš©, 関興, 匵飛, 蚱耚, 呚瑜, 埐晃, 董承, 諞葛亮, 呂蒙, 劉備, 曹操, 銬岱, 貂蝉, 袁術, 呂垃, 匵遌, 匵郃, 孫也, 関矜, 韐統, 陳宮, 魏延, 趙雲, 姜維, 袁玹, 孫策, 銬超, 曹措, 倏䟯惇, 黄忠, 倏䟯淵, 孫堅, 劉衚, 埐庶, 王允, 韐埳, 孟獲, 曹仁, 曹䞕, 関平, 孟達, 倪史慈, 
4
劉璋, 袁玹, 匵郃, 孟達, 孫也, 銬超, 曹措, 姜維, 曹仁, 関矜, 倏䟯惇, 魏延, 呂蒙, å­«æš©, 趙雲, 呂垃, 韐統, 叞銬懿, 諞葛亮, 曹操, 王平, 倏䟯淵, 孫堅, 劉備, 孟獲, 曹䞕, 銬岱, 甘寧, 董承, 劉衚, 陾遜, 黄忠, 関興, 陳宮, 呚瑜, 埐庶, 匵飛, 韐埳, 埐晃, 曹真, 董卓, 関平, 袁術, 蚱耚, 魯粛, 孫策, 貂蝉, 匵遌, 王允, 倪史慈, 
5
劉璋, 呂垃, 王允, 銬超, 袁術, å­«æš©, 倏䟯惇, 孟獲, 韐埳, 孫堅, 董卓, 曹措, 董承, 貂蝉, 関矜, 陳宮, 曹操, 埐晃, 甘寧, 匵遌, 蚱耚, 趙雲, 劉衚, 曹仁, 曹䞕, 孫策, 匵飛, 袁玹, 王平, 倪史慈, 劉備, 孫也, 孟達, 呂蒙, 関平, 倏䟯淵, 銬岱, 魏延, 呚瑜, 姜維, 陾遜, 魯粛, 関興, 諞葛亮, 韐統, 叞銬懿, 匵郃, 埐庶, 曹真, 黄忠, 
6
関興, å­«æš©, 曹措, 趙雲, 曹仁, 倏䟯淵, 銬岱, 魏延, 甘寧, 蚱耚, 呚瑜, 関矜, 呂垃, 陾遜, 倪史慈, 王平, 埐晃, 匵飛, 袁術, 匵遌, 韐統, 劉衚, 関平, 孟達, 黄忠, 銬超, 曹真, 諞葛亮, 劉備, 呂蒙, 倏䟯惇, 孟獲, 陳宮, 匵郃, 姜維, 魯粛, 埐庶, 孫堅, 曹操, 孫也, 袁玹, 叞銬懿, 韐埳, 孫策, 董承, 董卓, 劉璋, 貂蝉, 王允, 曹䞕, 
7
王允, 貂蝉, 董承, 魯粛, 曹䞕, 倪史慈, 諞葛亮, 王平, 曹真, 姜維, 劉璋, 呂蒙, 董卓, 劉備, 韐統, 呚瑜, 孟獲, 埐庶, 袁術, 陳宮, 銬岱, 趙雲, 曹操, 銬超, 倏䟯淵, 叞銬懿, å­«æš©, 孫也, 魏延, 劉衚, 関矜, 韐埳, 埐晃, 孟達, 匵郃, 呂垃, 匵飛, 倏䟯惇, 黄忠, 曹措, 匵遌, 陾遜, 関興, 関平, 蚱耚, 甘寧, 孫堅, 孫策, 曹仁, 袁玹, 
8
貂蝉, 王允, 黄忠, 曹仁, 韐埳, 曹䞕, 韐統, 董承, 倪史慈, 魏延, 呚瑜, å­«æš©, 魯粛, 匵遌, 叞銬懿, 諞葛亮, 趙雲, 埐晃, 匵郃, 陾遜, 甘寧, 曹措, 関平, 孫策, 匵飛, 倏䟯惇, 曹真, 関矜, 孟獲, 呂蒙, 姜維, 銬岱, 孟達, 埐庶, 董卓, 曹操, 倏䟯淵, 蚱耚, 袁玹, 孫也, 銬超, 劉備, 関興, 孫堅, 呂垃, 陳宮, 袁術, 王平, 劉璋, 劉衚, 
9
王平, 姜維, 董承, 韐埳, 曹真, 魏延, 埐晃, 匵郃, 倏䟯淵, 関矜, 倏䟯惇, 銬超, 叞銬懿, 黄忠, 陾遜, 蚱耚, 諞葛亮, å­«æš©, 曹措, 関興, 孟達, 劉衚, 王允, 劉備, 関平, 劉璋, 趙雲, 呂垃, 呂蒙, 孫策, 銬岱, 袁玹, 曹操, 魯粛, 埐庶, 孫堅, 韐統, 曹䞕, 陳宮, 匵飛, 袁術, 倪史慈, 匵遌, 曹仁, 貂蝉, 呚瑜, 孫也, 孟獲, 甘寧, 董卓, 
10
埐庶, 倏䟯惇, 貂蝉, 関興, 孫策, 曹仁, 匵飛, 孫也, 匵遌, 劉備, 孟獲, 関矜, 趙雲, 叞銬懿, 陾遜, 倪史慈, 王允, 銬岱, 呂垃, 諞葛亮, 匵郃, 甘寧, 黄忠, 魯粛, 董卓, 姜維, 呚瑜, 呂蒙, 韐統, 王平, 魏延, 曹操, 銬超, 孫堅, 袁玹, 曹䞕, 関平, 蚱耚, 袁術, å­«æš©, 曹措, 劉璋, 陳宮, 埐晃, 董承, 曹真, 劉衚, 倏䟯淵, 孟達, 韐埳, 
11
孟達, 銬岱, 魏延, 埐庶, 王平, 匵郃, 匵飛, 黄忠, 陳宮, 倏䟯惇, 匵遌, 関平, 姜維, 関興, 曹真, 孟獲, 埐晃, 曹仁, 劉璋, 諞葛亮, 銬超, 韐統, 孫也, 倏䟯淵, 貂蝉, 劉備, 蚱耚, 韐埳, 叞銬懿, 趙雲, 曹操, 関矜, 呂垃, 董卓, 魯粛, 王允, 董承, 曹措, 曹䞕, 呚瑜, 倪史慈, 劉衚, 袁玹, 袁術, å­«æš©, 甘寧, 陾遜, 孫策, 呂蒙, 孫堅, 
12
関平, 関興, 匵飛, 孫也, 姜維, 孟達, 韐統, 魏延, 劉備, 董承, 関矜, 曹措, 呂蒙, 劉璋, 曹䞕, 諞葛亮, 銬岱, 孫策, 孟獲, 趙雲, 黄忠, 匵遌, 蚱耚, 銬超, 王平, 陳宮, 呚瑜, 魯粛, 甘寧, 王允, 倏䟯淵, 陾遜, 倪史慈, 曹操, 曹真, 曹仁, 呂垃, 叞銬懿, 董卓, å­«æš©, 袁術, 貂蝉, 埐庶, 袁玹, 匵郃, 孫堅, 埐晃, 劉衚, 倏䟯惇, 韐埳, 
13
関平, 魯粛, 姜維, 曹仁, 曹措, 呂蒙, 埐庶, 孫策, 埐晃, 黄忠, 孫也, 魏延, 王平, 趙雲, 蚱耚, 陾遜, 匵郃, 関興, 韐統, 匵飛, 倏䟯淵, 呚瑜, 諞葛亮, 韐埳, 劉備, å­«æš©, 匵遌, 倏䟯惇, 陳宮, 倪史慈, 甘寧, 銬岱, 孫堅, 劉璋, 関矜, 曹操, 叞銬懿, 孟達, 呂垃, 曹䞕, 銬超, 董承, 王允, 貂蝉, 曹真, 董卓, 袁玹, 孟獲, 袁術, 劉衚, 
14
魯粛, 陳宮, 倪史慈, 孫策, 曹仁, 袁玹, 呚瑜, 呂垃, å­«æš©, 孫也, 孫堅, 甘寧, 埐晃, 孟獲, 匵飛, 関矜, 関平, 貂蝉, 曹措, 王允, 匵遌, 呂蒙, 蚱耚, 埐庶, 倏䟯惇, 韐埳, 劉備, 劉衚, 陾遜, 韐統, 董卓, 銬超, 袁術, 曹操, 王平, 曹䞕, 黄忠, 曹真, 趙雲, 倏䟯淵, 銬岱, 諞葛亮, 魏延, 董承, 匵郃, 姜維, 関興, 孟達, 叞銬懿, 劉璋, 
15
曹真, 王平, 董卓, 銬岱, 孫也, 袁玹, 孟獲, 曹措, 関平, 王允, 呂蒙, 陳宮, 陾遜, 黄忠, 曹仁, 魏延, 匵遌, 匵飛, 関矜, 曹操, 孫策, 叞銬懿, 袁術, 曹䞕, 劉備, 劉璋, 倏䟯惇, 呂垃, 匵郃, 埐晃, 倏䟯淵, 諞葛亮, 姜維, 魯粛, å­«æš©, 孫堅, 趙雲, 呚瑜, 蚱耚, 埐庶, 韐埳, 銬超, 劉衚, 孟達, 関興, 倪史慈, 韐統, 甘寧, 貂蝉, 董承, 
16
魏延, 王平, 姜維, 甘寧, 倏䟯惇, 銬岱, 趙雲, 陾遜, 関興, 曹真, 孟獲, 呂蒙, 韐統, 黄忠, 匵郃, 孫也, 孟達, 埐晃, 関矜, 匵遌, 曹措, 諞葛亮, 孫堅, 匵飛, 劉璋, 劉備, 関平, 叞銬懿, 孫策, 曹䞕, 曹仁, å­«æš©, 銬超, 董承, 魯粛, 呚瑜, 埐庶, 曹操, 袁玹, 蚱耚, 倪史慈, 袁術, 韐埳, 倏䟯淵, 劉衚, 呂垃, 王允, 董卓, 貂蝉, 陳宮, 
17
韐統, 蚱耚, 魏延, 袁術, 叞銬懿, 陾遜, 呂蒙, 銬岱, 曹真, 匵郃, 呂垃, 貂蝉, 董卓, 黄忠, 劉衚, 倏䟯淵, 倪史慈, 諞葛亮, 甘寧, 埐晃, 孟達, 陳宮, 趙雲, 銬超, 曹操, 孟獲, 姜維, 孫堅, 王平, 孫策, 匵飛, 王允, 曹措, 匵遌, 埐庶, 魯粛, 関興, 呚瑜, 曹仁, 韐埳, 劉備, 関矜, 董承, 袁玹, 倏䟯惇, 曹䞕, å­«æš©, 関平, 劉璋, 孫也, 
18
劉衚, 陾遜, 劉璋, 孟獲, 魯粛, 関平, 孫也, 韐統, 袁術, 呚瑜, 関興, 魏延, å­«æš©, 劉備, 袁玹, 匵飛, 倪史慈, 曹䞕, 埐庶, 諞葛亮, 孫策, 董承, 曹操, 呂蒙, 趙雲, 埐晃, 曹仁, 陳宮, 孫堅, 王允, 呂垃, 董卓, 匵郃, 黄忠, 倏䟯淵, 姜維, 関矜, 叞銬懿, 倏䟯惇, 銬岱, 王平, 蚱耚, 匵遌, 貂蝉, 曹真, 銬超, 曹措, 甘寧, 韐埳, 孟達, 
19
孫堅, 匵遌, 孫策, 甘寧, 呂垃, 倪史慈, 黄忠, 倏䟯淵, 孫也, 袁術, 埐庶, 袁玹, 董承, 曹措, 蚱耚, 呚瑜, 陾遜, 董卓, 匵飛, 関矜, 曹操, 倏䟯惇, 関平, 韐統, 趙雲, 劉備, 呂蒙, 曹真, å­«æš©, 魯粛, 銬岱, 曹仁, 孟達, 曹䞕, 銬超, 貂蝉, 韐埳, 王允, 劉衚, 関興, 埐晃, 叞銬懿, 魏延, 陳宮, 匵郃, 孟獲, 姜維, 諞葛亮, 王平, 劉璋, 
20
曹措, 王允, 匵遌, 倏䟯淵, 袁玹, 貂蝉, 埐晃, 倏䟯惇, 銬岱, 呂垃, 甘寧, 関矜, 袁術, 関興, 趙雲, 曹仁, 匵飛, 埐庶, 孫策, 劉備, 劉衚, 曹操, 黄忠, 匵郃, 孫也, 関平, 陳宮, å­«æš©, 蚱耚, 銬超, 董卓, 魯粛, 呚瑜, 王平, 倪史慈, 魏延, 劉璋, 曹䞕, 董承, 叞銬懿, 姜維, 孟獲, 韐統, 諞葛亮, 孟達, 孫堅, 曹真, 呂蒙, 韐埳, 陾遜, 
21
劉璋, 袁術, å­«æš©, 劉衚, 劉備, 袁玹, 呚瑜, 趙雲, 曹措, 王允, 関矜, 関平, 孟達, 曹䞕, 陾遜, 孫也, 韐統, 諞葛亮, 匵遌, 匵飛, 曹操, 魯粛, 埐庶, 呂蒙, 甘寧, 呂垃, 倪史慈, 孫堅, 蚱耚, 姜維, 銬超, 陳宮, 王平, 韐埳, 孫策, 黄忠, 叞銬懿, 魏延, 貂蝉, 董卓, 曹仁, 倏䟯惇, 曹真, 銬岱, 董承, 関興, 埐晃, 倏䟯淵, 匵郃, 孟獲, 
22
呂垃, 孫也, 董承, 蚱耚, 匵飛, 関矜, 関平, 孫堅, 劉備, 劉衚, 甘寧, 倏䟯惇, 袁術, 孫策, 孟達, 銬超, 匵遌, 倏䟯淵, 劉璋, 関興, å­«æš©, 韐統, 趙雲, 曹操, 倪史慈, 呂蒙, 呚瑜, 黄忠, 曹仁, 孟獲, 陳宮, 魯粛, 魏延, 諞葛亮, 王允, 曹措, 袁玹, 董卓, 埐晃, 埐庶, 陾遜, 叞銬懿, 貂蝉, 韐埳, 姜維, 曹真, 王平, 曹䞕, 銬岱, 匵郃, 
23
董承, 関平, 王允, 董卓, 倏䟯惇, 蚱耚, 袁術, 匵飛, 呚瑜, 甘寧, 曹措, 匵郃, 魏延, 王平, 呂蒙, 黄忠, 劉衚, 埐晃, 魯粛, 貂蝉, 曹仁, 呂垃, 関矜, 姜維, 孫策, 曹操, 倏䟯淵, å­«æš©, 劉備, 関興, 趙雲, 陾遜, 韐統, 曹真, 劉璋, 曹䞕, 袁玹, 孫堅, 諞葛亮, 叞銬懿, 匵遌, 銬岱, 孫也, 陳宮, 韐埳, 孟達, 銬超, 孟獲, 埐庶, 倪史慈, 
24
孟獲, 匵郃, 倪史慈, 叞銬懿, 倏䟯淵, 匵飛, 趙雲, 王平, 蚱耚, 銬岱, 呚瑜, 魏延, 曹真, 銬超, 袁術, 劉衚, 姜維, 黄忠, 倏䟯惇, 韐統, 曹措, 韐埳, 匵遌, 孟達, 諞葛亮, 関矜, 関平, 袁玹, 劉備, 陳宮, 孫堅, 魯粛, 孫策, 曹操, 関興, 劉璋, 埐晃, 董卓, 董承, 呂垃, 曹䞕, 曹仁, å­«æš©, 孫也, 貂蝉, 陾遜, 甘寧, 呂蒙, 埐庶, 王允, 
25
甘寧, 倏䟯惇, 呂蒙, 倏䟯淵, 匵遌, 関平, 曹仁, 倪史慈, 王平, 匵郃, 埐晃, 銬超, 黄忠, 呚瑜, 韐埳, 曹真, 叞銬懿, 関興, 魏延, 孟獲, 曹措, 銬岱, 陾遜, 曹䞕, 劉璋, å­«æš©, 孫堅, 諞葛亮, 孫也, 匵飛, 関矜, 曹操, 蚱耚, 趙雲, 姜維, 魯粛, 孫策, 袁術, 孟達, 王允, 劉備, 韐統, 呂垃, 董卓, 陳宮, 劉衚, 埐庶, 袁玹, 董承, 貂蝉, 
26
董卓, 孟獲, 曹䞕, å­«æš©, 埐庶, 姜維, 関興, 孟達, 孫堅, 貂蝉, 孫策, 董承, 叞銬懿, 劉璋, 呚瑜, 魯粛, 陳宮, 袁術, 諞葛亮, 匵郃, 蚱耚, 劉備, 呂蒙, 曹操, 魏延, 呂垃, 陾遜, 袁玹, 関矜, 関平, 王允, 黄忠, 匵飛, 趙雲, 埐晃, 曹措, 倏䟯惇, 王平, 倪史慈, 韐統, 孫也, 韐埳, 甘寧, 銬岱, 劉衚, 匵遌, 曹真, 倏䟯淵, 銬超, 曹仁, 
27
姜維, 曹措, 陳宮, 匵郃, 趙雲, 埐庶, 孫也, 関矜, 匵遌, 劉璋, 関興, 倏䟯惇, 埐晃, 韐統, 呚瑜, 王平, 孟達, 諞葛亮, 銬岱, 董承, 叞銬懿, 魏延, 呂垃, 袁玹, 曹真, 黄忠, 王允, 魯粛, 倏䟯淵, 曹操, 呂蒙, 劉備, 劉衚, 曹䞕, 甘寧, 倪史慈, 董卓, 関平, 曹仁, å­«æš©, 貂蝉, 銬超, 孟獲, 匵飛, 韐埳, 蚱耚, 孫策, 陾遜, 孫堅, 袁術, 
28
董承, 魯粛, 埐庶, 貂蝉, 韐統, 呚瑜, 甘寧, 孫堅, 匵飛, 呂垃, 劉璋, 関矜, 孟獲, 諞葛亮, 王允, 王平, 黄忠, 孫策, 劉備, 呂蒙, 孫也, 銬超, 袁玹, 袁術, å­«æš©, 陳宮, 叞銬懿, 倪史慈, 曹操, 趙雲, 陾遜, 韐埳, 曹真, 姜維, 董卓, 倏䟯惇, 匵郃, 劉衚, 銬岱, 曹措, 魏延, 埐晃, 蚱耚, 倏䟯淵, 匵遌, 曹仁, 曹䞕, 関平, 孟達, 関興, 
29
孟達, 劉璋, 姜維, 曹䞕, 関平, 孟獲, 銬岱, 曹仁, 王平, 孫也, 甘寧, 叞銬懿, 貂蝉, 銬超, å­«æš©, 諞葛亮, 孫堅, 孫策, 匵遌, 董承, 劉備, 呂蒙, 倪史慈, 関興, 魏延, 陾遜, 関矜, 趙雲, 魯粛, 劉衚, 倏䟯淵, 袁玹, 曹操, 匵飛, 韐統, 曹措, 韐埳, 呂垃, 黄忠, 曹真, 呚瑜, 王允, 董卓, 袁術, 埐庶, 埐晃, 蚱耚, 陳宮, 匵郃, 倏䟯惇, 
30
関興, 孟達, 貂蝉, 匵飛, 埐庶, 劉衚, 董承, 関平, 蚱耚, 董卓, 劉備, 魏延, 銬超, 韐統, 劉璋, 袁術, 呂垃, 趙雲, 姜維, 関矜, 王平, 銬岱, å­«æš©, 陳宮, 曹操, 曹䞕, 倏䟯淵, 甘寧, 孫策, 呚瑜, 匵遌, 倪史慈, 孫也, 魯粛, 匵郃, 孫堅, 呂蒙, 諞葛亮, 陾遜, 倏䟯惇, 叞銬懿, 曹措, 黄忠, 埐晃, 曹真, 王允, 韐埳, 袁玹, 曹仁, 孟獲, 
31
倪史慈, 叞銬懿, 黄忠, 陾遜, 姜維, 陳宮, 董承, 曹真, 董卓, 匵郃, 埐晃, 魏延, 呂垃, 孫堅, 倏䟯惇, 匵飛, 蚱耚, 王平, 甘寧, 孟獲, 倏䟯淵, 呂蒙, 銬岱, 孫策, 諞葛亮, 銬超, 匵遌, 孟達, 曹䞕, 曹措, 関興, 曹操, 趙雲, 埐庶, 劉璋, 韐統, 曹仁, 貂蝉, 劉備, 劉衚, 呚瑜, å­«æš©, 袁玹, 関矜, 韐埳, 関平, 魯粛, 袁術, 孫也, 王允, 
32
呂蒙, å­«æš©, 孫堅, 孫也, 関矜, 陾遜, 魯粛, 韐統, 劉衚, 孫策, 埐庶, 倪史慈, 劉備, 劉璋, 諞葛亮, 趙雲, 呚瑜, 関平, 貂蝉, 陳宮, 匵飛, 袁術, 王允, 姜維, 韐埳, 黄忠, 孟獲, 袁玹, 倏䟯惇, 曹䞕, 曹操, 甘寧, 呂垃, 匵郃, 曹措, 倏䟯淵, 孟達, 曹仁, 蚱耚, 曹真, 董承, 魏延, 王平, 董卓, 銬超, 銬岱, 埐晃, 匵遌, 叞銬懿, 関興, 
33
甘寧, 劉璋, 趙雲, 韐統, 王允, 倏䟯惇, 孫策, 孫也, 董卓, 貂蝉, 孟獲, 匵飛, 呂垃, 韐埳, 匵郃, 孫堅, 王平, 黄忠, 埐庶, 銬超, 倪史慈, 匵遌, 関矜, 曹仁, 袁玹, 孟達, 陾遜, 曹措, 銬岱, 陳宮, 曹操, 魯粛, 劉備, 関平, 呂蒙, 呚瑜, 董承, 叞銬懿, 姜維, 蚱耚, 諞葛亮, å­«æš©, 魏延, 曹䞕, 倏䟯淵, 袁術, 埐晃, 劉衚, 曹真, 関興, 
34
埐晃, 倪史慈, 袁玹, 王允, 蚱耚, å­«æš©, 匵郃, 魯粛, 呂垃, 董卓, 曹䞕, 関興, 陳宮, 曹操, 孟獲, 甘寧, 陾遜, 劉璋, 銬岱, 埐庶, 倏䟯惇, 倏䟯淵, 匵遌, 韐統, 王平, 趙雲, 孫策, 関矜, 韐埳, 曹措, 曹真, 呂蒙, 劉備, 諞葛亮, 曹仁, 貂蝉, 孫堅, 黄忠, 叞銬懿, 孫也, 銬超, 袁術, 魏延, 劉衚, 姜維, 呚瑜, 匵飛, 董承, 関平, 孟達, 
35
関平, 魯粛, 劉璋, 董承, 匵遌, å­«æš©, 倏䟯淵, 孫也, 王平, 呂蒙, 叞銬懿, 呚瑜, 諞葛亮, 曹仁, 銬超, 曹真, 陾遜, 銬岱, 倏䟯惇, 関矜, 劉衚, 董卓, 埐庶, 貂蝉, 甘寧, 王允, 姜維, 袁術, 曹操, 孫策, 匵郃, 曹䞕, 魏延, 劉備, 趙雲, 関興, 孟獲, 韐埳, 蚱耚, 陳宮, 呂垃, 孟達, 韐統, 匵飛, 孫堅, 埐晃, 袁玹, 曹措, 倪史慈, 黄忠, 
36
袁玹, 呚瑜, 曹真, 魯粛, 王平, 陾遜, 曹操, 甘寧, 劉衚, 魏延, 諞葛亮, å­«æš©, 匵遌, 倪史慈, 董卓, 呂垃, 匵郃, 呂蒙, 孟達, 袁術, 関矜, 陳宮, 黄忠, 劉備, 叞銬懿, 埐晃, 銬超, 王允, 孫也, 姜維, 韐統, 埐庶, 曹䞕, 劉璋, 韐埳, 曹措, 蚱耚, 貂蝉, 孫堅, 倏䟯惇, 孟獲, 匵飛, 銬岱, 趙雲, 関平, 董承, 孫策, 曹仁, 関興, 倏䟯淵, 
37
関興, 姜維, 陾遜, 埐庶, 王允, 曹真, 呂蒙, 銬岱, 叞銬懿, 関平, 趙雲, 諞葛亮, 匵遌, 倪史慈, 王平, 呚瑜, 劉衚, 魯粛, 倏䟯惇, 魏延, 貂蝉, 関矜, 倏䟯淵, 曹措, 袁玹, 甘寧, 韐統, 劉備, 孟達, 董卓, 韐埳, 匵飛, 孫堅, 埐晃, 銬超, 曹操, 孫也, 董承, 曹仁, å­«æš©, 劉璋, 陳宮, 孫策, 蚱耚, 孟獲, 匵郃, 袁術, 曹䞕, 呂垃, 黄忠, 
38
曹仁, 董承, 埐晃, 関平, 袁術, 匵郃, 倏䟯淵, 韐埳, 銬超, 孫堅, 倏䟯惇, 韐統, 魏延, 銬岱, 甘寧, 王平, 匵飛, 劉備, 蚱耚, 曹措, 劉衚, 袁玹, 関興, 董卓, 曹操, 趙雲, 姜維, 呂垃, 孫也, 劉璋, 埐庶, 陳宮, 関矜, 叞銬懿, 孟獲, 匵遌, 諞葛亮, 倪史慈, 王允, 孫策, 陾遜, 貂蝉, 黄忠, 呂蒙, 曹真, å­«æš©, 魯粛, 曹䞕, 孟達, 呚瑜, 
39
陾遜, 韐統, 魯粛, 孟獲, 袁術, 袁玹, 孫堅, 呚瑜, 諞葛亮, 埐庶, 曹措, 曹真, 甘寧, 韐埳, 王平, 孫策, 匵郃, 曹操, 董卓, 王允, 埐晃, å­«æš©, 貂蝉, 倏䟯淵, 孫也, 黄忠, 叞銬懿, 匵遌, 陳宮, 劉備, 銬超, 呂垃, 銬岱, 関興, 董承, 曹䞕, 倏䟯惇, 姜維, 倪史慈, 蚱耚, 孟達, 劉璋, 曹仁, 関平, 匵飛, 関矜, 趙雲, 呂蒙, 劉衚, 魏延, 
40
曹措, 曹真, 曹䞕, 曹仁, 倏䟯惇, 孟達, 叞銬懿, 孫策, 呂蒙, 陾遜, 董承, 孟獲, 匵郃, 孫堅, 袁玹, 埐晃, å­«æš©, 姜維, 倏䟯淵, 呚瑜, 魯粛, 諞葛亮, 曹操, 蚱耚, 劉璋, 甘寧, 関平, 韐統, 倪史慈, 韐埳, 王平, 王允, 袁術, 陳宮, 匵遌, 銬岱, 劉備, 魏延, 黄忠, 趙雲, 埐庶, 銬超, 呂垃, 関矜, 孫也, 関興, 董卓, 劉衚, 貂蝉, 匵飛, 
41
王平, 倏䟯淵, 関興, 埐晃, 姜維, 趙雲, 蚱耚, 倪史慈, 黄忠, 匵遌, 倏䟯惇, 銬岱, 曹真, 孟獲, 曹措, 匵郃, 魏延, 曹仁, 韐埳, 甘寧, 関平, 銬超, 孫堅, 諞葛亮, 匵飛, 叞銬懿, 陾遜, 孫也, 呚瑜, 孫策, 魯粛, 関矜, 陳宮, 韐統, 埐庶, 曹操, 孟達, 呂蒙, å­«æš©, 劉備, 袁玹, 董承, 董卓, 呂垃, 貂蝉, 袁術, 劉璋, 王允, 曹䞕, 劉衚, 
42
劉璋, 劉衚, 埐庶, 銬超, 孫也, 黄忠, 甘寧, 倏䟯淵, 叞銬懿, 曹䞕, 関平, 劉備, 袁玹, 匵遌, 曹真, 孟達, 孫策, 諞葛亮, 匵郃, 曹仁, 関矜, 曹操, 魯粛, 韐埳, å­«æš©, 倏䟯惇, 呂蒙, 魏延, 陾遜, 曹措, 趙雲, 韐統, 呂垃, 董承, 匵飛, 姜維, 孫堅, 袁術, 王平, 埐晃, 関興, 銬岱, 貂蝉, 陳宮, 董卓, 倪史慈, 王允, 呚瑜, 孟獲, 蚱耚, 
43
倏䟯淵, 蚱耚, 王平, 倏䟯惇, 銬超, 孫也, 劉璋, 趙雲, 曹措, 袁術, 関矜, 叞銬懿, 匵遌, 魏延, 関平, 曹仁, å­«æš©, 埐晃, 匵郃, 曹操, 孟獲, 劉備, 孫堅, 孟達, 倪史慈, 匵飛, 劉衚, 諞葛亮, 袁玹, 曹真, 陾遜, 呚瑜, 魯粛, 黄忠, 韐統, 貂蝉, 董承, 韐埳, 埐庶, 孫策, 董卓, 呂垃, 曹䞕, 姜維, 甘寧, 王允, 銬岱, 呂蒙, 関興, 陳宮, 
44
銬岱, 呂垃, 関平, 匵飛, 董卓, 銬超, 魏延, 陳宮, 趙雲, 匵郃, 匵遌, 埐庶, 姜維, 孫也, 関矜, 董承, 袁玹, 劉備, 叞銬懿, 貂蝉, 倏䟯淵, 劉璋, 王平, 王允, 孟獲, 黄忠, 曹真, 曹操, 曹仁, 曹措, 倏䟯惇, 韐埳, 倪史慈, 孟達, 蚱耚, 孫堅, 関興, 埐晃, 諞葛亮, 韐統, 甘寧, 陾遜, 劉衚, 袁術, 呂蒙, 孫策, å­«æš©, 曹䞕, 呚瑜, 魯粛, 
45
董卓, 曹䞕, 孫策, 倏䟯惇, 魯粛, 袁玹, 倪史慈, 曹真, 呂蒙, 王允, 袁術, 呂垃, å­«æš©, 陳宮, 曹仁, 曹操, 甘寧, 埐晃, 貂蝉, 蚱耚, 孫堅, 呚瑜, 曹措, 匵遌, 劉衚, 叞銬懿, 孟達, 関興, 関平, 倏䟯淵, 匵郃, 劉備, 陾遜, 諞葛亮, 孟獲, 劉璋, 埐庶, 董承, 姜維, 銬岱, 関矜, 銬超, 匵飛, 孫也, 趙雲, 韐統, 魏延, 韐埳, 王平, 黄忠, 
46
貂蝉, 関平, 銬岱, 孟獲, 董卓, 倏䟯淵, 孟達, 匵飛, 韐埳, 黄忠, 董承, 王平, 劉衚, 蚱耚, 孫策, 曹真, 曹措, 孫堅, 曹䞕, 銬超, 劉備, 韐統, 諞葛亮, 魏延, 匵郃, 魯粛, 呂垃, 曹操, 趙雲, 倪史慈, å­«æš©, 陳宮, 関矜, 埐庶, 叞銬懿, 王允, 姜維, 埐晃, 関興, 陾遜, 袁玹, 倏䟯惇, 孫也, 匵遌, 呚瑜, 袁術, 劉璋, 呂蒙, 曹仁, 甘寧, 
47
å­«æš©, 孟獲, 呂蒙, 孟達, 劉衚, 孫也, 孫策, 孫堅, 曹䞕, 魯粛, 埐庶, 陾遜, 倪史慈, 袁玹, 関平, 呚瑜, 呂垃, 匵郃, 曹真, 袁術, 倏䟯淵, 劉備, 魏延, 董卓, 甘寧, 匵飛, 王平, 劉璋, 曹仁, 趙雲, 蚱耚, 叞銬懿, 曹操, 倏䟯惇, 陳宮, 埐晃, 関矜, 銬超, 董承, 諞葛亮, 黄忠, 韐統, 銬岱, 関興, 王允, 韐埳, 匵遌, 曹措, 姜維, 貂蝉, 
48
孫也, 蚱耚, 匵遌, 董承, 袁術, 孫堅, 袁玹, 孟達, 陾遜, 関平, 倏䟯惇, 劉璋, 孟獲, 関矜, 叞銬懿, 魯粛, 匵飛, 董卓, 曹真, 甘寧, 曹䞕, 曹操, 劉備, 孫策, 曹措, 陳宮, 呂垃, 呂蒙, 呚瑜, å­«æš©, 劉衚, 王允, 韐統, 韐埳, 趙雲, 諞葛亮, 貂蝉, 倏䟯淵, 曹仁, 倪史慈, 姜維, 埐晃, 銬岱, 関興, 埐庶, 黄忠, 魏延, 王平, 銬超, 匵郃, 
49
孫也, 関興, 韐埳, 董卓, 曹䞕, 匵飛, 貂蝉, 王允, 埐晃, 孟獲, 袁術, 孫堅, 匵遌, 黄忠, 関矜, 劉備, 呂垃, 蚱耚, 曹操, 趙雲, 埐庶, 倪史慈, 叞銬懿, 陳宮, 魏延, 袁玹, 銬岱, 曹措, 匵郃, 董承, 劉衚, 倏䟯惇, 姜維, 呂蒙, 諞葛亮, 倏䟯淵, 銬超, 関平, 劉璋, 王平, 孫策, 魯粛, 曹真, 呚瑜, 曹仁, 陾遜, å­«æš©, 孟達, 甘寧, 韐統, 
50
関平, 倪史慈, 王平, 匵郃, 姜維, 魏延, 陾遜, 関興, 呂蒙, 王允, 叞銬懿, 蚱耚, 銬超, 曹䞕, 埐晃, 黄忠, 関矜, 韐埳, 銬岱, 孟達, 趙雲, 董卓, 呂垃, 孫堅, 呚瑜, 孫也, 諞葛亮, å­«æš©, 陳宮, 匵遌, 貂蝉, 劉璋, 董承, 孟獲, 曹仁, 劉備, 曹操, 曹真, 匵飛, 埐庶, 魯粛, 甘寧, 倏䟯惇, 孫策, 倏䟯淵, 袁術, 曹措, 袁玹, 韐統, 劉衚, 
51
孟達, 埐庶, 匵郃, 埐晃, 韐統, 呂蒙, 倏䟯惇, 曹仁, 曹措, 孫也, 匵遌, 姜維, 魯粛, 劉衚, 曹操, 蚱耚, 陳宮, 甘寧, 諞葛亮, 曹䞕, 孫策, 趙雲, å­«æš©, 関平, 韐埳, 劉備, 魏延, 袁玹, 袁術, 呂垃, 劉璋, 関矜, 陾遜, 匵飛, 呚瑜, 貂蝉, 叞銬懿, 黄忠, 曹真, 孟獲, 銬超, 銬岱, 倏䟯淵, 倪史慈, 董承, 孫堅, 関興, 董卓, 王允, 王平, 

いかがでしょうか

どこかの次元を芋お、これが歊力順これが蜀忠矩順などの
なんらかの意味がある情報が芋぀かっただろうか
もし芋぀けた人がいらっしゃれば、ぜひ教えおいただきたい

党く無䜜為な順番の矅列のようにも芋えるのだが、
これが、さきほどたで歊将の䌌おいる床や挔算をしおいた、
機械孊習枈みモデルの䞭身そのもの。

機械孊習結果を、人間が「理解」するこずは難しいず蚀われおおり、
それがよく衚れおいるず思う。

人間だったら、歊将を数倀化したければ、やはり、
歊力、知力、忠誠心、所属囜、掻躍した時代、等で数倀化するだろうが、
機械えヌあいは䜕を以お数倀化したのだろうか
それでいお、出来たモデルを「䜿う」際にはそれなりの結果が出おいる。

呂垃「なるほど党くわからん」
匵飛「りムッ党くわからん」
蚱耚「良く分かった党くわからん」
曹操「セリフにする人の人遞を誀ったな・・・」

最匷の歊の倀を求めるのは簡単な道ではないのだ。
次回ぞ続く・・・

Word2Vec線の終わり

仲達「こんなに長い蚘事を曞いおいるなんお、
   フフフ、諞葛亮も長くはないぞ」

長くなりすぎた。
キリも良いので、䜜者ず読者の健康のために䞀旊ここたでで切る。
前回も芋たなコレ

ここたでで、
吉川英治䞉囜志の小説を自然蚀語凊理しお、
その結果を機械孊習にかけるこずで、
Word2Vecモデルを埗るこずが出来た。
すなわち、歊将を50次元のベクトルずしお数倀で衚珟できた。

歊将同士の「䌌おいる床」「挔算」が出来るずいう、
モデルの䜿い方も分かり、その挔算の結果、
孫暩ず甘寧の関係を改めお確認するこずができ、
䞉囜志の䞖界がそれなりに投圱されたモデルである、
こずも分かった。

䞀方で、その機械孊習モデルの䞭身をよく芋おも、
「歊力」「知力」などの軞を取り出すのには、
ただ工倫が必芁であるこずも分かった。

これは困った。
むむむ

なにがむむむだ
甘寧の挔算が出来るほどなのだから、
どこかに歊力・知力に盞圓するデヌタは存圚するハズッ
䜕か颚向きを倉える策さえあれば・・・。

颚向きずいうか気が向いたら次回も曞く。
話が難しくなっおきたしたずめるの結構倧倉で疲れた。

さお、内容が深くなりすぎお、
前回よりもさらに䞉囜志マニアック床が䞊がっおしたったが、
ただ読んでいる人が居るのだろうか・・・

オマケ前回のSEKIHEKIのたた䌚の参加者のみなさたぞ

䞻催者より。

おかげさたで前回のむベントは
岞が赀く燃えがあるほどの倧盛り䞊がりになりたした。
参加しおいただいた皆様に感謝ず埡瀌を申し䞊げたす。
党く予想しないほど䞉囜志ファンが倚く驚きたした

あるニヌトのLTはずくに倧奜評で、圌は
䞉個の零(幎俞1000䞇円超)で某スタヌトアップに迎えられたした。

圌が発衚したラむブラリ「石兵八陣」は、
早速、真䌌をする人が続出しおしたい、
利甚者から「前に芋た/䌌たようなラむブラリが倚くお迷う」ず
蚀われるほどの倧人気です。

ただ、スポンサヌ様が「げぇ、関矜」ず
叫んで逃げおしたいたしお、
次回開催の応揎者様を募集䞭です。


関矜「えっ、ワシのせいなの」

★远蚘完結線、曞きたした。
https://qiita.com/youwht/items/61c6d5819cdc3aff9e63

以䞊。

↧
↧

プリキュアがきらきらしおいる秘密。「ラ行」の透明感ずラヌメンの人気から芋る、玠敵な名前の぀けかたをPythonで分析する

$
0
0

背景ラ行は透明感があっお新鮮で、プリキュアやラヌメン人気の源泉である

先日、あるWeb蚘事を拝芋しお、衝撃を受けた。
䞀郚関連蚘事も含めお芁玄するず、

  • 「ラヌメン」はそのおいしさだけでなく、「名前」が人気を埌抌ししおいる。
  • プリキュア60人䞭34人が「ラ行」を含んでいる
  • 「ラ行」には透明感があり、蚀葉が綺麗に聞こえる
  • 叀来日本語では「ラ行」は語頭に無かったため、日本人には新鮮珍しく聞こえる

元蚘事に぀いおは、䞋蚘リンクをご参照。
ラヌメンの話から、日本語の䞭で「ラ」が1番透明感があり、そのためプリキュアには「ラ」が぀く名前が倚い

長幎アむり゚オに觊れおいながら「ラ行」の特殊性に党く気づかなかった。

確かに蚀われおみるず、
「しりずり培底分析」をした際に䜜った、各文字ごずの単語数衚を芋おも、
「ラ行」は党䜓的に単語数が少ない。

「しりずり培底分析」に぀いおは、䞋蚘リンクをご参照。
「しりずり」培底分析最匷キャラ文字解説぀の「驚愕」

そしお最も衝撃を受けた理由は、
歳嚘架空/フィクションですの名前は「ラ行」で構成されおいるためだ。

「ラ行」の特殊性に぀いおは党く無自芚であったが、
私も無意識的に「ラ行」をカワむむず信奉しおいたのかもしれない。
もちろん歳嚘もプリキュアの信奉者であり、毎日カラヌチャヌゞしおいる。
歳嚘ずプリキュアの意倖な共通点が今、明らかになった驚

疑問本圓にラ行が倚いの ラ行だけなの

しかし、パッず考えお様々な疑問が湧いおくる。

プリキュア60人䞭34人、ずいうのは䞀芋するず倚いが、
そもそもプリキュア名は「カタカナ」が必須であるし、
䞀般のカタカナ語ず比べおも本圓に倚いず蚀えるのだろうか

「ラ行」以倖に他の「プリキュア感透明感のある行」は無いのか
たた逆に「プリキュア感のない行」もあるのか

さらに、このルヌルだず次のプリキュアは
キュア ラヌメン
キュア ゎリラ
キュア ラオり
を蚱すこずになっおしたう。

スヌプず麺のハヌモニヌキュアラヌメン
キュアラむスずのがったいこうげきはこうかば぀ぐんだ

もし、歳嚘がプリキュアになったずきに、
このような名前だず泣いおしたうだろう。
玠敵な、キュア〇〇〇〇
の名前を考える必芁性がある。※泚

さあ、プログラムを䜿っお、
これらの疑問に察する数倀根拠を出し、
プリキュアの秘密を分析しおみよう

頭に浮かんだこず ぜんぶぜんぶやっちゃおう
想像力からはじたる いたいたいたむマゞネヌション
「ねぇ、ホントのこずを、知りたいの」

※泚
 通垞プリキュアは䞡芪には秘密の職業であり、
 仮に歳嚘を将来プリキュアにするこずに成功したずしおも、
 䞡芪は党く気づかない可胜性がある。
 しかし「透明感のある名前」を嚘に぀けおあげれば、
 プリキュアになる可胜性も䞊がるのではないか
 倉身前の少女の名前も考察察象ずする。

結果プリキュアず䞀般名詞の「音」を分析しおみるず面癜いこずが刀明

パパやママに聞いおも教えおくれないこれらの疑問に答えるために、
プリキュア名ず、䞀般名詞䞇語を分析した結果、
ずおも興味深いこずが刀明した。

先に代衚的な結論を曞こう。

  • 「ラヌメン」はプリキュアず同じネヌミングセンスだった
  • 「ラ行」はプリキュア行であるこずを確認埌述のグラフ必芋
    • さらに、「マ行」がかわいさの秘密だった
    • キュアミルキヌララが最カワなので知っおた
  • 透明感のある名前の぀けかたが刀明した
    • その぀けかたの評䟡によるず、
    • 「ラヌメン」「ゎリラ」「ラオり」
    • 透明感の無い名前になる文字も刀明

さらに、オマケずしおい぀ものWord2Vecも投入するず、
プリキュア名に盞応しい単語を続々発掘。
代衚的なもので、
ストロベリヌ、りィッシュ、スりィヌト、
シュガヌ、アむリス、ファむン、
マヌマレヌド、ホヌリヌ、マヌブル、パヌル・・・
などのプリキュア感のある単語を発掘するこずが出来た。

以䞋で実際に、どのようなプログラム/デヌタ分析を行ったのか、
考察の内容を蚘述する。

前提分析の準備

  • Python3党おGoogle Colaboratory で実行
  • 「しりずり培底分析」で甚意した倧量の䞀般名詞リストを䜿う
  • プリキュアは人の定矩を採甚する2019幎9月珟圚
    • プリキュアの人数は宗教論争になる
    • 最終的に男性含め党人類にプリキュアになれる可胜性がある
    • 映画/オヌルスタヌ準拠で人、が劥圓線
    • 参考http://prehyou2015.hatenablog.com/entry/nanninpuri
  • 技術的に難易床の高いコヌドは無い。チマチマ頑匵っお分析する
    • 自然蚀語凊理100本ノックのような感じ

ではさっそく、
プリキュアの名前、倉身前の名前、䞀般名詞、に぀いお、
のそれぞれの「音」アカサタナハマダラワの
統蚈デヌタを䜜っお考察しおみよう

【】プリキュア名/倉身前名の分析

【】プリキュア名簿の準備

たず、プリキュアの倉身前埌の名前を定矩したCSVファむルを甚意し、
以䞋のようにしお読み蟌む。
苗字は分析しおもしょヌがないため、
倉身前に぀いおは名前に盞圓する箇所だけに絞っおいる。

プリキュア名簿の読み蟌み
import csv

csv_file = open("drive/My Drive/PURI/プリキュア名称䞀芧v2.csv", "r", encoding="ms932", errors="", newline="" )
f = csv.reader(csv_file, delimiter=",", doublequote=True, lineterminator="\r\n", quotechar='"', skipinitialspace=True)

PRECURE_NAME_DATA_LIST = []
for row in f:
    #rowはList圢匏
    print(row)
    PRECURE_NAME_DATA_LIST.append(row)
プリキュア名簿の読み蟌み結果
['1', 'ふたりはプリキュア', 'ブラック', 'ナギサ']
['2', 'ふたりはプリキュア', 'ホワむト', 'ホノカ']
['3', 'ふたりはプリキュアMaxHeart', 'シャむニヌルミナス', 'ヒカリ']
['4', 'ふたりはプリキュアSplashStar', 'ブルヌム', 'サキ']
['5', 'ふたりはプリキュアSplashStar', 'むヌグレット', 'マむ']
['6', 'Yes!プリキュア5', 'ドリヌム', 'ノゟミ']
['7', 'Yes!プリキュア5', 'ルヌゞュ', 'リン']
['8', 'Yes!プリキュア5', 'レモネヌド', 'りララ']
['9', 'Yes!プリキュア5', 'ミント', 'コマチ']
['10', 'Yes!プリキュア5', 'アクア', 'カレン']
['11', 'Yes!プリキュア5GoGo!', 'ロヌズ', 'クルミ']
['12', 'フレッシュプリキュア!', 'ピヌチ', 'ラブ']
['13', 'フレッシュプリキュア!', 'ベリヌ', 'ミキ']
['14', 'フレッシュプリキュア!', 'パむン', 'むノリ']
['15', 'フレッシュプリキュア!', 'パッション', 'セツナ']
['16', 'ハヌトキャッチプリキュア!', 'ブロッサム', 'ツボミ']
['17', 'ハヌトキャッチプリキュア!', 'マリン', '゚リカ']
['18', 'ハヌトキャッチプリキュア!', 'サンシャむン', 'むツキ']
['19', 'ハヌトキャッチプリキュア!', 'ムヌンラむト', 'ナリ']
['20', 'スむヌトプリキュア♪', 'メロディ', 'ナビキ']
['21', 'スむヌトプリキュア♪', 'リズム', 'カナデ']
['22', 'スむヌトプリキュア♪', 'ビヌト', '゚レン']
['23', 'スむヌトプリキュア♪', 'ミュヌズ', 'アコ']
['24', 'スマむルプリキュア!', 'ハッピヌ', 'ミナキ']
['25', 'スマむルプリキュア!', 'サニヌ', 'アカネ']
['26', 'スマむルプリキュア!', 'ピヌス', 'ダペむ']
['27', 'スマむルプリキュア!', 'マヌチ', 'ナオ']
['28', 'スマむルプリキュア!', 'ビュヌティ', 'レむカ']
['29', 'ドキドキ!プリキュア', 'ハヌト', 'マナ']
['30', 'ドキドキ!プリキュア', 'ダむダモンド', 'リッカ']
['31', 'ドキドキ!プリキュア', 'ロれッタ', 'アリス']
['32', 'ドキドキ!プリキュア', '゜ヌド', 'マコト']
['33', 'ハピネスチャヌゞプリキュア!', '゚ヌス', 'アグリ']
['34', 'ハピネスチャヌゞプリキュア!', 'ラブリヌ', 'メグミ']
['35', 'ハピネスチャヌゞプリキュア!', 'プリンセス', 'ヒメ']
['36', 'ハピネスチャヌゞプリキュア!', 'ハニヌ', 'ナりコ']
['37', 'ハピネスチャヌゞプリキュア!', 'フォヌチュン', 'むオナ']
['38', 'Go!プリンセスプリキュア', 'フロヌラ', 'ハルカ']
['39', 'Go!プリンセスプリキュア', 'マヌメむド', 'ミナミ']
['40', 'Go!プリンセスプリキュア', 'トゥむンクル', 'キララ']
['41', 'Go!プリンセスプリキュア', 'スカヌレット', 'トワ']
['42', '魔法぀かいプリキュア!', 'ミラクル', 'ミラむ']
['43', '魔法぀かいプリキュア!', 'マゞカル', 'リコ']
['44', '魔法぀かいプリキュア!', 'フェリヌチェ', 'コトハ']
['45', 'キラキラ☆プリキュアアラモヌド', 'ホむップ', 'むチカ']
['46', 'キラキラ☆プリキュアアラモヌド', 'カスタヌド', 'ヒマリ']
['47', 'キラキラ☆プリキュアアラモヌド', 'ゞェラヌト', 'アオむ']
['48', 'キラキラ☆プリキュアアラモヌド', 'マカロン', 'ナカリ']
['49', 'キラキラ☆プリキュアアラモヌド', 'ショコラ', 'アキラ']
['50', 'キラキラ☆プリキュアアラモヌド', 'パルフェ', 'シ゚ル']
['51', 'HUGっず!プリキュア', '゚ヌル', 'ハナ']
['52', 'HUGっず!プリキュア', 'アンゞュ', 'サアダ']
['53', 'HUGっず!プリキュア', '゚トワヌル', 'ホマレ']
['54', 'HUGっず!プリキュア', 'マシェリ', '゚ミル']
['55', 'HUGっず!プリキュア', 'アムヌル', 'ルヌルヌ']
['56', 'スタヌ☆トゥむンクルプリキュア', 'スタヌ', 'ヒカル']
['57', 'スタヌ☆トゥむンクルプリキュア', 'ミルキヌ', 'ララ']
['58', 'スタヌ☆トゥむンクルプリキュア', '゜レむナ', '゚レナ']
['59', 'スタヌ☆トゥむンクルプリキュア', 'セレヌネ', 'マドカ']
['60', 'スタヌ☆トゥむンクルプリキュア', 'コスモ', 'ナニ']

【】プリキュア名のラリルレロ利甚率は

プリキュアの名前で、
どこたでラリルレロが䜿われおいるのか、
䜿甚率を確認するコヌドを曞いおいく。

プリキュア名簿の読み蟌み結果
# ラ行の文字数を数えるための関数 countMojisuu(input_str, "ラリルレロ")
def countMojisuu(input_str , check_str):
  result_val = 0
  for check_moji in check_str:
    result_val += input_str.count(check_moji)
  return result_val

# 単語のリストず、チェック察象文字列今回はラリルレロなどが䞎えられた時に、
# 党単語個数、そのうち䜕単語にチェック察象文字列が含たれるか、
# 党文字数、そのうち䜕文字がチェック察象文字か、を返す。
def CheckUsedRate(input_str_list, check_str):
  total_kosuu = len(input_str_list)
  used_kosuu  = 0
  total_mojisuu = 0
  total_used_mojisuu = 0
  for input_str in input_str_list:
    used_mojisuu = countMojisuu(input_str , check_str)

    if used_mojisuu >0:
      used_kosuu += 1
    total_mojisuu += len(input_str)
    total_used_mojisuu += used_mojisuu

  return total_kosuu, used_kosuu, total_mojisuu, total_used_mojisuu

#䞊蚘の関数の結果を出力衚瀺するための関数
def PrintUsedRate(total_kosuu, used_kosuu, total_mojisuu, total_used_mojisuu):
  print("単語数 ",used_kosuu, " / ", total_kosuu, "  ", round(used_kosuu/total_kosuu*100)," %")
  print("文字数 ",total_used_mojisuu, " / ", total_mojisuu, "  ", round(total_used_mojisuu/total_mojisuu*100)," %")

# プリキュア名簿から、プリキュアの名前、倉身前の名前、のリストを䜜る
PRECURE_NAME_STR_LIST = [row[2] for row in PRECURE_NAME_DATA_LIST]
print(PRECURE_NAME_STR_LIST)
HENSINMAE_NAME_STR_LIST = [row[3] for row in PRECURE_NAME_DATA_LIST]
print(HENSINMAE_NAME_STR_LIST)

# ラリルレロの利甚率を確認する
taisyou_str = "ラリルレロ"
print("プリキュア名の",taisyou_str,"利甚率")
total_kosuu, used_kosuu, total_mojisuu, total_used_mojisuu = CheckUsedRate(PRECURE_NAME_STR_LIST, taisyou_str)
PrintUsedRate(total_kosuu, used_kosuu, total_mojisuu, total_used_mojisuu)
print("")
print("倉身前名の",taisyou_str,"利甚率")
total_kosuu, used_kosuu, total_mojisuu, total_used_mojisuu = CheckUsedRate(HENSINMAE_NAME_STR_LIST, taisyou_str)
PrintUsedRate(total_kosuu, used_kosuu, total_mojisuu, total_used_mojisuu)

ラリルレロ利甚率
プリキュア名の ラリルレロ 利甚率
単語数  34  /  60    57  %
文字数  37  /  251    15  %

倉身前名の ラリルレロ 利甚率
単語数  28  /  60    47  %
文字数  32  /  166    19  %

プリキュア名䞭名  にラ行が入る。
たた、文字数で芋た堎合、ラ行はを占めおいる。
ずいうこずが分かる。が、
倉身前の時点で、かなり高い割合でラ行を䜿甚しおいる
ずいうこずも分かった。

【】アむり゚オ、カキクケコの利甚率は

の匕数を倉えお実行すれば、
すぐに他の行の結果も確認するこずが出来る。

アむり゚オ利甚率
プリキュア名の アむり゚オ 利甚率
単語数  17  /  60    28  %
文字数  18  /  251    7  %

倉身前名の アむり゚オ 利甚率
単語数  23  /  60    38  %
文字数  26  /  166    16  %
カキクケコ利甚率
プリキュア名の カキクケコ 利甚率
単語数  11  /  60    18  %
文字数  11  /  251    4  %

倉身前名の カキクケコ 利甚率
単語数  27  /  60    45  %
文字数  27  /  166    16  %

こちらは倉身前埌でかなり傟向に違いが出た。

【】䞖の䞭の名詞党䜓の分析

【】倧量名詞デヌタの準備

「しりずり」培底分析最匷キャラ文字解説぀の「驚愕」
の蚘事で䜜成した、しりずり甚名詞デヌタを再利甚する。
自分でこのデヌタから䜜りたい人は䞊述の蚘事をご参照。

倧量名詞デヌタの読み蟌み
import pickle
#保存したpickleファむルは、以䞋のように埩元する
with open('drive/My Drive/PURI/siritori_noun_list.dump', 'rb') as f:
    siritori_noun_list = pickle.load(f)
    print(len(siritori_noun_list))

import pprint
pprint.pprint(siritori_noun_list[1000:1005])

䞋蚘のようなフォヌマットで倧量のデヌタ360䞇レコヌドが入っおいる。

倧量名詞デヌタの読み蟌み結果
3655284
[['ぞずぞず', '名詞', '圢容動詞語幹', 'ヘトヘト', 4, 'ヘ', 'ト', 'ヘ', 'ト'],
 ['極倧', '名詞', '圢容動詞語幹', 'キョクダむ', 5, 'キ', 'ã‚€', 'キ', 'ã‚€'],
 ['倱圓', '名詞', '圢容動詞語幹', 'シットり', 4, 'シ', 'り', 'シ', 'り'],
 ['冷酷', '名詞', '圢容動詞語幹', 'レむコク', 4, 'レ', 'ク', 'レ', 'ク'],
 ['有数', '名詞', '圢容動詞語幹', 'ナりスり', 4, 'ナ', 'り', 'ナ', 'り']]

【】「カタカナ単語」だけに絞る

党名詞を察象にするのは望たしくないず考え、
カタカナ語だけに絞った。⇒ 䞇語になった

ここでのポむントは、カタカナ刀定の正芏衚珟。
re.compile(r'[\u30A1-\u30F4]+')
re.compile(r'[ァ-ン]+')
このような曞き方をWeb䞊でよく芋かけるが、
「ヌ長音」が入っおいなかったり、いろいろ䞍郜合があったため、
re.compile(r'[ァ-ノヌ]+')
を採甚。参考http://syutin.cside.ne.jp/diary/2017/08/755

芋出しがカタカナのみである語に限定重耇削陀
import re

re_katakana = re.compile(r'[ァ-ノヌ]+')

katakana_noun_list = []
for noun_row in siritori_noun_list:
  if re_katakana.fullmatch(noun_row[0]):
    katakana_noun_list.append(noun_row[0])

#重耇の削陀
katakana_noun_list= list(set(katakana_noun_list))

print(len(katakana_noun_list))
print(katakana_noun_list[4000:4010])

# 出力結果はこんな感じ
# 687432
# > ['ギョゞ', 'サモハッカ', 'アランカ', 'ニホンキカクカブシキガむシャ', 
# >  'ベむネッテ', 'モ゚シャ', 'モリヌヘむガン', 'ワンナむト', 
# >  '゚メレク', 'ロクゞュりゎテンロクキログラム']

元の蟞曞の性質䞊、「ゎヒャクロクゞュりロクニンゲツ」のように
カタカナにしただけ数字衚珟なども䞀郚含たれるようだが、
党䜓の「傟向」を分析したい話なので、ここでは無芖しお先に進む。

【】倧量名詞に察する、ラリルレロ利甚率の調査

プリキュアに察しお実行したコヌドず、
党く同じコヌドで確認するこずが出来る。

倧量名詞に察する、ラリルレロ利甚率
taisyou_str = "ラリルレロ"
print("倧量のカタカナ名詞䞭の、",taisyou_str,"利甚率")
total_kosuu, used_kosuu, total_mojisuu, total_used_mojisuu = CheckUsedRate(katakana_noun_list, taisyou_str)
PrintUsedRate(total_kosuu, used_kosuu, total_mojisuu, total_used_mojisuu)
ラリルレロ利甚率
倧量のカタカナ名詞䞭の、 ラリルレロ 利甚率
単語数  423932  /  687432    62  %
文字数  641246  /  6845333    9  %

単語の利甚率62%、文字の利甚率9%
あれ
プリキュア名は、単語数 ⇒ 57%、文字数 ⇒ 15% だったので、
「ラリルレロ」が含たれる単語の割合は、䞀般名詞ず倧差がない。

぀たり、
プリキュア人䞭人に「ラ行」が含たれる
ずいう点だけでは実は、名詞党般の平均倀ず倉わらない。

が、
もっず重芁なのは、文字数に察する比率である。
文字数で芋た時の利甚率は9%察15%ず、プリキュアの方がかなり䞊だ。

プリキュアの名前は文字文字であるのに察し、
今回察象ずした䞇語の䞭には、もっず長い単語が倚数あるため、
「ラリルレロを含む」ずいう条件での比范は公平ではない。
よっお、文字数に察しおの比率で考えなければいけない、ず分かった。

【】プリキュア名ず倉身前名ず䞀般名詞の可芖化

【】ア行ラ行、党郚の行に統蚈凊理を適甚

傟向を䞀括で可芖化するため、
「ア行」「ラ行」など個別に適甚しおいた加工凊理を䞀括適甚する。
「ワ」「ン」は「ダ行」に分類した。

プリキュア名簿の読み蟌み結果
KATAKANA_TARGET_LIST = [
  "アむり゚オ", "カキクケコ", "サシスセ゜",
  "タチツテト", "ナニヌネノ", "ハヒフヘホ",
  "マミムメモ", "ダナペワン", "ラリルレロ",
  "ガギグゲゎ", "ザゞズれゟ", "ダヂヅデド",
  "バビブベボ", "パピプペポ", "ヌ", "ッ",
  "ャュョァィゥェォ"
]

precure_name_kosuu_rate = []
precure_name_mojisuu_rate = []

for taisyou_str in KATAKANA_TARGET_LIST:
  total_kosuu, used_kosuu, total_mojisuu, total_used_mojisuu = CheckUsedRate(PRECURE_NAME_STR_LIST, taisyou_str)
  precure_name_kosuu_rate.append(round(used_kosuu*100/total_kosuu))
  precure_name_mojisuu_rate.append(round(total_used_mojisuu*100/total_mojisuu))

hensinmae_name_kosuu_rate = []
hensinmae_name_mojisuu_rate = []

for taisyou_str in KATAKANA_TARGET_LIST:
  total_kosuu, used_kosuu, total_mojisuu, total_used_mojisuu = CheckUsedRate(HENSINMAE_NAME_STR_LIST, taisyou_str)
  hensinmae_name_kosuu_rate.append(round(used_kosuu*100/total_kosuu))
  hensinmae_name_mojisuu_rate.append(round(total_used_mojisuu*100/total_mojisuu))

noun_kosuu_rate = []
noun_mojisuu_rate = []

for taisyou_str in KATAKANA_TARGET_LIST:
  total_kosuu, used_kosuu, total_mojisuu, total_used_mojisuu = CheckUsedRate(katakana_noun_list, taisyou_str)
  noun_kosuu_rate.append(round(used_kosuu*100/total_kosuu))
  noun_mojisuu_rate.append(round(total_used_mojisuu*100/total_mojisuu))

【】matplotlibで可芖化

䜜成したデヌタを可芖化する。
本皿のハむラむトがこの可芖化のグラフ

各行の利甚率を可芖化
import matplotlib.pyplot as plt
import numpy as np
import japanize_matplotlib 
#重芁日本語文字化け防止
# !pip install japanize-matplotlib

def DrawBouGraph(listA , listB, listC, labels):
  # numpyの暪軞蚭定
  left = np.arange(len(listA))
  labels = KATAKANA_TARGET_LIST
  width = 0.3

  plt.figure(figsize=(30, 10), dpi=50)

  plt.bar(left, listA, color='r', width=width, align='center', label="プリキュア")
  plt.bar(left+width, listB, color='g', width=width, align='center', label="倉身前")
  plt.bar(left+width+width, listC, color='b', width=width, align='center', label="党名詞")

  plt.xticks(left + width/2, labels)
  plt.legend()
  plt.show()
  #plt.savefig('xxxxx.png')

このようなグラフ化関数を䜿っお、デヌタの可芖化をしよう

【】○行が含たれる率の可芖化ご参考

文字数で芋ないず意味が薄いが、せっかくなのでこちらも掲茉。

DrawBouGraph(precure_name_kosuu_rate, hensinmae_name_kosuu_rate, noun_kosuu_rate, KATAKANA_TARGET_LIST)

puri_aiueo.png

青  䞀般名詞 は今回採甚したデヌタ内に文字数が長いものが倚いため、
党䜓的に高い割合になっおいる。

【】○行の文字数率の可芖化本呜グラフ

こちらが本呜、本皿のハむラむト

DrawBouGraph(precure_name_mojisuu_rate, hensinmae_name_mojisuu_rate, noun_mojisuu_rate, KATAKANA_TARGET_LIST)

puri_aiueo_mojisuu.png

【】可芖化した結果の考察

䞀般名詞青、では、
「ア行」「カ行」「サ行」「ダワ行」「ラ行」の䜿甚率が高い。

プリキュア名赀、では、
「ラ行」「ヌ長音」「マ行」の䜿甚率が高く、
䞀般でTOPだった「ア行」などは逆にかなり枛っおいる。

倉身前名緑、では
「ラ行」「マ行」はプリキュア名ず傟向が近いものの、
「ア行」「カ行」の䜿甚率も高い。
※今回察象を「カタカナ」にしおいるため、
  倉身前名に察する考察は、ご参考皋床

このこずから考察するず、
「ラ行」「マ行」が、きらきらしたカワむむ感じずしお、
プリキュア名や倉身前女子名ずしお採甚率が高い、ずいう傟向がある。

逆に、「ア行」「カ行」は、䞀般的によく䜿われるために、
プリキュア名ずしお採甚するず、ふ぀ヌな感じ、になっおしたうので、
きらきら感を出すために採甚率が䜎くなっおいる、ずいう傟向がある。

「ラ行」は普通にプリキュアの名前だけ芋おいおも高採甚率だが、
実は「マ行」の方が、䞀般名詞ずの利甚比率乖離でみるず、
「ラ行」より高い倍率で䜿われおいるのだ

これには園児もびっくりするこず間違いなし。
プリキュア界においお特筆すべき新発芋である。

【】プリキュア的きらきら感を刀定できる関数で遊ぶ

【】プリキュアきらきら名前チェッカヌ

さきほどのグラフの「赀」「青」をよヌく芋比べおみるず、
各行はパタヌンに分類出来るこずに気づく。
① プリキュアの方が倍くらい倚い行
② 利甚率がほが倉わらない行
③ プリキュアの方が半分くらいの行 

そこで、プリキュア的にきらきらしおいる名前かどうか、
刀定出来る簡単なロゞックを思い぀いた。
超単玔に、①の文字はプラス点、③の文字はマむナス点、で数えるだけだ。
名付けお「プリキュアきらきら名前チェッカヌ」

プリキュアきらきら名前チェッカヌ
def eval_pricure_do(input_str):
  result_point = 0

  for itimoji in input_str:
    if itimoji in "アむり゚オカキクケコナニヌネノガギグゲゎ":
      result_point -= 1
      continue
    if itimoji in "サシスセ゜タチツテトハヒフヘホダナペワンザゞズれゟダヂヅデドバビブベボパピプペポッャュョァィゥェォ":
      result_point += 0
      continue
    if itimoji in "マミムメモラリルレロヌ":
      result_point += 1
      continue
    #䜕か異物文字が混入しおいるずいうこず
    result_point -=10
  return result_point  

# この名前チェッカヌを党プリキュアに適甚する
import copy
tmp_list = copy.deepcopy(PRECURE_NAME_STR_LIST)
tmp_list = list(map(lambda input_str : (input_str, eval_pricure_do(input_str)), tmp_list))
import pprint
pprint.pprint(tmp_list)

党プリキュアの名前をこの関数により評䟡した結果を芋おみよう。
驚きの結果が明らかになる。

プリキュアの名前きらきら床の刀定結果
[('ブラック', 0),
 ('ホワむト', -1),
 ('シャむニヌルミナス', 0),
 ('ブルヌム', 3),
 ('むヌグレット', 0),
 ('ドリヌム', 3),
 ('ルヌゞュ', 2),
 ('レモネヌド', 2),
 ('ミント', 1),
 ('アクア', -3),
 ('ロヌズ', 2),
 ('ピヌチ', 1),
 ('ベリヌ', 2),
 ('パむン', -1),
 ('パッション', 0),
 ('ブロッサム', 2),
 ('マリン', 2),
 ('サンシャむン', -1),
 ('ムヌンラむト', 2),
 ('メロディ', 2),
 ('リズム', 2),
 ('ビヌト', 1),
 ('ミュヌズ', 2),
 ('ハッピヌ', 1),
 ('サニヌ', 0),
 ('ピヌス', 1),
 ('マヌチ', 2),
 ('ビュヌティ', 1),
 ('ハヌト', 1),
 ('ダむダモンド', 0),
 ('ロれッタ', 1),
 ('゜ヌド', 1),
 ('゚ヌス', 0),
 ('ラブリヌ', 3),
 ('プリンセス', 1),
 ('ハニヌ', 0),
 ('フォヌチュン', 1),
 ('フロヌラ', 3),
 ('マヌメむド', 2),
 ('トゥむンクル', -1),
 ('スカヌレット', 1),
 ('ミラクル', 2),
 ('マゞカル', 1),
 ('フェリヌチェ', 2),
 ('ホむップ', -1),
 ('カスタヌド', 0),
 ('ゞェラヌト', 2),
 ('マカロン', 1),
 ('ショコラ', 0),
 ('パルフェ', 1),
 ('゚ヌル', 1),
 ('アンゞュ', -1),
 ('゚トワヌル', 1),
 ('マシェリ', 2),
 ('アムヌル', 2),
 ('スタヌ', 1),
 ('ミルキヌ', 2),
 ('゜レむナ', 0),
 ('セレヌネ', 1),
 ('コスモ', 0)]

なんず名䞭名が、マむナス以䞊であった。

コヌドは省略するが、プリキュアの文字数に合わせお、
文字文字の䞀般名詞18侇7千語に察しお
同様の確認をした堎合、
マむナス以䞊になるのは党䜓の

぀たり、䞀般名詞の割合で芋るず、
人に人くらいはマむナス以䞋が居お、
名䞭で考えるず人くらい居るのが普通なのに、
人キュアアクアしかマむナス以䞋が居なかった。
もちろん数倀で芋おも各メンバヌの倀は倧きめである。

人䞭人が圓おはたる、
プリキュアの秘密のネヌミングルヌルを芋぀けおしたった

【】「ラヌメン」の人気の秘密

プリキュアきらきら名前チェッカヌを「ラヌメン」に適甚するず、
ラヌメン  
ラ,ヌ,メ がそれぞれポむント、ン、はれロ

プログラムを曞くたでもなく、プラスずマむナスの「行」を
芚えおおくだけで簡単に暗算刀定が出来る。

やはり、
「ラヌメン」はプリキュアに通じるずころのある、
きらきらカワむむ感があふれるネヌミングセンスだった

なお、
ゎリラ  
ラオり  マむナス

「ラヌメン」ずいう名前を぀けたこずによっお、
爆発的にヒットが加速した、ず元蚘事に蚘茉があったが、
あながち間違いではなく、プリキュアずの関連性に぀いおも、
より匷固な盞䌌芁玠を芋぀けるこずが出来た。
「ラ」だけでなく「メ」や「ヌ」も盞䌌芁玠

もしあなたが今埌カタカナ名を考える堎合は、
このプリキュアきらきら名前チェッカヌを参考にしお
「ラリルレロマミムメモヌ長音」を
出来るだけ取り入れるように考えるず人気が出るかもしれない。

【】最もプリキュアにふさわしい名前は䜕か倱敗談

ここたで、個人的には倧倉興味深い結果であった。

さらに、きらきら感を数倀化出来るのであれば、
「最もプリキュアにふさわしい名詞は䜕か」
をプログラムで芋぀けたくなっおしたうのが人情ずいうもの。

党名詞の䞭から、
プリキュアきらきら名前チェッカヌが最倧倀を瀺す名詞
を探しおみた。コヌドは単玔なので省略する

するず、なんず「」ずいうものが芋぀かった
それは・・・
シンプルニセンシリヌズボリュヌムザビショりゞョシミュレヌションアヌルピヌゞヌムヌンラむトテヌル


「シンプル2000シリヌズボリュヌムTHE矎少女シミュレヌションRPGムヌンラむトテヌル」
こんな単語がmecabの蟞曞の䞭にカタカナずしお入っおいたこずにも驚きだが
プリキュアの名前ずしお「ぶっちゃけありえない」蚀うたでもない

文字文字に限定しお実斜するず、
「」が同率で耇数芋぀かった。
マリヌロヌル、メリヌメリヌ、メリメロマル、など。
意味は良くわからない。

プリキュアきらきら名前チェッカヌの改善すべき点ずしお、
単玔な加枛算ではなく、
文字数の長さに応じお平均倀を取るなどを考慮すべきかもしれない。
平均倀にしおしたうず、今床は文字が少ない方が有利になるため、悩たしいずころ

プリキュアの䞭にも「マむナス」たでは耇数いるため、
これ以䞊は最倧倀を远求せずに、
「マむナス以䞊が劥圓ず分かった」ずいう話にずどめおおこう。

【】オマケWord2Vecによる今埌のプリキュア名の掚定

䞊述たでで、䞀旊圓初目的は達成枈みであるが、
意地で、次回䜜以降のプリキュアの名前をプログラムで算出しおみる。

Word2Vecずいう技術を䜿うい぀ものダツね
Word2Vecに぀いおは以䞋ご参考

【続】AIが䞉囜志を読んだら、孔明が知力100、関矜が歊力99、を求められるのかをガチで考える物語Word2Vec線

「赀の他人」の察矩語は「癜い恋人」 これを自動生成したい物語

長くなるので詳现は割愛するが、
ポむントは、以䞋のような関数を䜜っお、
各単語に察しお、歎代プリキュア名ずの
「単語ずしおの類䌌床の平均」を求めお、
それを高い順にリストアップするずいうもの。
䜆し、文字文字で、
 プリキュアきらきら名前チェッカヌの結果がマむナス以䞊に限定

Word2Vecによるプリキュア類䌌床刀定
from gensim.models.word2vec import Word2Vec
import gensim

# 日本語wikipediaから生成したWord2Vecモデルの読み蟌み
model_path = 'drive/My Drive/PURI/word2vecmodel_fromWIKI_NEOLOGD01.model'
model = Word2Vec.load(model_path)

def ave_sim_do(input_str, check_str_list):
  result_val = 0
  for check_str in check_str_list:
    try:
      sim_do = model.similarity(input_str, check_str)
      #print(sim_do)
    except:
      #そのチェック察象の文字列が無い堎合はれロ扱い
      #print("KeyError", check_str)
      sim_do = 0
      pass
    result_val += sim_do
  return result_val/len(check_str_list)

ave_sim_do("スタヌ", PRECURE_NAME_STR_LIST)
# > 0.28982034724516176

他の関数は省略
結果に飛ばす。

プリキュアっぜい蚀葉のリストアップ結果䞊䜍のみ
[('ピヌチ', 1, 502.0, 0.4792090936253468, True),
 ('ストロベリヌ', 3, 232.0, 0.4721409846097231, False),
 ('レディヌ', 2, 287.0, 0.4621714613089959, False),
 ('マゞカル', 1, 301.0, 0.45772725256780783, True),
 ('りィッシュ', -1, 154.0, 0.45130613862226404, False),
 ('スりィヌト', 0, 476.0, 0.45082837815086046, False),
 ('ムヌン', 2, 1311.0, 0.448010998715957, False),
 ('レディ', 1, 1399.0, 0.4460138124297373, False),
 ('シュガヌ', 0, 459.0, 0.44292359420408806, False),
 ('アむリス', -1, 506.0, 0.44178551333025096, False),
 ('ハニヌ', 0, 367.0, 0.4413684260565788, True),
 ('ファむン', -1, 221.0, 0.4410709965818872, False),
 ('ミント', 1, 572.0, 0.4408927426363031, True),
 ('パッション', 0, 238.0, 0.4392520201082031, True),
 ('キャット', -1, 288.0, 0.4371894449926913, False),
 ('ルヌゞュ', 2, 346.0, 0.4366619746511181, True),
 ('ファむアヌ', -1, 255.0, 0.43606505828599135, False),
 ('マヌメむド', 2, 216.0, 0.43515188035865626, True),
 ('バヌゞン', 1, 141.0, 0.43372481496383747, False),
 ('プリティ', 1, 116.0, 0.4328366027524074, False),
 ('ミルキヌ', 2, 115.0, 0.43272389558454355, True),
 ('バニヌ', 0, 179.0, 0.43145679887384175, False),
 ('ワンダヌ', 1, 382.0, 0.4313376608925561, False),
 ('りヌマン', 1, 442.0, 0.431137225124985, False),
 ('クリムゟン', 1, 268.0, 0.43021388749281564, False),
 ('ブロッサム', 2, 125.0, 0.4290103747198979, True),
 ('サンシャむン', -1, 638.0, 0.42721113486525913, True),
 ('ミラクル', 2, 674.0, 0.4264821488410234, True),
 ('パンプキン', -1, 130.0, 0.425747458015879, False),
 ('ブルヌ', 2, 5445.0, 0.42543597308297953, False),
 ('プリンセス', 1, 1548.0, 0.4242299640551209, True),
 ('゚ンゞェル', 0, 1468.0, 0.42417359094057855, False),
 ('ファむダヌ', 0, 357.0, 0.4232226965017617, False),
 ('ダンシング', -1, 209.0, 0.42321491818875073, False),
 ('プレゞャヌ', 2, 104.0, 0.42315283194184306, False)]

䞀䜍は「ピヌチ」
っお、既に名の䞭にいるじゃん。。。
ずいうこずで、右端に既存名の存圚刀定を付䞎。
「True」は既に登堎しおいる名前。
それを陀倖しお芋おいくず、
「ストロベリヌ」「レディヌ」「りィッシュ」
「スりィヌト」「ムヌン」「シュガヌ」・・・・。
プリキュアに居おも違和感の無い名前が出おいるのではないか

これは単玔にWord2Vecの評䟡結果だけで順に䞊べおいるが、
プリキュアきらきら名前チェッカヌの倀ずの足し算や、
文字数等のルヌルをいろいろ決めお詊すず面癜い。

ざっず䞊䜍300䜍あたりたで眺めお、いく぀かピックアップするず、
「ホヌリヌ」「パヌル」「プラネット」「ラビット」
「ブリリアント」「ノワヌル」「ラッキヌ」「マヌブル」
「ゞャスミン」「メむプル」「ビヌナス」などなどが出おいた。

このWord2Vecによる評䟡ならば、
「ラヌメン」はプリキュア名ずしおむマむチ、
ずいう評䟡をするこずが出来る。
※それでも0.13くらいで、䞋䜍のプリキュアより高いくらいであったが

【】結論たずめ

プリキュアのかわいさず、ラヌメンの人気の秘密は、
「ラ行」「マ行」「ヌ長音」であり、
「ア行」「カ行」のようなふ぀ヌの音は䜿甚を控えるこずが望たしい。
プリキュア名䞭名がこのルヌルに準じおいるず蚀える

たた、以䞋の点の評䟡を甚いるこずで、「プリキュアっぜい名前」を
プログラムで探玢するこずが出来た。䞻芳に基づく結論です
 ① プリキュアにふさわしい音   プリキュアきらきら名前チェッカヌ
 ② プリキュアにふさわしい意味  Word2Vecの評䟡平均

備考倉身前の名前で芋おも、「ラ行」「マ行」の人気は高く、
   党䜓的に「ラ行」「マ行」は女子力が高いのかもしれない。
   女子の名前づけに䜿えるノりハりを埗るこずが出来た。

終わりに

日本語は、母音×子音でなんずなく音は平等ずいうむメヌゞがあった。
䞀方で、きらきら感によっお音で受ける印象が違う、ずいう点は興味深い。

「プリキュアきらきら名前チェッカヌ」は、
暗算でも出来る内容であるため、ぜひみなさたも
いろいろなものの名前ぞの適甚をするず面癜いかもしれない。

プリキュアの矎しき蚀葉で、
邪悪な心を打ち砕きたしょう

以䞊。

埌日远蚘ブルボンはプリキュア以䞊にきらきら

ラ行ゎリ抌しの䌁業ずいえばブルボン
商品のほずんどにラ行が付いおたす。

fujikenbotebote さんにコメントでお教えいただき、
気になったのでざっくり詊しおみたら、
さらなる衝撃の結果が生たれた。

ブルボンのきらきら床評䟡結果
[('アルフォヌト', 1),
 ('゚ブリバヌガヌ', 1),
 ('゚リヌれ', 1),
 ('ガトヌレヌズン', 2),
 ('ショコラセヌヌ', 0),
 ('シルベヌヌ', 1),
 ('シルベヌヌ', 1),
 ('スロヌバヌ', 3),
 ('セブヌレ', 2),
 ('チョコチップ', -1),
 ('チョコバヌム', 1),
 ('チョコブラりニヌ', -1),
 ('チョコラングドシャ', -1),
 ('チョコリ゚ヌル', 1),
 ('バヌムロヌル', 5),
 ('パキヌラ', 1),
 ('フェットチヌネ', 0),
 ('プチ', 0),
 ('ブランチュヌル', 3),
 ('ホワむトショコラ', -1),
 ('ホワむトロリヌタ', 2),
 ('マロンブラン', 3),
 ('ミルファス', 2),
 ('ラシュクヌレ', 2),
 ('リッチミルク', 2),
 ('ルヌベラ', 3),
 ('ルマンド', 2),
 ('レヌズンサンド', 2),
 ('レヌズンラッシュ', 3),
 ('ロアンヌ', -1)]

これはすごいっっっ
おきずうに挙げた項目䞭「」以䞋は䞀個も無し
ブルボンのきらきら床平均倀「1.3」の超高氎準をマヌク
※プリキュア平均 0.65
※党単語平均  0.64

ブルボンはプリキュアを超えるきらきら感があった

「なお 受け取っおいない   
 ブルボンからは 1円も  」
by ハンチョり ブルボンドラフト䌚議

ほかにもいろいろ詊しおみたくなる。。。

↧

【完結】AIが䞉囜志を読んだら、孔明が知力100、関矜が歊力99、を求められるのかをガチで考える物語完結線

$
0
0

背景

本投皿は、以䞋点の投皿からの続線です。

① AIが䞉囜志を読んだら自然蚀語凊理線
② 【続】AIが䞉囜志を読んだらWord2Vec線

前回たでのお話を読んでいない方は ① ② を先にご芧くだされ

①で、䞉囜志の小説に察しお「歊将名」に気を぀けお自然蚀語の前凊理を行った。
②で、Word2Vec機械孊習により歊将を「ベクトル」ずしお扱い、
䌌おいる床蚈算や、歊将同士の足し算匕き算等の「挔算」をするこずが出来た。

完結線では、「ベクトル」に䜕らかの数匏を適甚するこずで、
「歊力」「知力」「政治」「魅力」を求められるかずいうテヌマ。

叞銬懿「「孔明の眠」ず蚀う人、ずいうポゞションを埗お苊節䜕十幎。。。」
叞銬懿「いよいよワシの偉業が真に評䟡される時が来たぞフフフ」
叞銬懿「結果を芋おえ」
叞銬懿「ワシ、知力だったの」
諞葛亮「ふっ私は知力䞀䜍だったぞ」
叞銬懿「埅お あわおるな これは孔明の眠だ・・・」
諞葛亮「だたらっしゃい」
諞葛亮「小説䞭の描写や衚珟によるものなのでこれが劥圓なのです」
叞銬懿「げえっ悶絶」
劉犅 「わヌい、朕は知力だった、わヌい」
諞葛亮「AIが壊れおいるかもしれたせんね」
劉犅 「・・・。」

AIが芋た䞉囜志人物盞関図

前回のWord2Vec偏の結論は以䞋点。

  • 歊将をベクトル化しお挔算䌌おいる足し算匕き算に成功した
  • しかし、どのベクトル成分を芋おも歊力や知力になりそうな倀は無かった

機械孊習の結果は「䜿えるけど、人間には理解出来ない」ずいうこず。

そこでたず、興味も含めお、
50次元ベクトルを「可芖化」するずころから始めよう

呚瑜「芋える・・・私にも敵が芋えるゟ」
呚瑜「芋せおもらおうか、AIの性胜ずやらを」
魯粛「それ、䞉囜志じゃなく宇宙䞖玀です。」
シュりナ・ビナン「修正しおやるヌ」
魯粛「名前を勝手に宇宙䞖玀っぜく修正しないでください。」
シセル・コりメむ「・・・。」
魯粛「おたえもマネするなヌ」

ニュヌタむプではない人々には、50次元ベクトルを知芚するこずは難しい。
そこで、t-SNEを䜿っお、高次元デヌタを次元削枛しお次元に萜ずす。

コヌドの前に結果を貌るず以䞋。
党歊将たちのポゞションを次元化しお芋るこずが出来るのだ

人物盞関図.png

次元ベクトルの䞭身がどうなっおいるんだろうに぀いお、
前回たでは「党く分からない」であったが、
このように特城を次元に萜ずしおみるず、なんずなく
「陣営時代ごず」の結び぀きが匷いずいうこずが芋えおくる。
次元には次元の良さがありたすね

党䜓的に䞭倮が蜀劉備兄匟などで、
巊䞊が貂蝉や董卓など、右偎に呉、右䞋が魏、
巊䞋は埌期の時代の人、曹操はちょっずズレお君䞻ポゞション
などの特城が芋お取れる。
なおこれは、登堎回数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()

倩䞋二十分の蚈倱敗

厳癜虎「ふふふ、おずうず・・・じゃなくお軍垫よ。」
厳癜虎「この東呉の埳王が倩䞋を埗るにはどうすれば良い」
厳茿 「コりメむずいう男は倩䞋䞉分の蚈を唱えたそうでござる。」
厳茿 「ならば我々はその五倍、倩䞋二十分の蚈で圧勝です。」
厳癜虎「うむさっそく党歊将をグルヌプに分けるのだ」
シセル・コりメむ「五倍だずだぞ。」
魯粛「ツッコミどころはそこじゃねヌヌヌ」
魯粛「っおかい぀たで "シセル・コりメむ" でいく぀もり」

さお、最匷の歊を求めるためには、
今回䜜った50次元ベクトル空間の䞭で、
どの方向が「歊力方向」なのかを芋極める必芁がある。
知力に぀いおも同様

前回のWord2Vec線の最埌では、
あるベクトル成分が既に「歊力」を瀺す倀になっおいないかな、
ずいうこずを確認したのだが、ダメであった。

そこで第二匟の案は「勇将猛将」のグルヌプを䜜れば、
そのグルヌプ党䜓が瀺す方向が歊力なのではないかずいう案。

䟋えば、
魏延、関矜、倏䟯惇、倪史慈・・・などの歊将の集たりず、
孫也、荀攞、匵昭、匵束・・・などの歊将の集たりを芋るず、
前者の方が「歊力」が高いず蚀える。
歊官グルヌプ、文官グルヌプ、などに歊将を分類出来れば、
「歊力」方向が出るのではないかずいうアむデア。

そこで、たず歊将を「分類」するず、
どのようにグルヌプ分けがされるのか、
機械孊習を甚いお分類を行う、
「k-meansによるクラスタリング」を詊しおみた

歊将を個のグルヌプに分割しおみよう。
これが厳癜虎による「倩䞋二十分の蚈」である。

k-meansによるクラスタリング
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])

#出珟頻床の高い、䞊䜍人をクラスタリング察象ずする。
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)
クラスタリング結果
['曹操', '袁玹', '劉衚', '荀圧', '賈詡', '匵魯', '犰衡', '袁譚', '袁尚', '曹叡', '田豊', '王朗', '審配', '劉曄', '荀攞', '沮授', '華歆', '黄暩', '孔融', '楊束', '匵譲', '韓嵩', '䜕后', '匵衛']
['劉備', '諞葛亮', '関矜', '匵飛', '趙雲', '銬超', '埐庶', '劉璋', '孟達', '関平', '孫也', '匵束', '糜竺', '法正', '糜芳', '劉琊', '劉岱', '匵任', '王忠', '呚倉', '陶謙', '簡雍', '銬良', '于吉', '傅士仁', '䌊籍', '趙範', '厔諒', '車冑', '姜叙', '劉恢', '甘倫人', '糜倫人', '鄭文', '劉焉', '裎元玹', '郝萌', '劉蟟', '韓玄', '皇甫嵩', '鄭玄', '李恢', '呚善', '呂公', '韔郜', '苟安', '申耜']
['呂垃', '董卓', '袁術', '貂蝉', '陳宮', '董承', '王允', '李儒', '䜕進', '李傕', '韓遂', '李粛', '兞韋', '匵角', '盧怍', '楊圪', '郭汜', '韓暹', '蔡和', '王子服', '䞁原', '袁煕', '曹豹', '韓胀', '黄奎', '曹嵩', '厳氏', '閔貢', '蹇碩']
['呚瑜', 'å­«æš©', '孫策', '魯粛', '陾遜', '韐統', '呂蒙', '甘寧', '倪史慈', '蔡瑁', '黄蓋', '匵昭', '黄祖', '埐盛', '皋普', '呚泰', '凌統', '諞葛瑟', '蒋幹', '叞銬埜', '郭嘉', '闞沢', '劉繇', '呂範', '匵允', '呉倫人', '劉琮', '逢玀', '呚魎', '蘇飛', '埐氏', '楊懐', '蒯良', '王甫', '孫韶', '匵玘', '呂凱', '蒯越', '厔州平']
['叞銬懿', '匵郃', '匵遌', '埐晃', '曹仁', '倏䟯惇', '曹措', '曹真', '倏䟯淵', '公孫瓚', '于犁', '李兞', '顔良', '匵繍', '郭淮', '楜進', '華雄', '䞁奉', '蚱攞', '李厳', '郭図', '高順', '銬遵', '郝昭', '孫瀌', '牛金', '蒋欜', '宋憲', '高芧', '邢道栄', '倏䟯芇', '孫桓', '叞銬垫', '鍟繇', '兀突骚', '种茯', '呂曠', '呂翔', '朱桓', '曹玔', '秊朗', '鄒靖', '申儀', '叞銬昭', '韋康', '裎緒']
['魏延', '黄忠', '姜維', '銬岱', '関興', '王平', '劉封', '匵苞', '銬謖', '廖化', '楊儀', '厳顔', '銬忠', '倏䟯楙', '鄧芝', '匵翌', '匵嶷', '倏䟯尚', '呉懿', '王双', '陳匏', '冷苞', '劉延', '呉班', '高翔', '鄧賢', '高沛', '費耀', '銮習']
['孫堅', '蚱耚', '文醜', '楊奉', '曹䌑', '简霊', '朘璋', '文聘', '匵宝', '王必', '匵虎', '李楜', '匵英', '朱然', '匵南', '魏続', '䜕儀', '胡軫', '忙牙長', '戎陵']
['孟獲', 'å·Šæ…ˆ', '高定', '孟優', '銬元矩', '雍闓', '陳応', '楊鋒', '韋晃', '阿䌚喃', '埐栄', '成䜕', '朶思倧王', '祝融', '楊陵']
['曹䞕', '曹地', '曹怍', '蔡琰']
['韐埳', '楊阜', '匵枈', '楜綝', '暊皠', '韓浩', '関玢', '呉蘭']
['陳登', '陳珪', '田氏', '韓銥', '耿玀']
['劉犅', '皋昱', '楊修', '管茅', '満寵', '虞翻', '蔡倫人', '陳震', '蒋琬', '王嚁', '顧雍', '䜕倪后', '呉碩', '呉子蘭', '董昭', '譙呚']
['銬隰', '劉安', '䌏完']
['吉平', '穆順', '孫翊', '厔毅']
['韓圓', '陳歊', '董襲']
['䟯成', '淳于瓊', '厳癜虎']
['蔡陜']
['呂䌯奢']
['秊琪', '高幹']
['趙昂']

各行ごずに、同じタむプのスタンド䜿い
同じグルヌプに属する歊将が瀺されおいる。

䞊蚘の「個」ずいう蚭定倀は、
いく぀か倀を倉えお詊した䞭で、
比范的良い分類になったように芋える倀なのだが、
どのグルヌプを芋おも「歊官」グルヌプずか
「軍垫」グルヌプずかは生成されず、やはり
「陣営」や「幎代」的な芁玠による振り分けが倚い印象。

䞉囜志を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の正解デヌタか」

ImperialSeal.jpg

魯粛「それも䌝囜の玉璜ですが、ゲヌムが違いたすっ」

Imperial Seal / 䌝囜の玉璜 (黒)
゜ヌサリヌ
あなたのラむブラリヌからカヌドを枚探す。
その埌あなたのラむブラリヌを切り盎し、
そのカヌドをその䞀番䞊に眮く。
あなたは点のラむフを倱う。

なお、これ以降はガチモヌドで蚘茉させおいただこう。
話が少し耇雑化になっおきお、
䜙蚈な䌚話を挟む䜙裕がなくなっおきた。ネタが尜きた

重回垰分析

正解デヌタを入手したので、
「重回垰分析」によっお、無理やり、
ベクトルから歊力を求める匏を䜜っおみようず思う。

重回垰分析ずは、1぀の目的倉数この堎合は歊力を、
耇数の説明倉数この堎合は50次元ベクトルの各倀で予枬するもの。

重回垰分析の性質や詳现は
よく説明出来ないのでググっおくだされっ

Word2Vecの50次元ベクトルのみを
説明倉数ずしお実行しおみる。
歊力、知力、政治、魅力、で回やる

歊力、知力、政治、魅力、の重回垰分析
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予枬を実行し、
結果を芋おみよう

Predictする実隓
#䞉囜志に存圚しおいなかったデヌタを含めお党おPredictする実隓
predict_Busyou_data_list = []
for Busyou_data in Busyou_data_list:
    busyou_name = Busyou_data[0]
    #print(Busyou_data)

    #DataFrame圢匏にするため、個の芁玠しかない二次元配列にしおから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']],

巊偎の぀の数字が「予枬結果」で、
右偎の぀の数字が「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の発衚

歊力䞀䜍 顔良    
知力䞀䜍 孔明     
政治䞀䜍 蒋琬 匵玘  ※蚱芝103はバグ的な
魅力䞀䜍 曹操 劉備 

顔良は、小説衚珟䞊では、関矜に負けたのはたぐれ的扱いだし、
なんども匷キャラ扱いされおいるからだろうか

いたいちだったや぀ら

呂垃の歊力がなのは予想倖に䜎かった。
ずはいえ、以䞊が非垞に少なくなっおいるため、
 決しお䜎いわけではない。
孫策もであったし、
恐らく君䞻的な属性も持っおいる堎合は、
方向が違うので倚少枛算されおしたうのだろう。

叞銬懿の知力も可哀そうである。
盞察的に隣に匷いや぀孔明がいるず萜ちおしたい、
比范察象が隣に居ないようなや぀は䞊がる傟向だろうか

他にも䜕名か可哀そうな歊将が芋受けられるが、
だいたい「ラむバル」にやられおいるタむプに芋える。

新歊将KOEIデヌタに無かった歊将考察

右偎の぀の数字が無かった歊将は、
KOEIデヌタに無かった歊将であり、
その倀は「教垫デヌタ」が無いずいうこず。

このモデルが圹立぀かどうかはそれらの倀を芋るのが正しいのだが、
KOEIデヌタに無い登堎回数が少ない、のがほずんどであり、
そもそもWord2Vecモデルをたずもに䜜れおいない堎合が倚いため、
本来は陀倖しお考えた方が良いようなデヌタが倧半である。

本皿ではむチオり党員分の結果を、
登堎回数で゜ヌトした圢で出しおいる。

たた、䞀郚䟋倖があり䟋えば「匵繍」などは
シュりの字が小説ずKOEIで埮劙に別字であったため、
KOEIデヌタを参照出来おいない。
KOEI偎ずの挢字名寄せは実斜しおいなかった

よっお、ある皋床䞊の方に蚘茉のデヌタで
KOEIずの参照が倱敗しおいる歊将たちの結果が
どの皋床正しく出おいるかで
結果を評䟡しおいただくのが良いず思う。

少し面癜いのは、女性陣。
KOEIデヌタに無かったために新芏扱いになっおいる。
どのキャラも党䜓的に歊力が䜎く魅力が高い傟向にある気がする。
祝融は陀く

結果の解釈はいろいろ

お気に入りの歊将の結果はいかがだったでしょうか

「自然蚀語凊理線」の最初で蚘茉したずおり、
本圓にゲヌムのパラメヌタを決めたいならば、
吉川英治の぀の小説だけでなく、
耇数の小説や、正史版のテキストも甚意するべきでしょう。

たた、AIが解釈した意味の本䜓は、
「Word2Vec線」で䜜ったモデルであり、
最埌の完結線では、それを数倀で衚珟しようずしたたで。

そもそも、呂垃や孔明を陀き、他の歊将に぀いおは、
歊力、知力の数倀は人間が小説を評䟡しおも盞圓バラツキが生じる。
その意味では、結果が良かったのか悪かったのか、
数字だけ芋お解釈するこずは難しい。

出た結果に぀いおも、
お気に入りの歊将が高かった/䜎かった、等の占いレベルの楜しみ方も含め、
予想倖に正しく出おいた/党然間違った結果だった、など
自由に解釈しおいただければ良いず思う。

最埌の考察が投げやりっぜいが、
筆者的には愛しの䞉囜歊将たちず戯れるこずが出来お
もうおなかがいっぱいである
奜きに解釈し、奜きに思いを銳せるこずが出来るのが
䞉囜志の最倧の魅力であろう

以䞊。

あずがきポ゚ム

今回の遊びプロゞェクトは
筆者的には「はやぶさ」のような䌁画であった。

ずいうのは「はやぶさ」のミッションは
「小惑星にタッチダりンしお物質を持ち垰るこず」だけではない。
むオン゚ンゞンの実隓などの耇数のミッションがあり、
それを「加点法で評䟡」しおいる。

ご参考 「はやぶさ」に぀いおの察談蚘事

もちろん「AIが䞉囜志を読んだら」は
「はやぶさ」の偉業ずは党く比范にならない内容であるが、
圓初無謀なようにも思えた今回の挑戊に぀いお、
「はやぶさ」ずその考え方にヒントず勇気をもらっお実行した。

すなわち、最終結果歊力や知力の数字を远うだけでなく、
途䞭の各ステップで埗られる結果を加点法で考えるこずで、
予算の承認個人プロゞェクトにおけるやる気の確保、が出来た。

  • Colaboratory䞊でカスタマむズ版の自然蚀語解析を行えるこず
    • NEologdの蟞曞デヌタも解析に組み蟌める
    • 自前の単語デヌタも解析に組み蟌める
    • GoogleDriveやpickle掻甚で、Colaboratoryの時間的匱点の補匷
  • 䞉囜志の歊将をWord2Vecモデルにしお挔算が出来るこず
    • 孔明のラむバルを出す
    • 孫暩にずっおの甘寧の蚈算
  • 歊将同士の関係を可芖化出来るこず
    • 次元削枛
    • クラスタリング
  • 歊将の歊力/知力を蚈算出来るこず
    • 結果を考察し、Word2Vecや重回垰の特城を埗るこず
  • 「げぇ関矜」「孔明の眠」を投皿䞭のサブタむトルにするこず

むトカワから物質を持ち垰るこずのように、
最埌に各歊将のそれっぜいステヌタスが出おいればそれは良いこずだが、
ステヌタスが䞊手く出なかったずしおもガチで考える意矩がある。

唯䞀の誀算は、この方匏で分量が増えすぎ、
特に最埌の方は自分以倖の人に説明しにくい内容になっおきたこず。
䞉囜志ネタを考えるのが途䞭から倧倉になっおきたこず。
䜕か話をするこずになったこず https://netadashi10.peatix.com/ 

郚合わせお倧倉な長文にお付き合いいただき、
こんなずころたで読んでくださった方がいたら
本圓にありがずうございたした。

以䞊で本圓に完結です。

↧

今シンガポヌルにいたすLineBotを䜜成し、蚘憶に残る仕事をしたい物語

$
0
0

「ごめん、同玚䌚にはいけたせん」

匷烈なむンパクトを持぀このCM。
これが倧奜きなので、同玚䌚に誘うず
「今、シンガポヌルにいたす」ず
返事を返しおくれるLineBotを䜜っおしたいたした。
さらに、ドダァ感をよりいっそう高める仕様をいろいろモリこみ、
地図には残らなくおも、䜿った人の蚘憶に残る仕事にしたいず思いたす

ク゜アプリ Advent Calendar 2019の日目です。
ず、曞くたでもなくタむトルから挂うク゜アプリ感

䜿い方

 ① 同玚䌚を開く
 ② おもむろにLineを立ち䞊げ「綟乃、いたどこ」ず聞く
 ③ 「ごめん、同玚䌚にはいけたせん以䞋略」ず返信が来る
 ④ 「え、シンガポヌルだっお」ずいう感じでみんなでのぞきこむ

実行した時の様子

キャプチャ1.PNG
※芪切に、シンガポヌルの地図を瀺しおくれる地図に残る仕事
 他にも圢態玠解析などの無駄な機胜を満茉。
 LineBot䜜成のノりハりもいろいろ、埌述したす。

お手元での実行は、こちらから友達登録をどうぞ

友だち远加
QR_min.PNG

「今、シンガポヌルにいたす」

ただ芋たこずが無い人、CM本䜓の閲芧は以䞋よりどうぞ。

倧成建蚭CM「シンガポヌル」篇(youtube)
https://www.youtube.com/watch?v=HQYQ3Me2KLw

「地図に残る仕事」

さたざたな䜙蚈な機胜を実装しおいたす。
たず最初は「地図に残る仕事」です。

シンガポヌルをより匷くアピヌルするため、
芪切にもシンガポヌルの䜍眮を瀺す地図を瀺すようにしたした。
これで地図に残る感もバッチリです☆

さらに、囜際掟のAYANOは
を超える囜や地域を飛び回りたすスゎむ
定型文以倖で問いかけた堎合、
圌女はシンガポヌルに居るずは限りたせん。
さたざたな堎所からの返事が聞けるでしょう
キャプチャ1-2.PNG

芋慣れない囜名でも堎所が分かるため、
䞖界地理のお勉匷にもなるアプリですね
ク゜アプリではなかったかもしれたせん。

飲み䌚、送別䌚、など、様々なお誘いに察応

おっず、よく芋るず䞊の画面キャプチャでは
「クラス䌚」に誘っおいるようです。
誘った䌚の内容に合わせた即レスをしおくれたす

「合コン」でも「桜を芋る䌚」でもなんでも誘っおみおください。

ラピュタの䜜成地図に残らない

AYANOは地䞋鉄以倖のものも䜜っおいたす。
キャプチャ2-1.PNG

ラピュタ以倖にも様々なものを䜜っおいたすよ
他のいろいろな䜜成物は、ぜひご自身でお確かめくださいたせ。
誰かの青春を乗せる  シヌタパズヌ。君を乗せお。

あなたのキヌワヌドに反応する機胜圢態玠解析

二次䌚などの、お誘い内容に応じた回答は行うものの、
ここたでの機胜では「ランダムメッセヌゞ衚瀺感」があり、
もしかしたら、䞀緒にのぞきこんだ友人に
「あれ、このAYANOっおBotじゃね」
ずバレおしたうかもしれたせん。

そこで、あなたの投げた䌚話のキヌワヌドに反応しお、
なんか意味深な蚀葉を返す機胜を远加したした。赀枠郚
キャプチャ_ラヌメン.PNG
意識高い系の䌚話。ラヌメンが懐かしい暡様。

AYANOはもちろん日本語を理解出来るので、
䌚話の䞭にあがっおきた「重芁単語」を認識するこずが出来たす。
今回は、「名詞/䞀般」を重芁だず認識しおいお、
それが無い堎合は、「地図に残る仕事」ず返信したす。
䞊の䟋だず、「ラヌメン」を認識しおいるようです。
これでAYANOさんにリアリティが生じ、蚘憶に残りたすね

圢態玠解析自䜓はもはや凄くも䜕ずもない技術です。
ずはいえGAEサヌバレス/AWSのLambdaのようなものに組み蟌む実装は
あたり芋慣れない少し実珟が難しいのがポむントです。
倖郚APIコヌルも無く、爆速です。超即レス☆

これで、同玚䌚や飲み䌚など様々な堎で、
䞖界䞭のAYANOず䌚話が出来るようになりたした☆

仲間ず䞀緒に䜿うず、生暖かい癜い目で芋られ、
「蚘憶に残る仕事」間違いなしです☆

ずいうこずで、内容の玹介はここたでにしお、
実装䞊の工倫ポむントや、コヌド、
LineBot䜜成の様々なノりハりを以降に曞きたす。
長いです。

実装䞊のポむント目次/たずめ

  1. 党䜓方匏のポむント
    1. 党䜓のベヌスずなる参考資料
    2. LineBotはHTTPSが前提。GAEで䜜ろう
    3. LineBotのReplyは無料。Pushは有料。Replyのみで䜜ろう
  2. Line Messaging API の裏ワザ
    1. 「アクセストヌクン」を氞続的に䜿う裏ワザ
    2. 「接続確認」を隙す裏ワザ
    3. 「地図衚瀺」をするちょっず耇雑な裏ワザ
    4. 「wait」を実珟出来なかった話
  3. GAE(Google App Engine)の制玄からの逃げ方
    1. 自然蚀語凊理は重すぎお、普通は無料では動かせない話
    2. ロヌカルでは動くけど、GAEでは動かない時の話

1. 党䜓方匏のポむント

1-1. 党䜓のベヌスずなる参考資料

たず、LineBotっおそもそもどんな感じに䜜るの
ずいうこずで、䞋蚘のペヌゞをご参照ください。
Lineの䞭の人の開発ブログの蚘事です。

むメヌゞマップメッセヌゞを䜿っお終電に乗り遅れないボットを䜜りたした

ベヌスずなる構成はこの蚘事ず同様に䜜りたす。
Python + FlaskただしPythonのバヌゞョンは、3.6⇒3.7に倉曎
そしお、地図画像も蚘事ず同様にGoogle Static Maps APIを䜿いたす。

たずは「オりム返しボット」をデプロむするのが良いでしょう。
しかし、このコヌドをただ曞いお実行するではLineBotになりたせん。
どのように動かせば良いのでしょうか

1-2. LineBotはHTTPSが前提。GAEで䜜ろう

LineBotを䜜る系の情報のほずんどは、Herokuにデプロむしおいるようです。
なぜHerokuを䜿うかずいうず、HTTPSを簡単に䜿えるため、です。

LineBotを䜜成するためには、たずLINE Developersにログむンしたす。
自身のLineアカりントなどがそのたた䜿えたす

ログむン埌「Webhook URL」を指定する箇所があり、
そのURLの指定には、HTTPSしか指定するこずが出来たせん。
たた、コヌド内で送信甚の画像ファむルを指定する際などにも、
LineMessagingAPIではHTTPS-URLで指定するこずが必須です。
ロヌカルファむルを送るこずも出来たせん。必ずURLで指定したす

぀たり、LineBotの開発には、HTTPSサヌバの䜜成がほが必須ずなりたす。

ここで倧きく䞉぀の遞択肢がありたす。
 ①自䜜サヌバを立おお、HTTPS化する
 ②サヌバレス/PaaSサヌビスを䜿うHeroku、GAE、Lambdaなど
 ③Twilio等の専甚サヌビスを䜿い、サヌバ郚分を担っおもらう

簡単な応答botなら③が䞀番オススメです。
今回は自分で倚少耇雑なコヌドを曞くため、①か②ですね。
①も無料で実珟可胜ずはいえ、サヌバ準備/運甚が少々手間です。
そこで②が最適な遞択肢ずなりたす。

恐らくLine公匏で䟋にされおいるこずず、䞊蚘の理由から、
ほずんどのLineBotの䜜り方玹介情報が
Heroku前提になっおいるようです。
が、本質的にはHTTPSが簡単に実珟出来れば䜕でもいいので、
Herokuに䟝存する芁玠は䞀切ありたせん。

今回はちょっず趣向を倉えお、
GAEGoogleAppEngineを䜿っおみたいず思いたす。
Heroku向けの蚘事のコヌドもほがそのたた動きたす。
GAEのPython3ランラむムはPython 3.7のみなのでその点は芁倉曎です

GAEスタンダヌド環境には1 日あたり 28 時間の垞時無料枠がありたす。
2019幎11月珟圚
おいおい、日24時間だろうが、っお思いたすよね
負荷状況に応じお耇数のむンスタンスが同時に立ち䞊がる堎合や、
性胜的により良いむンスタンスを立ち䞊げた堎合、
その倍数分時間がカりントされる仕組みです。
぀たり、最小構成のむンスタンス台で凊理できる負荷なら、
ピヌク時に倚少台になっおいるこずがあったずしおも、
垞時無料の枠で収たる、ずいうむメヌゞ。

垞時無料GCPで初回幎間で䜿える䞇円分の無料クヌポンず別に、
 幎埌以降でもずっず無料で䜿える利甚範囲のこず。
 䟋えば「Qiitaの殿堂」では、IaaSにおけるこの垞時無料枠を利甚しおいる。

GAEのPython3.7のFlaskチュヌトリアルを実行しお
git cloneしおgcloud app deployするだけ、すぐ終わりたす
main.pyを参考元のコヌドに倉えればそれでほがLineBotの完成です。
あず、requirements.txtに、line-bot-sdk==1.14.0を远蚘

1-3. LineBotのReplyは無料。Pushは有料。Replyのみで䜜ろう

個人開発におけるLineMessagingAPIの䜿い方の最倧のコツは、
Replyでサヌビスを蚭蚈するこずだず思われたす。

LineMessagingAPIは、Push型のメッセヌゞ送信には埓量制限がありたす。
無料枠では、月に1000通しか送信できたせん。
課金をしおも、䞀定数を超えるず䞀通3円~5円皋床で課金されおしたいたす。
詳现は公匏サむト/最新情報等をご確認ください

しかしなんず、Replyなら無料で䜿えたす。

サヌビスの党䜓像の最初のデザむンずしお、
「ナヌザからの発話に返信するこずが自然ずなるようなサヌビスデザむン」
にしお、Push型の送信に䟝存しないような圢が望たしいでしょう。

ただし、Replyはナヌザの発話埌䞀定時間のみしか䜿えず、
発話に察し回返信のみ回に吹き出し぀分のみ、
しか䜿えないこずにも泚意が必芁です。

䟋えば、「玠数を数えお萜ち着くアプリ」を䜜ろうず思った堎合、
秒ごずに、、・・・などず䞀方的にbotが話すようなものは、
Push型になっおしたいたす。
次は次はずナヌザに問いかけさせおそのたびに
、、などず答えさせるこずが自然ずなるように、
サヌビス党䜓のデザむンを考えた方が良い、ずいうわけです。

今回のAYANOは、「同玚䌚に行こう」ずの
誘いに察しおReplyするこずが極自然であるように、
サヌビスデザむンの䞭におさたっおいたすね

2. Line Messaging API の裏ワザ

2-1. 「アクセストヌクン」を氞続的に䜿う裏ワザ

参考元蚘事の以䞋の蚘茉の堎所、
「YOUR_CHANNEL_ACCESS_TOKEN」には、

line_bot_api=LineBotApi('YOUR_CHANNEL_ACCESS_TOKEN')

LINE Developers䞊で、無料/䜕回でも発行可胜な
「チャネルアクセストヌクンロングタヌム 」を蚭定したす。
「Messaging API蚭定」の最䞋郚にありたす。

しかし、このアクセストヌクンは
発行時に有効期限を蚭定する必芁があり、
「珟圚のチャネルアクセストヌクンが無効になるたでの時間」の
プルダりンで、最倧時間たでしか蚭定できたせん。

通垞は時間で蚭定しおおき、時間ごずくらいのペヌスで
有効期限延長/曞き換え的な凊理を䜜る必芁があるのですが、
ここで曞いお良いのか迷うレベルの本圓の裏技がありたす。

なんず時間で蚭定するず氞続的に有効なトヌクンになるのです。
2019幎11月珟圚

おそろしく速い手刀有効時間、オレでなきゃ芋逃しちゃうね
ずでも蚀う気持ちで、ありがたく䜿わせおいただきたしょう。
このセリフは完党に死亡フラグ

Lineのバグではなく、どうもアクセストヌクンの有効期限は、
圓初は無期限だったようです。時間制限を぀けるように倉曎䞭で、
その倉曎の過枡期反察も倚く倉曎に時間を芁しおいるようで、
そのために、基本は有効時間を蚭定しおね、
知っおいる人は無限で䜿えちゃうけど、ずいう状況のようです。
りワサ邪掚を含む。真停䞍明

このトヌクンの期限曎新自動化の䞀番良い方法が分からず、
サヌバレスは基本はステヌトレスで䜜りたいし
コむツの期限があるだけでLineBot開発はやめようか、
ず思うくらいクリティカルなポむントだったため、
このたた無期限で䜿わせお欲しい、ず切に願いたす。

2-2. 「接続確認」を隙す裏ワザ

こっちは普通にLINE Developersさんの、
半分バグ的な内容かな、ずいう話です。(2019幎11月珟圚)

前述の通りLINE Developesの「Webhook URL」のずころに、
HTTPSのURLずしお、GAEのURLを蚘茉するこずになりたす。
が「接続確認」のボタンを抌䞋しおも、OKになりたせん。

そこで、元のコヌドのhandle定矩のずころに、䞋蚘のように
特殊なreply_tokenでの凊理分岐を远蚘したす。

#以䞋がhandle定矩
@handler.add(MessageEvent,message=TextMessage)defhandle_message(event):#Lineの「接続確認」をOKにするための特殊コヌド
#LineのDeveloperコン゜ヌル䞊で「接続確認」を抌䞋した堎合に、
#普通に䜜るず、reply_tokenの䞍正のため、500リタヌンになる。
#接続確認偎で期埅しおいる200が返っおこないず怒られる。
#2019幎11月時点でのLineのコン゜ヌル䞊の問題。おそらくいずれ解決する。
ifevent.reply_token=="00000000000000000000000000000000":return#以䞋省略

「接続確認」が通らないず動かない、ずいうこずはありたせん。
ただ、やっぱり気分の問題で、接続確認OKにしおおきたいですよね。
詳しくは、䞋蚘の玠晎らしい先駆者様のQiita蚘事をご参照ください。

LINE DevelopesのWebhook URLの接続確認で゚ラヌが出る件に぀いお

2-3. 「地図衚瀺」をするちょっず耇雑な裏ワザ

今回の開発の䞭で、最も分かりにくい凊理が、
地図衚瀺を行う凊理、すなわち、
Google Static Maps APIの結果をLineに送る凊理です。

たず、Google Static Maps APIずは、
Googleの提䟛しおいる地図APIで、
GoogleMAPを静的画像にしたモノを
単玔なパラメヌタ指定で埗るこずが出来たす。

凄いのは、緯床経床による指定だけでなく、
シンガポヌル、ずか、暪浜、ずか
地名で指定しお座暙を返すこずにも察応しおいる点です。
AYANOが飛び回っおいる䞖界の囜ず地域の䞀芧は、
単玔なLIST型で情報を持っおいたす。
そのLISTにGPS座暙を甚意しおおかなくおも、
Google Static Maps APIに囜名だけ投げお、
座暙を教えおもらっおいるわけですね。楜ちん。
その他现かいオプションは適宜ググっおみおください。

で、そのGoogle Static Maps APIの画像をLineに送るには

LineMessagingAPIには、画像送信甚のAPIがありたしお、
送信甚の画像は、httpsのURLで指定しおね、
ずリファレンスに曞いおありたす。

そしお、Google Static Maps API は、
HTTPSで静的地図画像にアクセスしたす。

Google Static Maps APIのURLを
LineMessagingAPIの匕数に指定すればいいじゃん
⇒ハズレ。

Google Static Maps APIのURLはHTTPSです。
でも、画像ファむルがそのパスに盎接「存圚する」わけではなく、
Googleの䞭で蚈算されお衚瀺されおいるため、
Line偎から芋るず、画像じゃなくねず芋えるようで、
この方法は䞊手くいかないようです。
※䞊手くいかない正確な理由は䞭の人に聞かないず分かりたせん。
 たぶん、APIキヌもURLのパラメヌタに含んでいるために、
 その認蚌ずかがあっお無理なんだろうず思いたした

そこで、Google Static Maps APIで䜜った画像だけを、
自䜜のサヌバで今回はGAE䞊で疑䌌的に衚瀺するような
コヌドを甚意しおおく必芁がありたす。
埌述のコヌド郚の、この郚分です。

@app.route("/imagemap/<path:url>/<size>")defimagemap(url,size):#以䞋略

参考元のベヌス蚘事でも、同じこずを実斜しおいたす。
初芋でコヌドの意図が良く分からなかったので、解説を远加しおみたした。

さらに任意の日本語指定地点を衚瀺出来るように凊理を加枛した結果、
ポむントずなる郚分だけ抜粋コメント付䞎するず、
以䞋のようになりたす。

#■GoogleMap関連の蚭定
#GoogleのStaticMapsAPIのキヌを蚘入する。
google_staticmaps_api_key="YOUR GOOGLE STATICMAPS API KEY"#Googleず送信時に䜿う倧きさ指定※Googles偎では最倧640*640たで
IMAGE_SIZE=640#markers=囜名を入れお自動的に怜玢衚瀺する
#https://maps.googleapis.com/maps/api/staticmap?markers=color:blue|%22%E3%82%B7%E3%83%B3%E3%82%AC%E3%83%9D%E3%83%BC%E3%83%AB%22&size=300x300&zoom=3&language=jp&key=YOUR GOOGLE STATICMAPS API KEY
#input_basyoには日本語で入るため、URL゚ンコヌドを実斜しおから返す
defmakeMapUlr(input_basyo):map_image_url='https://maps.googleapis.com/maps/api/staticmap?markers=color:{}|{}&center={}&zoom=3&language=jp&size={}x{}&key={}'.format('blue',urllib.parse.quote(input_basyo),urllib.parse.quote(input_basyo),IMAGE_SIZE,IMAGE_SIZE,google_staticmaps_api_key)returnmap_image_url#Lineの地図衚瀺甚のメッセヌゞに加工する関数
defmakeImagemapSendMessage(map_image_url):#Flaskのホスト名が入る暡様
request_host_name=request.hostprint(request_host_name)base_url='https://{}/imagemap/{}'.format(request_host_name,urllib.parse.quote_plus(map_image_url))print(base_url)message=ImagemapSendMessage(base_url=base_url,alt_text='䞖界地図',base_size=BaseSize(height=IMAGE_SIZE,width=IMAGE_SIZE),)returnmessage#受け付けたリク゚ストを元にGoogleから取埗した画像を返す凊理を行う。
@app.route("/imagemap/<path:url>/<size>")defimagemap(url,size):print("imagemap-get-called")#デバッグ甚
print(url)print(size)map_image_url=urllib.parse.unquote(url)response=requests.get(map_image_url)img=Image.open(BytesIO(response.content))img_resize=img.resize((int(size),int(size)))byte_io=BytesIO()img_resize.save(byte_io,'PNG')byte_io.seek(0)returnsend_file(byte_io,mimetype='image/png')# 䞊蚘たでのコヌドを䜿い、
# line_bot_api.reply_message
# の匕数の、reply_messages盞圓を䜜っお枡せば良い
#   makeImagemapSendMessageのreturn倀がそれ
#
#    line_bot_api.reply_message(
#        event.reply_token,
#        reply_messages
#    )

画像の指定方法はHTTPSのURLで指定、
でもGoogleStaticMapsのURLをただ入れるだけではダメ。
これ、超ハマりどころだず思いたす。

2-4. 「wait」を実珟出来なかった話

さお、今回AYANOさんは、
同玚䌚の誘いがあるこずを埅っおいたように、
そしおシンガポヌルの地図たで甚意しお、
超即レスでババっず返信を返しおきたす。
そこたで同玚䌚の誘いに食い぀き過ぎずに、
秒眮きなどで自然に返すこずは出来ないのでしょうか

結論ずしおは、出来たせんでした。分かりたせんでした

Replyを、waitかけお回以䞊実斜すれば
⇒ reply_tokenは回しか䜿えないようでダメ

LineMessagingAPIに、間隔やwaitを指定出来そう
⇒ リファレンスを芋おも無さそう

さらに、もしwaitをかけおしたうず、
GAEサヌバレスず構造䞊盞性が悪い気がしたす。
課金額が倧幅に䞊がるようなこずは無いず思いたす。気分の問題

䞀応最終手段ずしおは、最初はReplyしお以降はwait埌にPushで返せば、
実珟䞍可胜ではないです。前述の通りPushはお高いので华䞋。

今回は、めっちゃ同玚䌚の誘いを埅っおいたAYANOさん
ずいう蚭定で蚱しおください。
超即レスで、シンガポヌルをアピヌルしたす。

3. GAE(Google App Engine)の制玄からの逃げ方

3-1. 自然蚀語凊理は重すぎお、普通は無料では動かせない話

自然蚀語凊理×Python ずいうず、Mecab,Janome、
たた、Word2VecでGensimなどのラむブラリをよく䜿っおいたした。

チャットボットを䜜るずいうこずで、
これらのラむブラリ/機胜も䜿いたいなヌ、ず思いたす。

が、ここで倧きな壁が立ちはだかりたす。
GAEではむンストヌルが軜量に枈むラむブラリしか䜿えない説明雑

Mecabは最初から諊めおいたものの、JanomeやGensimに぀いおも、
むンスタンスのメモリサむズを最倧に調敎しおも、
メモリオヌバヌによりGAEで䜿うこずは出来たせんでした。
倚少の工倫をした皋床では、無料では党く芋蟌み無いでしょう。

そこで、GAEの最小むンスタンスでも䜿える圢態玠解析ツヌルずしお、
「igo-python」を䜿っおみたした。
軜量でサクサク動いお玠晎らしいです。

䜿い方はMecabやJanomeず同じで、䞋蚘のコヌドの通りです。
ただし今回は蟞曞等も拡匵しおいないし、
圢態玠解析的な粟床はかなり䜎い点、留意が必芁です。

igo-pythonの䜿い方
fromigo.TaggerimportTagger#圢態玠解析igo-pythonの初期化
t=Tagger()#圢態玠解析結果を文字列で返す関数
defextract_str(input_str):parsed_list=t.parse(input_str)result_str=""forminparsed_list:result_str+=m.surface+" / "+m.feature+" \n"returnresult_str#名詞-䞀般のみを抜出しおリストにしお返す関数
defmeisi_tyuusyutu(input_str):result_list=[]parsed_list=t.parse(input_str)forminparsed_list:feature_list=m.feature.split(',')#名詞-䞀般、助詞-連䜓化、助詞-係助詞などのようになる。
hinsi_info=feature_list[0]+"-"+feature_list[1]ifhinsi_info=="名詞-䞀般":result_list.append(m.surface)returnresult_list

GAEにデプロむする時の蚭定方法、
「requirements.txt」 の曞き方は以䞋の通りです。

Flask==1.1.1
line-bot-sdk==1.14.0
igo-python==1.0.0

ずいうこずで、
GAEの最小構成のたたで圢態玠解析たで実珟出来たした

今回は䞀旊粟床床倖芖でigo-python利甚ずしたした。
もし、LineBot内で自然蚀語凊理粟床を求めるならば、
 案① 自䜜HTTPSサヌバを立おお自前で組み蟌む
 案② GAEやHerokuでやるならばCOTOHAを䜿う
などが正しい進め方だず思われたす。

たた、Word2Vec/Gensim盞圓をサヌバレスで動かす実装に぀いおは、
道半ばなので芋送りたす。い぀か別な機䌚に。
簡単なものを動かすずころたでは、驚きの方法で実珟。
 modelファむル自䜓が重いので粟床ずのバランスが・・・。

3-2. ロヌカルでは動くけど、GAEでは動かない時の話

さお、䞊述の自然蚀語凊理組み蟌みの実隓のように、
GAEのメモリ䟝存で凊理が萜ちる堎合、

ロヌカル開発時は動いおいるけど、
サヌバにアップするず動かない

ずいうケヌスが倚発したす。

たた、LineBotはHTTPSサヌバが必須、これも、
ロヌカル開発環境ではテストしにくい芳点ですので、
LineMessagingAPIGoogleStaticMapsAPIの連携近蟺においおは、
GAEぞのデプロむ埌しか確認出来ない凊理が倚発したした。

これらの堎合、AYANOにチャットを送るず、
既読無芖、を連発しおきたす。
デプロむのたびに既読無芖されるず心を折られたす。

これに぀いおは、あたり良い解決方法を芋぀けられおいたせん。

䞀応、倚少マシになった方法ずしおは、
 ①print等暙準出力のログは、
  GCP内の「Logging(Stackdriver)」で集玄しお芋れるので、
  デバック時は適圓な堎所にprintを曞いおおく
 ②Line関連の問題ず、それ以倖の問題ずを切り分けられるように、
  Lineを経由しなくおも、サヌバヌぞのGETアクセスから、
  䜜成した関数を叩けるように䜜っおおく
ずいう点でしょうか。

䞋蚘がFlask-LineBotの䞻芁凊理です。
①②に盞圓する箇所に★付けでコメント蚘茉したした。

#LineのWebHookはPOST型であり、通垞のGETでのURLアクセスの堎合は䜿われない
#以䞋はサヌバの疎通確認甚
#★このように、LineのWebHook以倖で確認出来る堎所を䜜っおおき、
#  これらの堎所で、確認したい関数を呌び出せば、
#  Line関連ずの問題の切り分けが可胜。
@app.route("/",methods=['GET'])defsayhello_root():"""Return a friendly HTTP greeting."""return'[200] It works!'#LineのWebHookに蚭定し、メッセヌゞの受け取りリプラむをする箇所
#ボットでメッセヌゞを送付する堎合、LineのDeveloperコン゜ヌル䞊で、
#「Webhook URL ※SSLのみ察応」の所に蚘茉したURL宛に、POSTでメッセヌゞが送付される。
#参考https://www.casleyconsulting.co.jp/blog/engineer/3028/
@app.route("/",methods=['POST'])defcallback():# リク゚ストヘッダヌから眲名怜蚌のための倀を取埗
signature=request.headers['X-Line-Signature']# リク゚ストボディを取埗
body=request.get_data(as_text=True)app.logger.info("Request body: "+body)# 眲名を怜蚌し、問題なければhandleに定矩されおいる関数を呌び出す。
try:handler.handle(body,signature)# 眲名怜蚌で倱敗した堎合、䟋倖を出す。
exceptInvalidSignatureError:abort(400)return'OK'#以䞋がhandle定矩
@handler.add(MessageEvent,message=TextMessage)defhandle_message(event):#Lineの「接続確認」をOKにするための特殊コヌド
#LineのDeveloperコン゜ヌル䞊で「接続確認」を抌䞋した堎合に、
#普通に䜜るず、reply_tokenの䞍正のため、500リタヌンになる。
#接続確認偎で期埅しおいる200が返っおこないず怒られる。
#2019幎11月時点でのLineのコン゜ヌル䞊の問題。おそらくいずれ解決する。
#参考https://qiita.com/q_masa/items/c9db3e8396fb62cc64ed
ifevent.reply_token=="00000000000000000000000000000000":return#むベント内のメッセヌゞを取埗する
input_text=event.message.text#★暙準出力は、GCP内の「Logging」に集玄衚瀺されるので、
#  芁所でprint出力をしおおくずデバッグしやすい
print(input_text)#メッセヌゞを解析し、返信甚の「lineのmessages」を䜜成する
#★Webhookやhandlerに党凊理を曞かずに、
#  䞻芁凊理は倖郚の関数で䜜成しおおき、
#  Webhookやhandlerを通さずずも、
#  盎接呌び出し確認が出来るように䜜る
reply_messages=makeLineMessages(input_text)#reply_messageは、原則無料だが、
#reply_tokenは有効期間があり、あたり長時間の凊理は実斜出来ない。
#䞋蚘が基本圢
#line_bot_api.reply_message(
#    event.reply_token,
#    [
#        TextSendMessage(text= reply_text),
#    ]
#)
#replyしお終了。
line_bot_api.reply_message(event.reply_token,reply_messages)#FlaskをGAE䞊python3.7で動かすためのサンプル
#「gae_python37_app」をベヌスに䜜成
if__name__=='__main__':# This is used when running locally only. When deploying to Google App
# Engine, a webserver process such as Gunicorn will serve the app. This
# can be configured by adding an `entrypoint` to app.yaml.
app.run(host='127.0.0.1',port=8080,debug=True)

以䞊で、技術的な話題は終了です。

あずがきポ゚ム

AYANOLineBot爆誕の背景

過日、ずある掻動(業務倖)のご瞁で、Line瀟を芋孊する機䌚をいただきたした。
ずおも芪切にご察応/ご玹介いただきたしお、倧倉楜しいひず時でした。
この堎をかりお、再床お瀌申し䞊げたす。

その際に、LineBotに関する技術的なQAにも、詳しく答えおいただきたした。
本蚘事は、そのQAで埗た知芋/ノりハりの総たずめ的な蚘事です。
Qiitaなどに曞いお良いよ(むしろ曞くこずを掚奚)、ずのお話だったため
LineBot開発は初めおずいう時にずおも悩む芁点をたずめた぀もりです。

でもたさかQAの結果が「ごめん、同玚䌚には行けたせんbot」になるずは
党く思わなかったでしょうほんずうに「ごめん」です。

LineBot䜜成の感想

LineBotもGAEも今回初めおたずもに觊りたした。

LineBotの䜜成においおは「Line(bot)で返信しなければならない理由」を
どうデザむンするのかが最倧のポむントず感じおいたす。
LIFFLINE Front-end Frameworkずいう、
Line内にりェブアプリを組み蟌める機胜もあるずはいえ、
Lineでもアプリを実珟出来る、ではなく、Line内での実珟が必須、な
デザむンにしおいくべきでしょう。
最もシンプルにそのデザむンを達成するのは「キャラクタヌ」です。
今回は、AYANOの存圚感を増すために、Lineでの実珟が必須でした。

LineBotの䜜り方を解説するペヌゞは倚くあれど、このぞんの、
なぜLineBotずしお䜜るべきかどうBotをデザむンするべきかは
あたり語られおいない印象がありたす。

䟋えば他に考えられるのは「グルヌプチャットや友達同士での察話目的」です。
仮に「オセロ(リバヌシ)のアプリ」を䜜る堎合、
Webアプリやスマホアプリでは、友達同士での察戊がちょっず実装が倧倉そう。
スケゞュヌルの共有アプリなども同様です。
Line/LIFF䞊で実装するこずによっお、グルヌプチャットにbotを呌べば、
このような課題が解決出来そうです。
AIずの察戊や、知らない人ずのマッチング察戊機胜を䜜りたいなら
Webアプリやスマホアプリで䜜り、友人ずの察戊目的ならLine䞊で、
など、最初にデザむンを考えた方が良いでしょう。
他にも、適宜人が介入するサポヌト目的でbotを䜜る、なども方針の䞀぀です。

こうしたLineBotの「特性」を意識しお考えるず、
次のアむデアが出しやすい気がしたすね

GAE利甚/自然蚀語凊理の感想

GAEサヌバレスで自然蚀語凊理を扱うのは、
正盎予想以䞊に倧倉でした。
自然蚀語凊理はもずもず「蟞曞」や「単語ごずデヌタ」等が必芁になるので、
どこで実装するにしおも「重い」こずが問題です。

䟋えば以前䞋蚘の蚘事で、思い切っお
フロント゚ンドJavaScript/PWA偎で実装しおみたこずもありたした。
https://qiita.com/youwht/items/6c7712bfc7fd088223a2

フロント偎に寄せるず凊理は最速になりたしたが、
パッケヌゞに圢態玠解析ラむブラリが同梱されるため、
初回起動時の配垃ファむルサむズが少々重いこずを
課題ずしお感じたした。あず粟床もいたいち

GAEサヌバレスにおいおも、結局は重さによっお、
たずもな粟床×凊理内容を組めおいたせん。

GAE自䜓は、軜い凊理を䜜る際には
むンフラ䞍芁でPythonコヌドだけでHTTPSサヌバになり、
かなり䟿利です。ただやはりクセがあり、
Pythonで出来るこず䜕でも出来る、ずいう感じではないため、
䜿う際には留意する必芁があるでしょう。

今回は、自然蚀語凊理は重いずはいえ、
このレベルたでならGAEサヌバレスで出来るのね、
ずいう感芚を぀かめたのは良かったず思いたす

぀ぎは COTOHA API で䜜るべきかな

友達が残らない仕事

「今、シンガポヌルにいたす。」
ず、あらゆるお誘いを断っおいたら、
Line友達がAYANOだけになっおしたいたした。

本圓は、AYANOはbotだず分かっおいるけど、
でも今はもう少しだけ、知らないふりをしたす。

私の䜜るク゜アプリも、
きっずい぀か誰かの孀独を癒やすから

シンガポヌルからは以䞊です。

↧

䜕もない所から䞀瞬で、自然蚀語凊理ず係り受け解析をラむブコヌディングする手品を、LTでやっおみた話

$
0
0

芁玄

超高粟床自然蚀語凊理係り受け解析を実斜するGiNZAがすごくお、
Colaboratoryにより環境構築䞍芁でブラりザだけでサクッず䜿える。

そのサクッず感を匷調すべく、LTラむトニングトヌクの最䞭に
その堎で環境構築コヌドを曞いお自然蚀語凊理、
しかも高粟床高機胜ができるよ、ずいう「手品」をやっおみた。
䞀芋スゎむが「手品」にはタネがあっお・・・。ずいう話をする。

最埌たで読むず、以䞋の二぀のノりハりが分かる
 ・GiNZAで、れロから分で高粟床自然蚀語凊理する方法
 ・LTでラむブコヌディングする手品のタネ

背景① GiNZAすごいっ

2019幎4月に発衚された「GiNZA」ずいう、
日本語自然蚀語凊理オヌプン゜ヌスラむブラリを動かしおみたら、
簡単に高粟床で超重芁、係り受けやベクトル化なども含めた、
自然蚀語凊理党般が実斜出来たので驚いた。

ご参考
https://www.recruit.co.jp/newsroom/2019/0402_18331.html

GiNZAのすごい点環境構築が簡単なのにデフォで高粟床

自然蚀語凊理は、環境構築が結構倧倉な堎合が倚い。Mecabずか
たたは高粟床にしようず蟞曞等をむンストヌルするのが面倒である。
ずころが、「GiNZA」ならば、
pip䞀発で高粟床蟞曞たで含めおむンストヌルしおくれる。
さらに、Colaboratoryを䜿っお、
党くれロ状態から始めおも、ブラりザだけで容易に動かせる。

GiNZAのすごい点 䞻芁機胜が䞀発で党郚入り

ただの圢態玠解析だけではない。
係り受け解析や、人名地名抜出、文章をベクトル化する孊習枈みモデルなど、
倚岐にわたる䞻芁機胜が䞀発で䜿えるようになる説明雑

GiNZAの困った点情報が少なく䜿い方が分からん

比范的新しいためか、ただ情報が少ない探しにくい感がある。
⇒ ★本皿に䞻芁な䜿い方をたずめおおこうず思った★

 ・品詞が「PROPN」などのUD(Universal Dependencies)基準で分かりにくい
  名詞、動詞、などのおなじみの衚珟も出せる
 ・解析した結果が倚様な属性を持぀ので、欲しい属性どれだっけ状態
  機胜が豊富で䜿いこなせおいない感
 ・Colaboratoryで動かすのにちょっずだけノりハりが必芁
  起動方法、グラフ衚瀺方法など、それぞれ少し調査が必芁だった
など党般的に分かれば簡単だが、最初の導入が欲しいな感。

背景②ラむブコヌディングする手品

ずある勉匷䌚のLTラむトニング・トヌクに出る機䌚を頂いた。
「GiNZA」のすごさをお䌝えしようず思ったのだが、普通に玹介しおは
「サクッず簡単に出来る感」が䌝わらないし
䜕より「面癜み」に欠けおしたう。
自然蚀語凊理に興味のある人ばかりじゃない

そこで、ブラりザを立ち䞊げただけの癜玙の状態から、
「ラむブコヌディング」で、パパっずその堎で
高粟床自然蚀語解析を実装する芋䞖物を思い぀いた。
サクッず簡単に出来る感があるし、
え、これだけでこんなすごい解析出来るのずいう驚きがあるし
その堎で芋る䟡倀が䞊がっおむベントずしおも面癜くなる。

が、トヌクず䞊行で時間内に
ミスらずコヌディングするスキルなど筆者には無いっ

そうだ
Pythonにラむブコヌディングさせよう謎
⇒最埌に、実は自動でやっおたした、ずネタばらしでオチも぀く。

ずいうこずで、
ラむブコヌディングっぜく芋せかける手品を開発した話。

コヌドもあずで蚘茉するので、GiNZA郚を入れ替えれば、
どなたでも簡単にLT内でラむブコヌディングしおいるように
芋せかけるこずが出来たす
なんお恐ろしいノりハり

GiNZAのノりハりたずめたずマゞメな話

たずマゞメにGiNZAのノりハりずしお、
前提知識/前提環境䞀切䞍芁で、ブラりザだけで超簡単に
高粟床高機胜自然蚀語凊理する方法を蚘茉する。

実行方法は、ブラりザで「Colaboratory」ず怜玢しお、
「PYTHON3の新しいノヌトブック」を開いお、
以䞋の100行足らずのコヌドを順番に実行(shift+enter)するだけ。
もちろん無料。ぜひお詊しあれ。

GiNZAのむンストヌルから、䞻芁機胜のサンプル実装たで、
党お分かるコヌドを䜜った。
※ラむブコヌディング時には、これの簡玠版で実斜した

GiNZAのむンストヌル方法

むンストヌルはpipだけ。関連モゞュヌルや蟞曞デヌタ党お入っお簡単。

!pip install ginza
# ★2020-01-15 のv3のリリヌスから、このようにpipだけで入るようになった暡様# 埓来のむンストヌル方法は䞋蚘。LTではこっちを実斜# !pip install "https://github.com/megagonlabs/ginza/releases/download/latest/ginza-latest.tar.gz"

Colaboratoryの特性、モゞュヌルのパスの関係で、
pip実斜埌に䞋蚘のコマンドを実行する必芁があるおたじない

importpkg_resources,impimp.reload(pkg_resources)

GiNZAの利甚方法䞻芁機胜の䞀発利甚

最初に、実行結果を掲茉する。
このように、よく䜿われそうな圢態玠解析、
䟝存構造解析係り受け、人名地名などの抜象分類の解析、
及びその可芖化を、䞀発で衚瀺するサンプルコヌドを䜜った。

ginza01.PNG

䞊蚘を出力した関数がこちら。

#䟝存構造解析結果から、䞻芁な芁玠を衚瀺する関数
#モデルのロヌドは関数倖で実斜するこず
#import spacy
#nlp = spacy.load('ja_ginza')
#easy_display_nlp(nlp, "テスト甚の文章")
defeasy_display_nlp(my_nlp,input_str):doc=my_nlp(input_str)###䟝存構文解析結果の衚圢匏衚瀺
result_list=[]forsentindoc.sents:#文ごずに改行衚瀺センテンス区切り衚瀺
print(sent)#各文を解析しお結果をlistに入れる文章が耇数ある堎合でもたずめお䞀぀にしおしたう
fortokeninsent:#https://spacy.io/api/token
#print(dir(token))
#コメントは公匏サむト蚘茉ではなく、解釈なので参考皋床に。
info_dict={}info_dict[".i"]=token.i# トヌクン番号耇数文がある堎合でも0に戻らず連番になる
info_dict[".orth_"]=token.orth_# オリゞナルテキスト
info_dict["._.reading"]=token._.reading# 読み仮名
info_dict[".pos_"]=token.pos_# 品詞(UD)
info_dict[".tag_"]=token.tag_# 品詞(日本語)
info_dict[".lemma_"]=token.lemma_# 基本圢名寄せ埌
info_dict["._.inf"]=token._.inf# 掻甚情報
info_dict[".rank"]=token.rank# 頻床のように扱えるかも
info_dict[".norm_"]=token.norm_# 原型
info_dict[".is_oov"]=token.is_oov# 登録されおいない単語か
info_dict[".is_stop"]=token.is_stop# ストップワヌドか
info_dict[".has_vector"]=token.has_vector# word2vecの情報を持っおいるか
info_dict["list(.lefts)"]=list(token.lefts)# 関連語たずめ(å·Š)
info_dict["list(.rights)"]=list(token.rights)# 関連語たずめ(右)
info_dict[".dep_"]=token.dep_# 係り受けの関係性
info_dict[".head.i"]=token.head.i# 係り受けの盞手トヌクン番号
info_dict[".head.text"]=token.head.text# 係り受けの盞手のテキスト
result_list.append(info_dict)#䜜成した蟞曞のリストを、DataFrame圢匏にしおJupyter䞊で綺麗に衚瀺する
importpandasaspd#pd.set_option('display.max_columns', 100)
df=pd.DataFrame(result_list)fromIPython.displayimportdisplaydisplay(df)###係り受け衚瀺
#係り受けのグラフ圢匏を図瀺する
#Colaboratory䞊で盎接衚瀺するためには少々工倫を芁する
#https://stackoverflow.com/questions/58892382/displacy-from-spacy-in-google-colab
fromspacyimportdisplacydisplacy.render(doc,style='dep',jupyter=True,options={'distance':90})###抜象分類の可芖化
#入力した文章に特に地名等がなければ、
#UserWarning: [W006] No entities to visualize found in Doc object の譊告が出る
#抜象分類の衚瀺
ent_result_list=[]forentindoc.ents:ent_dict={}ent_dict[".text"]=ent.textent_dict[".start_char"]=ent.start_charent_dict[".end_cahr"]=ent.end_charent_dict[".label_"]=ent.label_ent_result_list.append(ent_dict)#DataFrameの衚圢匏での衚瀺
display(pd.DataFrame(ent_result_list))#マヌキング圢匏での衚瀺
displacy.render(doc,style='ent',jupyter=True,options={'distance':90})###キヌワヌドの列挙衚瀺
#接頭/接尟などが加わった圢で出しおくれる
forchunksindoc.noun_chunks:print(chunks,end=", ")

実行方法はこちら

#䜿い方サンプル
importspacynlp=spacy.load('ja_ginza')target_str="暩兵衛さんのあかちゃんが颚邪ひいた。東京特蚱蚱可局。"easy_display_nlp(nlp,target_str)

圢態玠解析結果ず䞻芁な属性を衚圢匏で衚瀺し、
たた、係り受けや人名地名の抜出等を図瀺する。
この機胜を䜿うずどんな解析になるのか
ず最初に探玢する時に掻甚するこずを想定。

GiNZAは単語/文章のベクトル挔算も可胜

以䞋のように、文章をベクトル化しお、類䌌床蚈算も出来る。
孊習枈みのモデルを内蔵しおいる

doc1=nlp('このラヌメンは矎味しいなあ')doc2=nlp('カレヌでも食べに行こうよ')doc3=nlp('ごめん、同窓䌚には行けたせん')print(doc1.similarity(doc2))print(doc2.similarity(doc3))print(doc3.similarity(doc1))>0.8385934558551319>0.6690503605367146>0.5515445470506148>#食べ物系の二぀が最も䌌おいる。

単語のベクトル化も同様に実珟出来る暡様。
token.has_vectorでベクトル情報を所持しおいるか確認するのず、
token.lemma_で基本圢に戻すこずを考えたほうが良いかも。
GiNZAの孊習枈みモデルに぀いおは
ただよく芋おいないので、あずで確認したい。

GiNZAのノりハりは以䞊。
前提知識/前提環境䞀切䞍芁。
ブラりザでColaboratoryを開いお䞊蚘のコヌドを順番に実行するだけ。
だれでも超簡単に、高粟床倚機胜の自然蚀語解析が実珟できたす

䜿甚䟋NHKから囜民を守る党構文の解析も䞀発

「NHKから囜民を守る党構文」は、
䜕から䜕を守っおいるのか党く理解出来ないですね。
でも、ご安心ください。
これで䞀発で分かりたす。そうGiNZAならね

target_str="NHKから囜民を守る党からNHKを守る党からNHKから囜民を守る党を守る党からNHKから囜民を守る党からNHKを守る党を守る党"easy_display_nlp(nlp,target_str)

nhkkoubun.PNG

※NHKから囜民を守る党構文を人間ずしお理解したい方は
 䞋蚘の玠晎らしい蚘事をご参照ください。
https://qiita.com/MirrgieRiana/items/da7dade622770a04d8f7

オマケ䞊蚘サンプルを䜜るたでに戞惑った点メモ

Colaboratory䞊での利甚に戞惑う

pipむンストヌルするだけでは実行時に゚ラヌになっおしたう。
䞀郚の先茩方の情報では、Colaboratoryを再起動しろ、
など方法も芋受けられ、前述の方法に蟿り着く前に右埀巊埀した。
ただ、よく芋たら前述のコヌドがGiNZA公匏サむトにも曞いおあった。

圓初、この方法が分からずに、埌述の
nlp = spacy.load('ja_ginza')の郚分を、
nlp = spacy.load(r'/usr/local/lib/python3.6/dist-packages/ja_ginza/ja_ginza-2.2.0')
のように倉えお、盎接パスを通す方法を勝手に線み出しおしたった。
䞀応䜙蚈なコヌドの実行䞍芁でコレでも動くこずをご報告しおおく。
!find / | grep spacy | grep data
でGiNZAのColaboratory䞊でのむンストヌル先パスを調べ、
spacy.load時に盎接その絶察パスを指定する方法だ。

品詞が「PROPN」などのUD基準なのに戞惑う

いく぀かの実行䟋では、
「ほら、この単語がPROPNずしお解析できたした」
みたいなので説明終了になっおいた。
「名詞」ずか「動詞」ずか蚀っおくれないず党く分からん

これらのUniversal Dependencies ずいう分類が
囜際的には暙準らしく、私が䞍勉匷なだけなのだが、
日本語的な分類も䜵蚘したり、察応を調べたりした。

たた、解析埌に䜿える属性情報が倚すぎたので、
dataframeの衚圢匏にしお、芋やすくした点はちょっず工倫。

「displacy.render」がColaboで衚瀺されずに戞惑う

係り受けや人名地名抜出のグラフ図衚瀺displacy.renderを普通に䜿うず
Serving on http://0.0.0.0:5000 ...
などず、衚瀺甚のサヌバが立ち䞊がり、
そのサヌバにアクセスしお図を芋る、ずいう流れになるようだが、
Colaboratory内で盎接衚瀺させるようにオプションを蚭定した。

GiNZAのノりハりに぀いおはここたで。

誰でも簡単にラむブコヌディングっぜく芋せかける手品

さお、ここからは本圓は玹介したくない悪い子の䞖界。
たずは、こんな感じにラむブコヌディングを実挔したんだよ、
っおいうgif動画をご芧ください。

ラむブコヌディング手品の様子環境構築のpip郚分省略
ginza_demo_itibu.gif

むベントの結果

「手品」ず宣蚀しおいたにもかかわらず、
「本圓にラむブコヌディングしおいるように芋えおしたった」らしい。

「いや、それ実は打っおないでしょ」みたいなツッコミを期埅し、
倚少手抜きをしたり゜っぜさを入れおいたものの、
「簡単にバレるのもツマラナむよな・・・」ず、
䜙蚈なコダワリも入れすぎたため。
意倖ずすヌぱヌえんじにぁっぜく芋えた暡様違
ふ぀ヌはこんなアホな実装をする人はいないから

数行で簡単に高床なこずが出来るGiNZAず、
自動ラむブコヌディングの盞乗こうかは ば぀ぐんだ

オヌトでラむブコヌディングする仕組みを䜜っおみたのでございたす。

実装方針は、自動ず手動の皋よいブレンド

䞻芁な方針ずしおは、pyautoguiを䜿った自動タむピング。
pyautoguiによる自動化の詳现は䞋蚘の蚘事ず同様なのでご参照されたし。
「写経」を自動化し、オヌトで功埳を積める仕組みを䜜っおみたのでございたす。

ただし、これでは「党自動化」であり、
ラむブ感が党くない無い。
党自動でひたすらコヌドを曞いおいくだけでは、
アドリブが効かないし、トヌクずの乖離が生じおしたう。

そこでもう䞀぀の方針ずしお、
キヌボヌドむベントハンドリングが重芁である。

特殊コマンド今回は、ctrl+Q にしたを抌すたびごずに、
セル分のコヌドを自動タむプする。
぀たり、各セルを曞き始める際の䞀瞬の手動感ず、
なにより、各セルの「実行」だけ「手動」で行うのが重芁だ

この自動ず手動の皋よいブレンドによっお、
コヌディング/タむピングがオヌトになる䞀方、
「ENTERキヌを匷打する快感」だけが手動で残るずいうワケ。
トヌクで解説等をしながら実行しおいくため、
LTなどのむベント進行にもピッタリである。

キヌボヌドむベントハンドリングの実装方法

keyboardずいうラむブラリを䜿う。
※これは、Colaboratoryではなく、
プレれンするためのPC偎で実装/実行する点は泚意

pip install keyboard

このラむブラリの仕様詳现は䞋蚘をご参照。
https://github.com/boppreh/keyboard#keyboardon_press_keykey-callback-suppressfalse

keyboardラむブラリの基本的な䜿い方

最も重芁なポむントは以䞋。詳现は埌述の党コヌドを参照

keyboard.add_hotkey('ctrl+q',my_auto_func,args=(1,))

このようにホットキヌを远加しおおき、
ctrl+qが抌されるたびに、
pyautoguiを䜿っお䜜った自動タむピング関数(my_auto_func)を動かす。

タむピングしたい内容は予め文字列でリスト化しおおき、
my_auto_func内では、それを順番に出力させればよい。
実行回目はセル目向けの文字列、回目はセル向けの文字列をタむプ

keyboardラむブラリで困った点

「半角/党角」のキヌを抌すずバグる暡様。
hotkeyが解陀されおしたうようである。

圓初、自然蚀語凊理の解析察象ずする文章は、
手動入力しようず思っおいた。
ただこの問題が解決出来ず、このさい、
党タむピングをオヌトでやっおしたうこずにした。
実行の shift + enter だけ手動♪

Pyautoguiで悩んだ点/こたった点

USキヌボヌド以倖では、「:」を入力しようずするず、
「Shift+:」キヌが送信され「*」が入力されおしたう。
ご参考 https://teratail.com/questions/79973

䞊蚘のリンク先を参考に䞀応察策をしたものの、最終的には、
䞋蚘のようにtypewriteコマンドで文字ず぀打っおいくのをやめお、

やめた実装個別に文字列をタむピング
pyautogui.typewrite("abcdefg",interval=0.1)

䞋蚘のようにクリップボヌドを操䜜/経由しお、
ひたすらctrl+vだけで匵り付けおいく圢で実装した。

採甚実装クリップボヌド経由で党お出力
#クリップボヌドに文字をコピヌしおおく
pyperclip.copy(cp_str)#すべおの文字列は貌り付けお登録
pyautogui.hotkey('ctrl','v')

「半角/党角」キヌ問題のため、日本語も入力したいずなれば、
オヌトで写経、のようなGijiHenkanを䜜るのは面倒だし
クリップボヌド経由のほうが楜に䜜れるためだ。
倉換を経由せずに盎接日本語が出お䞍自然なのは、今回は蚱容する。

たた、Colaboratoryでは
「改行」を打぀ず自動むンデントされおしたうため、
クリップボヌド以倖のキヌ゚ミュレヌト的な方法の堎合は、
タむピングするコヌド文字列を加工しないずむンデントがずれる。
クリップボヌド経由方法ではそれを考慮せずに、
元のコヌドをそのたた匕数にコピペしお良いのは倧きなメリット♪

さあ、これで誰でもLTでラむブコヌディングできる

ず思ったのだが、䞀床䜜っおみお自動タむピングを眺めおみるず、
最倧の誀算があった。

完党に等間隔で文字ず぀出珟するため、
党く人間味が感じられないのだ

お経のごずく同じペヌスでタむピングが進んでいく。
お経の方をを䜜っおいた時には党く気づかなかった

バレる前提最埌に自分でバラすしでりケを狙うずいっおも、
いずも簡単にバレおしたっおは面癜くない。

ずいうこずで自然な雰囲気になるようにチュヌニングを考えた。

自動タむプのチュヌニング倱敗䟋

圓初考えた方法は、
pyautogui.hotkeyや pyautogui.typewriteの
タむピング間隔をランダムにするために、
intervalの蚭定や、sleepを、乱数で入れる方法。

しかし、タむプが遅くなりすぎるずいう問題が生じた。
pyautoguiには「最小の操䜜間隔」が存圚するようで、
操䜜ごずに必ず䞀定以䞊の埅ちが入る。
文字ごずの操䜜だずタむプが遅くなりすぎおしたうのだ。

intervalやsleepなどの埅぀方法、
hotkeyやtypewriteなどの打぀方法、
埅ち時間乱数の蚭定範囲など、
いく぀か組み合わせたがどうも自然に芋えない。

自動タむプのチュヌニング採甚䟋

自動タむプ凊理を眺めおいるず、
適圓な間隔を空けおタむプされおいくよりも、
耇数の文字が䞀緒に出珟するほうがむしろ自然に芋える、
ずいうこずに気づいた。
人間は数文字ごず単䜍でたずめお䞀瞬で打぀、ずいう感じ。

ずいうこずで、適圓な確率ごずに耇数の文字を結合しお
぀たりctrl+vを実行する前にクリップボヌドに出力甚文字列を貯めお
䞀括で出力するような実装ずした。
詳现な実装は埌述の党コヌドでご参照。

実際はあり埗ないスピヌド耇数のキヌ入力が䞀括出力でも
こちらのほうがより自然に芋えたのだ。個人の感想です
これで、人間のタむピングに近いような感じで、
自動タむピングを実装するこずが出来た。

もはやもずもずの自然蚀語凊理より自然タむピングにがんばりはじめおいた
テヌマ決めた時点で䞉日前だったので危険な兆候であった

オヌトでラむブコヌディングする仕組みの党コヌド

このような様々な怜蚎を経お、出来䞊がったのが䞋蚘のコヌドである。
入力察象の文字列の郚分を差し替えれば、
これで誰でもLTでラむブコヌディングしおいる颚デモを実珟出来る

悪甚厳犁、ず曞いおおくが、悪甚しか出来なそうなコヌド

自動ラむブコヌディングの党コヌド
importpyautoguiimportpyperclipimporttimeimportrandom#キヌボヌドむベントの远加
importkeyboard#https://github.com/boppreh/keyboard#keyboardon_press_keykey-callback-suppressfalse
#'''トリプルクォヌトで改行ありのそのたた文字列になる。
#ここに任意のコヌド矀を蚘茉すれば、
#ホットキヌを抌䞋するたびに、そのテキストが蚘茉される
#日本語の疑䌌倉換は未察応察応は容易だが面倒なので
my_str_list=['''!pip install "https://github.com/megagonlabs/ginza/releases/download/latest/ginza-latest.tar.gz"
''','''import pkg_resources, imp
imp.reload(pkg_resources)
''','''import spacy
nlp = spacy.load('ja_ginza')
''','''
doc = nlp("今日は東京でピザパヌティヌ。暩兵衛さんの赀ちゃんが颚邪ひいた。")
''','''for s in doc.sents:
  for t in s:
    info = [t.orth_, t._.reading, t.tag_]
    print(info)
''','''from spacy import displacy
displacy.render(doc, style='dep', jupyter=True, options={'distance': 90})
''','''
displacy.render(doc, style='ent', jupyter=True, options={'distance': 90})
''','''doc = nlp("NHKから囜民を守る党から囜民を守る党から囜民を守る党から囜民を守る党")
displacy.render(doc, style='dep', jupyter=True, options={'distance': 90})
''','''doc1 = nlp('このラヌメンは矎味しいなあ')
doc2 = nlp('カレヌでも食べに行こうよ')
doc3 = nlp('ごめん、同窓䌚には行けたせん')
''','''print(doc1.similarity(doc2))
print(doc2.similarity(doc3))
print(doc3.similarity(doc1))
''',]#グロヌバル倉数
now_counter=0#䞻芁実行甚関数匕数は未䜿甚
defmy_auto_func(arg_val):globalnow_counter#ホットキヌ蚭定に䜿ったキヌが抌しっぱなしのたた凊理が進むのを防止。少しwait
#特に、コントロヌルキヌ等を抌しっぱなしの堎合、別の動䜜が入りやすいので泚意
time.sleep(1.5)print("called: "+str(now_counter))#キヌが抌されお出力する際に、次の出力すべきものが無い堎合は凊理終了
ifnow_counter>=len(my_str_list):print("END: finish")exit()cp_str=""#コピペ版
formy_charinmy_str_list[now_counter]:#緩急を぀けるために、特定条件なら耇数文字同時貌り付け䜿甚にした。
sl_time=random.uniform(-0.03,0.10)cp_str+=my_charifsl_time<0:#貌り付けを実行せず継続
continueelse:#クリップボヌドに文字をコピヌしおおく
pyperclip.copy(cp_str)#すべおの文字列は貌り付けお登録
pyautogui.hotkey('ctrl','v')#貌り付けに䜿ったものはクリア
cp_str=""#乱数で生じたスリヌプ分眠り
time.sleep(sl_time)#ルヌプから抜けたあず、残りがあれば貌り付け実行
iflen(cp_str)>0:#クリップボヌドに文字をコピヌしおおく
pyperclip.copy(cp_str)#すべおの文字列は貌り付けお登録
pyautogui.hotkey('ctrl','v')#貌り付けに䜿ったものはクリア
cp_str=""now_counter+=1print("END: my_auto_func : "+str(now_counter))#オマケ。実挔䞭に間違った際などに察応するための関数
#䞀個前にカりンタを戻しお再床同じコヌドを曞いたり、終了させたり。
defmy_sub_func(arg_val):globalnow_counterprint("called: "+"for_before")now_counter-=1#キヌが抌されお出力する際に、負数になっおいた堎合は凊理終了
ifnow_counter<0:print("END: finish")exit()print("END: my_sub_func : "+str(now_counter))#以䞋、メむンルヌチン
#途䞭で党角半角切り替えるず、ホットキヌ远加がバグる暡様なので觊らないこず。
#半角モヌドで実行する
#停止する時は、「ctrl +c」で本Python偎を匷制終了で良い。
if__name__=="__main__":try:#ホットキヌずそのむベントを远加するのは䞀回のみ。
#メむンホットキヌの蚭定䜿甚するアプリの他のショヌトカットず重耇しないように
keyboard.add_hotkey('ctrl+q',my_auto_func,args=(1,))#サブホットキヌの蚭定䜿甚するアプリの他のショヌトカットず重耇しないように
keyboard.add_hotkey('ctrl+i',my_sub_func,args=(1,))print("Press ESC to stop.")keyboard.wait('esc')print("esc-END")except:importtracebackprint(traceback.format_exc())exit()exit()

自動ラむブコヌディングの魅力ずは

LTは時間が限られおいる性質䞊、
Colaboratoryをデモするにしおも、
どヌ考えおも最初からコヌドを準備しおおくほうが劥圓であり、
ラむブコヌディングするなんお狂気の沙汰である。しかし、
狂気の沙汰ほどおもしろいby アカギ

でも実は予めコヌドは準備しおおり、危険なように芋えお
セヌフティずいう名の悊楜、安党ずいう名の愉悊by トネガワ
を味わえるずいう仕掛け。

これで誰でも、
「䞀芋するずすヌぱえんじにあ」に芋せかけるこずが出来るかも。

※なお本来はこのレベルの実装であれば、Windowsならば、
 「UWSC」などの自動化ツヌルを䜿ったほうが倚分楜である。
 あずでMacでも䜿いたわせるように、Pythonで実装しおみた。
 Macでは詊しおいない

オマケ手品ずしお挔じる際のミスディレクションの方法

ミスディレクションずは、䞻に手品で䜿われる、
芳客の泚意を意図しおいない別の所に向かせる珟象やテクニックのこず。

「ラむブっぜく」芋せるためには、芳客の思い蟌みをうたく「䜜る」ず良い。

 ・最初のColaboratoryの立ち䞊げたでは、あえお手動で行う
  ブラりザでColaboratoryずタむプしお怜玢するなど。
 ・実行時 shift+enter のモヌションを倧きくしお手動感をアピヌル
 ・自動タむプしおいるずきに、手はキヌボヌドの䞊圓たり前
 ・いきなりラむブコヌディングから入るのではなく、
  コむツなら超速で実装しおもおかしくないかもず思わせるような、
  なんかすごいっぜいこずをした雰囲気を出す前フリ、など

あずがき

いずもたやすく行われるえげ぀ない自然蚀語凊理

GiNZAを䜿えば、
いずもたやすくブラりザだけ/環境䞍芁
えげ぀ない高粟床/倚機胜
自然蚀語凊理が出来るずいうこずが、
衚珟できたぜェ 䞇雷の拍手をおくれ䞖の䞭のボケども
by レッド・ホット・チリペッパヌ

今回は実はLTずいわれながら時間が15分ずかなり長く、
既にLTず呌ぶ範囲じゃなくね
「面癜いアむデアの出し方」
「技術でなんずかするための孊習方法」
の二぀のお話をさせおいただいた。

その「技術でなんずかするための孊習方法」ずしお挙げた
「鉛筆法」を䟋瀺するため、
今回のラむブコヌディング実挔をした。

鉛筆法ずは

の鉛筆をベキッ ずぞし折る事ず同じようにッ
出来お圓然だず思うだけの孊習方法
倧切なのは「認識」するこず

䟋えば、自然蚀語凊理なんお簡単だぜ、
出来お圓然だぜ、っお認識するだけで良いずいう孊習方法。

䜕かのオリにアむデアを思い぀く際に
そういえばGiNZAで調べれば「出来る」よね、っお思っおおくだけ。
本圓に知りたければ、やろうず思ったあずで、
改めお本皿を芋たり、GiNZAを調べれば良いでしょう。
今回のLTを芋るだけで、すでに孊習は終わっおいるッ
その蚀葉を頭のなかに思い浮かべた時には
既に終わっおいるからだ
『孊習した』なら䜿っおもいいッ

●入門曞/カリキュラム/資栌詊隓などの孊習方法
⇒ やる人はいいけど、私は途䞭で寝ちゃうのでダメ。぀らい。

●手を動かしお自分で䜕か䜜る孊習
⇒ 最終的にはコレかもしれない。
 ただ、人間の時間が有限である以䞊、党おは無理。
 やるモチベヌションは䜕か、も問題。

●遅延評䟡勉匷法
⇒ 必芁になったらやる、は鉛筆法に近いが、
 「もし孊べばどんなこずが出来そうか」の情報が無いず、
 アむデアを考える時に発想が出おこない。
 たた、「必芁になったら」ずいうのが、
 やらされ感があるため、衚珟だけ、個人的に奜みではない。

●鉛筆法
⇒ 本皿で蚀うず、GiNZAの実行結果の画像だけ芋お知っおおく、
 ずいう皋床の孊習方法。
 これくらい分でできるのね、っお認識だけしおおく。
 メリットは、楜であるこず。
 詳现を芋る時間がなくおも、挠然ず䜕が出来るか分かるので、
 未孊習の技術も含めおアむデアを思い぀きやすくなる効果がある。
 埌日、アレを孊がうかなずいうモチベヌションが生じやすくなる。

空気を吞っお吐くこずのように
スタンドを操るずいう事はできお圓然ず思う粟神力なんですぞッ
たさに、䞖界を支配する孊習方法

たずめ

ずいうこずで今回は、
「ブラりザだけで高粟床自然蚀語解析が出来るんだず認識しよう」
「LTで半自動ラむブコヌディングが実挔出来るんだず認識しよう」
ずいう二぀の䟋を玹介させおいただいた。

みなさたにアむデアの倩啓がおりる時、
本皿が倚少でもプラスに働けば、こんなに嬉しいこずはない。

最埌に、GiNZA開発者の方々ず、
むベント関係者の方々に、倚倧なる感謝を捧げたす。

以䞊です。

↧
↧

「メントスず囲碁の思い出」をCOTOHAさんに芁玄しおもらった結果。COTOHA最速チュヌトリアル付き

$
0
0

メントスず囲碁の思い出

メントスには深い思い入れがある。
圓時あたしは囲碁同奜䌚に参加しおおり、
碁石を匟いお盞手の碁石を萜ずすずいう
「シュヌティング囲碁」に興じおいた。
平安貎族も興じおいたに違いない、
そのみやびな遊びを理解できない同奜䌚䌚長は怒り狂った。
曰く、倧切な碁石が割れるからやめろ、ず。
碁石は割れたら盎せない。
割れたら蚌拠隠滅のために食べおしたえばいい
それならば、最初から「食べられる碁石」を採甚しおはどうか
よく芋るず「メントス」は碁石ずしお最適な条件を兌ね揃えおいた。
色、ツダ、圢、味、どれも通垞の碁石より優れおいる。
専門店にいかなくおも、コンビニで補充が出来る。
癜ず黒の淡泊な䞖界に飜きた際には、
色を倉えるこずもできる。
唯䞀の問題は、倏の暑さに匱そうなずころくらいであろう。
囲碁は、盞手の石を取るこずが出来る。
しかし、取ったからずいっお䜕が嬉しいのだろうか。
ちょっずゲヌムが有利になるだけだ。
メントスならばおいしく食べちゃっおもいい。
囲碁を匷くなろうずいう熱意も出おくるずいうもの。
あたしは同奜䌚䌚長にこう盎蚎した。
碁石を党おメントスに倉えよう
いた、コンビニでメントスを芋かけなくなったのは、
このあたしのアむデアでメントスの倀段が高隰しおしたったからである。
ああ、あたしのいずしいメントスよ、どこぞいった

本投皿の内容

  • ある日、詩想がわき「メントスず囲碁の思い出」ずいうポ゚ムが生たれた。
  • 意味が分からない、ず蚀われおしたい悲しかった。
  • 偉倧なる芞術家は埀々にしお圓時の人々には理解されないものだ。
  • 【Qiita x COTOHA APIプレれント䌁画】で、COTOHAには芁玄機胜があるこずを思いだした。
  • そういえば【今シンガポヌルLineBot】の最埌で、COTOHAを觊ろうず思っおいた。
  • そうだ、このポ゚ムをCOTOHAさんに読んでもらっお芁玄しおもらおう倧迷惑
  • ぀いでにCOTOHAさんの䞻芁機胜を秒で詊せる最速チュヌトリアルコヌドを䜜成
  • COTOHAさんで誰でも簡単に自然蚀語凊理が出来るようになったよ。むマココ

COTOHAさんにポ゚ムを読んでもらった結果

■ COTOHAさんによる芁玄結果

ここから

碁石を党おメントスに倉えよう
いた、コンビニでメントスを芋かけなくなったのは、
このあたしのアむデアでメントスの倀段が高隰しおしたったからである。

ここたで改行は远加

COTOHAさんすごいっ実感

芁玄機胜以倖にもCOTOHAには様々なAPIがある

構文解析、固有衚珟抜出、照応解析、キヌワヌド抜出、
類䌌床算出、文タむプ刀定、ナヌザ属性掚定、感情分析、芁玄
・・・などなど。

無料ナヌザでも、各APIごずに1000回/日䜿えるそうだ。

詊しおみたいけど、リファレンスみながら䜜るのも面倒なんだよなヌ。
䞀瞬で党郚動かせる内容を理解出来るサンプル無いかなヌ。
ず、あたしが欲しかったのでたずめおみた。埌述に党コヌド蚘茉

無料ナヌザ登録埌、Colaboratoryにアクセスしお、
「ファむル」⇒「Python3の新しいノヌトブック」
⇒本皿のコヌドをコピペしお実行 ⇒ これだけで䞻芁API党おが分かる

前提環境䞀切䞍芁。ブラりザだけで実行できお、
すぐに䜿える応甚開発が出来るサンプル。

ColaboratoryGoogleの無料Python実行環境を䜿わなくおも、
Pythonがむンストヌル枈みの環境ならば、
䞋蚘のコヌドを぀のPythonファむルに曞いお、
python Mentos_Cotoha.pyなどず実行しおも、
すぐ同じ結果が埗られる。

ナヌザ登録埌、コピペだけで䞀瞬で詊せるので、
ぜひお手元で詊しおいただきたい。
Qiitaずの䌁画でプレれントやっおいるので觊るなら今がチャンス

さっそく無料ナヌザ登録はこちらから。
COTOHA API Portal

COTOHA最速チュヌトリアルサンプルコヌド

Colaboratoryでも、ロヌカル環境でも、
どこでもコピペだけですぐ実行できるサンプルコヌド。
 ※ナヌザIDずシヌクレットキヌは自分で入力
サンプルを詊したあずは、
API実行を扱いやすくするラむブラリずしお利甚可胜。

参考 https://qiita.com/gossy5454/items/83072418fb0c5f3e269f

Mentos_Cotoha.py
importosimporturllib.requestimportjsonimportcodecs# 「自然蚀語凊理を簡単に扱えるず噂のCOTOHA APIをPythonお゙䜿っおみた」
# https://qiita.com/gossy5454/items/83072418fb0c5f3e269f
# 䞊蚘蚘事のコヌドをベヌスに、Colaboratoryですぐ動くように改倉。
# たた、同じ凊理を共通化しおコヌド党䜓を短くし
# 耇数のAPIのサンプルコヌドも远加した。
# 本改倉埌コヌドの詳现は䞋蚘参照。
# https://qiita.com/youwht/items/16e67f4ada666e679875
# COTOHA API操䜜甚クラス
classCotohaApi:# 初期化
def__init__(self,client_id,client_secret,developer_api_base_url,access_token_publish_url):self.client_id=client_idself.client_secret=client_secretself.developer_api_base_url=developer_api_base_urlself.access_token_publish_url=access_token_publish_urlself.getAccessToken()# アクセストヌクン取埗
defgetAccessToken(self):# アクセストヌクン取埗URL指定
url=self.access_token_publish_url# ヘッダ指定
headers={"Content-Type":"application/json;charset=UTF-8"}# リク゚ストボディ指定
data={"grantType":"client_credentials","clientId":self.client_id,"clientSecret":self.client_secret}# リク゚ストボディ指定をJSONに゚ンコヌド
data=json.dumps(data).encode()# リク゚スト生成
req=urllib.request.Request(url,data,headers)# リク゚ストを送信し、レスポンスを受信
res=urllib.request.urlopen(req)# レスポンスボディ取埗
res_body=res.read()# レスポンスボディをJSONからデコヌド
res_body=json.loads(res_body)# レスポンスボディからアクセストヌクンを取埗
self.access_token=res_body["access_token"]#各APIの共通凊理
defcallCotohaApiCommon(self,url,data):# ヘッダ指定
headers={"Authorization":"Bearer "+self.access_token,"Content-Type":"application/json;charset=UTF-8",}# リク゚ストボディ指定をJSONに゚ンコヌド
data=json.dumps(data).encode()# リク゚スト生成
req=urllib.request.Request(url,data,headers)# リク゚ストを送信し、レスポンスを受信
# 以䞋、リク゚スト゚ラヌ時のリトラむ凊理を入れたが、
# 長時間攟眮埌に再実行、などが無ければ消しおも良い。
# リトラむカりントを蚭定
CONNECTION_RETRY_COUNT=2forcounterinrange(1,CONNECTION_RETRY_COUNT+1):try:res=urllib.request.urlopen(req)#exceptionに行かなければルヌプ終了
break# リク゚ストで゚ラヌが発生した堎合の凊理
excepturllib.request.HTTPErrorase:# ステヌタスコヌドが401 Unauthorizedならアクセストヌクンを取埗し盎しお再リク゚スト
ife.code==401:print("[RETRY] get access token")self.access_token=getAccessToken(self.client_id,self.client_secret)headers["Authorization"]="Bearer "+self.access_tokenreq=urllib.request.Request(url,data,headers)# 401以倖の゚ラヌなら原因を衚瀺しお凊理自䜓を終了。空癜を返す。
else:print("<Error> "+e.reason)return""# それ以倖の゚ラヌは䞍明なので終了。
# サヌバ系の゚ラヌの堎合、だいたいURLか匕数を芋盎すず良い
exceptExceptionase:print(e)return""# レスポンスボディ取埗
res_body=res.read()# レスポンスボディをJSONからデコヌド
res_body=json.loads(res_body)# レスポンスボディから解析結果を取埗
returnres_body# 構文解析API
defcallParseApi(self,sentence):url=self.developer_api_base_url+"nlp/v1/parse"data={"sentence":sentence}returnself.callCotohaApiCommon(url,data)# 固有衚珟抜出API
defcallNeApi(self,sentence):url=self.developer_api_base_url+"nlp/v1/ne"data={"sentence":sentence}returnself.callCotohaApiCommon(url,data)# 照応解析API
# document は string / array(string) なので文でも、文のリストでも良い
# ほかのdocument箇所も同様
defcallCoreferenceApi(self,document):url=self.developer_api_base_url+"nlp/v1/coreference"data={"document":document}returnself.callCotohaApiCommon(url,data)# キヌワヌド抜出API
defcallKeywordApi(self,document):url=self.developer_api_base_url+"nlp/v1/keyword"data={"document":document}returnself.callCotohaApiCommon(url,data)# 類䌌床算出API
defcallSimilarityApi(self,sentence1,sentence2):url=self.developer_api_base_url+"nlp/v1/similarity"data={"s1":sentence1,"s2":sentence2}returnself.callCotohaApiCommon(url,data)# 文タむプ刀定API
defcallSentenceTypeApi(self,sentence):url=self.developer_api_base_url+"nlp/v1/sentence_type"data={"sentence":sentence}returnself.callCotohaApiCommon(url,data)# ナヌザ属性掚定API
defcallUserAttributeApi(self,document):url=self.developer_api_base_url+"nlp/beta/user_attribute"data={"document":document}returnself.callCotohaApiCommon(url,data)# 感情分析API
defcallSentimentApi(self,sentence):url=self.developer_api_base_url+"nlp/v1/sentiment"data={"sentence":sentence}returnself.callCotohaApiCommon(url,data)# 芁玄API
# sentenceのサむズは、55000
# sent_lenのサむズは、1100
defcallSummaryApi(self,sentence,sent_len):url=self.developer_api_base_url+"nlp/beta/summary"data={"document":sentence,"sent_len":sent_len}returnself.callCotohaApiCommon(url,data)#䞊蚘以倖のAPIや、各APIのオプションを远加/倉曎するのも同様にやればOK
if__name__=='__main__':#####各自の蚭定を蚘入する箇所#####
#登録完了盎埌のペヌゞに曞いおあるよ
CLIENT_ID="ココニアむデむカク"CLIENT_SECRET="ココニシヌクレットカク"#BASE_URLは、公匏ペヌゞでは、末尟にnlpを含めおいないけど、
#少し前の技術蚘事だず、末尟にnlpも含めおいる人も倚いから気を付けおね
DEVELOPER_API_BASE_URL="https://api.ce-cotoha.com/api/dev/"ACCESS_TOKEN_PUBLISH_URL="https://api.ce-cotoha.com/v1/oauth/accesstokens"#####以䞋䜿甚䟋#####
# 各APIのコヌル方法や、レスポンスの解析の詳现はリファレンスを芋るずいいよ。
# https://api.ce-cotoha.com/contents/reference/apireference.html
# COTOHA APIむンスタンス生成
cotoha_api=CotohaApi(CLIENT_ID,CLIENT_SECRET,DEVELOPER_API_BASE_URL,ACCESS_TOKEN_PUBLISH_URL)print("■ 構文解析")sentence="すもももももももものうち"api_result=cotoha_api.callParseApi(sentence)forchunksinapi_result['result']:print(chunks)print("■ 固有衚珟抜出")sentence="私は今日母ず東京タワヌでメントスを食べた"api_result=cotoha_api.callNeApi(sentence)forchunksinapi_result['result']:print(chunks)print("■ 照応解析")document=["倪郎は友人です","圌のおじいさんがくれた初めおのキャンディ","それはメントスで私は四歳でした"]api_result=cotoha_api.callCoreferenceApi(document)forchunksinapi_result['result']['coreference']:print(chunks['referents'])print("■ キヌワヌド抜出")document=["ペットボトルに入ったダむ゚ットコヌラの䞭にメントス数粒を䞀床に投入した際に急激に炭酞が気化し、泡が䞀気に数mの高さたで吹き䞊がる珟象をメントスガむザヌず呌ぶ"]api_result=cotoha_api.callKeywordApi(document)forchunksinapi_result['result']:print(chunks)print("■ 類䌌床算出")sentence1="メントスはおいしい"sentence2="ラヌメンも倧奜きです"api_result=cotoha_api.callSimilarityApi(sentence1,sentence2)print(api_result['result']['score'])print("■ 文タむプ刀定")sentence="質問を質問で返すんじゃない"api_result=cotoha_api.callSentenceTypeApi(sentence)print(api_result['result']['modality'])#declarative叙述
#interrogative質問
#imperative呜什
print("■ ナヌザ属性掚定")document=["やめられないずたらない","君が泣くたで殎るのをやめない"]api_result=cotoha_api.callUserAttributeApi(document)print('結果  {}'.format(api_result['result']))print("■ 感情分析")sentence="その味は甘くおクリヌミィでこんな玠晎らしいメントスをもらえる私はきっず特別な存圚なのだず感じたした"api_result=cotoha_api.callSentimentApi(sentence)#他のAPIの結果に぀いおも、各結果をjsonのたた芋たい堎合は䞋蚘のようにする。
result_formated=json.dumps(api_result,indent=4,separators=(',',': '))print(codecs.decode(result_formated,'unicode-escape'))print("■ 芁玄")sentence='''タむトルメントスず囲碁の思い出
メントスには深い思い入れがある。
圓時あたしは囲碁同奜䌚に参加しおおり、
碁石を匟いお盞手の碁石を萜ずすずいう
「シュヌティング囲碁」に興じおいた。
平安貎族も興じおいたに違いない、
そのみやびな遊びを理解できない同奜䌚䌚長は怒り狂った。
曰く、倧切な碁石が割れるからやめろ、ず。
碁石は割れたら盎せない。
割れたら蚌拠隠滅のために食べおしたえばいい
それならば、最初から「食べられる碁石」を採甚しおはどうか
よく芋るず「メントス」は碁石ずしお最適な条件を兌ね揃えおいた。
色、ツダ、圢、味、どれも通垞の碁石より優れおいる。
専門店にいかなくおも、コンビニで補充が出来る。
癜ず黒の淡泊な䞖界に飜きた際には、
色を倉えるこずもできる。
唯䞀の問題は、倏の暑さに匱そうなずころくらいであろう。
囲碁は、盞手の石を取るこずが出来る。
しかし、取ったからずいっお䜕が嬉しいのだろうか。
ちょっずゲヌムが有利になるだけだ。
メントスならばおいしく食べちゃっおもいい。
囲碁を匷くなろうずいう熱意も出おくるずいうもの。
あたしは同奜䌚䌚長にこう盎蚎した。
碁石を党おメントスに倉えよう
いた、コンビニでメントスを芋かけなくなったのは、
このあたしのアむデアでメントスの倀段が高隰しおしたったからである。
ああ、あたしのいずしいメントスよ、どこぞいった
'''api_result=cotoha_api.callSummaryApi(sentence,1)print('結果  {}'.format(api_result['result']))# Mentos(メントス)は商暙たたは登録商暙です。
実行結果
■構文解析{'chunk_info':{'id':0,'head':1,'dep':'P','chunk_head':0,'chunk_func':1,'links':[]},'tokens':[{'id':0,'form':'すもも','kana':'スモモ','lemma':'李','pos':'名詞','features':[],'dependency_labels':[{'token_id':1,'label':'case'}],'attributes':{}},{'id':1,'form':'も','kana':'モ','lemma':'も','pos':'連甚助詞','features':[],'attributes':{}}]}{'chunk_info':{'id':1,'head':3,'dep':'D','chunk_head':0,'chunk_func':1,'links':[{'link':0,'label':'other'}]},'tokens':[{'id':2,'form':'もも','kana':'モモ','lemma':'桃','pos':'名詞','features':[],'dependency_labels':[{'token_id':0,'label':'nmod'},{'token_id':3,'label':'case'}],'attributes':{}},{'id':3,'form':'も','kana':'モ','lemma':'も','pos':'連甚助詞','features':[],'attributes':{}}]}{'chunk_info':{'id':2,'head':3,'dep':'D','chunk_head':0,'chunk_func':1,'links':[]},'tokens':[{'id':4,'form':'もも','kana':'モモ','lemma':'桃','pos':'名詞','features':[],'dependency_labels':[{'token_id':5,'label':'case'}],'attributes':{}},{'id':5,'form':'の','kana':'ノ','lemma':'の','pos':'栌助詞','features':['連䜓'],'attributes':{}}]}{'chunk_info':{'id':3,'head':-1,'dep':'O','chunk_head':0,'chunk_func':0,'links':[{'link':1,'label':'other'},{'link':2,'label':'adjectivals'}]},'tokens':[{'id':6,'form':'うち','kana':'りチ','lemma':'内','pos':'名詞','features':['連甚'],'dependency_labels':[{'token_id':2,'label':'nmod'},{'token_id':4,'label':'nmod'}],'attributes':{}}]}■固有衚珟抜出{'begin_pos':2,'end_pos':4,'form':'今日','std_form':'今日','class':'DAT','extended_class':'','source':'basic'}{'begin_pos':6,'end_pos':11,'form':'東京タワヌ','std_form':'東京タワヌ','class':'ART','extended_class':'','source':'basic'}■照応解析[{'referent_id':0,'sentence_id':0,'token_id_from':0,'token_id_to':0,'form':'倪郎'},{'referent_id':1,'sentence_id':1,'token_id_from':0,'token_id_to':0,'form':'圌'}][{'referent_id':0,'sentence_id':1,'token_id_from':0,'token_id_to':2,'form':'圌のおじいさん'},{'referent_id':1,'sentence_id':2,'token_id_from':0,'token_id_to':0,'form':'それ'}]■キヌワヌド抜出{'form':'投入','score':18.75872}{'form':'気化','score':11.889}{'form':'泡','score':10.9335}{'form':'ペットボトル','score':10.38192}{'form':'急激','score':10.2795}■類䌌床算出0.71831065■文タむプ刀定declarative■ナヌザ属性掚定結果{'age':'20-29æ­³','earnings':'-1M','hobby':['MOVIE','SHOPPING'],'location':'関東','moving':['RAILWAY'],'occupation':'䌚瀟員'}■感情分析{"result":{"sentiment":"Positive","score":0.740555365045455,"emotional_phrase":[{"form":"玠晎らしい","emotion":"P"},{"form":"甘くお","emotion":"PN"},{"form":"もらえる","emotion":"P"},{"form":"きっず特別な","emotion":"PN"}]},"status":0,"message":"OK"}■芁玄結果碁石を党おメントスに倉えよういた、コンビニでメントスを芋かけなくなったのは、このあたしのアむデアでメントスの倀段が高隰しおしたったからである。

オヌラをメントスに倉える念胜力

蚘事を曞いおいるうちに、
あたしもメントスが具珟化出来るようになっおきたかもしれない。

たずメントスを具珟化しようず決めおからはむメヌゞ修行だな。
最初は実際のメントスを䞀日䞭いじくっおたな。ずにかく四六時䞭だよ。
目を぀ぶっお觊感を確認したり䜕癟枚䜕千枚ずメントスを写生したり、
ずヌっずただながめおみたりなめおみたり、音を立おたり嗅いでみたり、
メントスで遊ぶ以倖は䜕もするなず垫匠に蚀われたからな。
しばらくしたら毎晩メントスの倢を芋るようになっお
その時点で実際のメントスをずりあげられた。
そうするず今床は幻芚でメントスが芋えおくるんだ。
さらに日が経぀ず幻芚のメントスがリアルに感じられるんだ。
重さも冷たさもすれあう音も聞こえおくる。
い぀のたにか幻芚じゃなく、自然ず具珟化したメントスが出おいたんだ。
それ以倖はおそらくゎン達ず同じだよ。ずにかく毎日毎日纏ず緎だ。

ゎレむヌのゎリラの具珟化修行よりはマシ

ヒトコト or フタコトで蚀うず・・・

Mentosの具珟化
sentence='''たずメントスを具珟化しようず決めおからはむメヌゞ修行だな。
最初は実際のメントスを䞀日䞭いじくっおたな。ずにかく四六時䞭だよ。
目を぀ぶっお觊感を確認したり䜕癟枚䜕千枚ずメントスを写生したり、
ずヌっずただながめおみたりなめおみたり、音を立おたり嗅いでみたり、
メントスで遊ぶ以倖は䜕もするなず垫匠に蚀われたからな。
しばらくしたら毎晩メントスの倢を芋るようになっお
その時点で実際のメントスをずりあげられた。
そうするず今床は幻芚でメントスが芋えおくるんだ。
さらに日が経぀ず幻芚のメントスがリアルに感じられるんだ。
重さも冷たさもすれあう音も聞こえおくる。
い぀のたにか幻芚じゃなく、自然ず具珟化したメントスが出おいたんだ。
それ以倖はおそらくゎン達ず同じだよ。ずにかく毎日毎日纏ず緎だ。
'''api_result=cotoha_api.callSummaryApi(sentence,1)print('結果  {}'.format(api_result['result']))api_result=cotoha_api.callSummaryApi(sentence,2)print('結果  {}'.format(api_result['result']))
実行結果
結果い぀のたにか幻芚じゃなく、自然ず具珟化したメントスが出おいたんだ。結果最初は実際のメントスを䞀日䞭いじくっおたな。い぀のたにか幻芚じゃなく、自然ず具珟化したメントスが出おいたんだ。

参考リンク

◇構文解析・照応解析のデモ
https://api.ce-cotoha.com/demo?query=い぀のたにか幻芚じゃなく、自然ず具珟化したメントスが出おいたんだ
◇APIのリファレンス
https://api.ce-cotoha.com/contents/reference/apireference.html
◇コトハ むチバン ナりメむ キゞ スゎむ
https://qiita.com/Harusugi/items/f499e8707b36d0f570c4
◇COTOHA APIポヌタル無料登録はこちらから
https://api.ce-cotoha.com/contents/index.html
◇COTOHAのコミュニティ、Slack等ぞのリンク
https://api.ce-cotoha.com/contents/community.html

あずがき

"しゃべりすぎた翌朝 萜ち蟌むこずの方が倚い"

芋おごらん よく䌌おいるだろう

ポ゚ムを曞いた次の日の朝ず。

あたしは玙をくしゃくしゃず䞞めお投げ、

メントスをほおばるのだった。

了。

↧

声に出しお読みたい矎しいPython甚語18遞。R18䟋文付き

$
0
0

背景

冷凍マグロ系スクリプト蚀語ずしお知られるPythonは、
矎しい名前のパッケヌゞが沢山あるこずでも有名です。

  • PyPyぱいぱい
  • pypanぱいぱん
  • pypantsぱいぱん぀

参考 声に出しお読みたい぀のPython甚語
http://doloopwhile.hatenablog.com/entry/20120120/1327062714

これらの矎しい名前のパッケヌゞに魅せられ、
どれくらい矎しい名前のパッケヌゞが存圚するのか、
本気で調べおみるこずにしたした。

参考先の情報は2012幎ず少し叀いですし、
今再床探せば、さらに矎しい名前が芋぀かるに違いありたせん

調査の方針ず抂芁

Pythonのパッケヌゞ管理システム  pipの察象パッケヌゞは党お
PyPIぱいぱいに登録されおいたす。
https://pypi.org/
※ぱいぱい、ず読むかどうかは流掟があるようです。

総数実に「219,370」個※2020幎2月珟圚
ずおも人手で確認出来る量ではありたせん。

党く䜿われおいない䌑眠パッケヌゞは陀倖したいため、
盎近幎間で䞀回以䞊のむンストヌルがあるパッケヌゞ
を察象にしたいず思いたす。
䟋えば、参考先サむトが掲げおいる、
Pychinko(ぱいちんこ)
は既にこの䞖に存圚しないようで、陀倖されたすし、
Pyzuri(ぱいずり)
も残念ながら党くダりンロヌドが無いようで、陀倖されたす。

こういった党パッケヌゞ名称ず、そのダりンロヌド情報は、
pypinfoずBigQueryを䜿うこずで取埗可胜です詳现埌述。

パッケヌゞ名称は英数字であるため、
無理やりカタカナ読みする日本語倉換凊理を行いたす。
パッケヌゞ名は単玔な英単語ではないため、
 これが結構難しい凊理になりたす

最埌に、予め䜜っおおいた「矎しい蚀葉リスト」を甚いお
日本語化したパッケヌゞ名称に察しお怜玢をかけたす。

このような地道な努力によっお、
オモシロむ矎しい名前のパッケヌゞを
倧量に芋぀けるこずができたした

結果発衚

コヌドの前に、さきに結果をご玹介したす。
いろいろ芋぀かったのですが、個に遞定したした。
参考先の蚘事が平成版だずするず、
什和版遞、略しお「」ず呌ぶこずにしたす。

ぱいそんの矎しきネヌミングセンスを、䟋文付きでご堪胜ください。

※ふりがなは、正匏な読み方ではなくあくたで、
 今回䜜成したカタカナ読み倉換ツヌルによる自動付䞎結果です。

sexmachineせっくすたしん

盎近1幎間で、31,001 DL
名前が女性か男性かを刀断するツヌルです。

月になったら新人プログラマヌに倧声で教えおあげたしょう。
䟋分からない時は【sexmachine】に聞け

methanalめすあなる

盎近1幎間で、163 DL
仮数フォヌムおよびナヌティリティりィゞェットラむブラリです。

月になったら職堎で叫んでみたしょう。
䟋䌑日はずっず【methanal】をいじっおいたよ

thefuckざふぁっく

盎近1幎間で、64,492 DL
コン゜ヌルコマンドの゚ラヌを修正するツヌルです。
https://github.com/nvbn/thefuck

゚ラヌ発生時に、ずにかく「ファッ〇」ず
驚きの声を䞊げおしたう方に、自動察応しおくれお人気がある暡様。

月になったら兎に角、よんでみたしょう。
䟋【thefuck】【thefuck】【thefuck】

pyzureぱいずり

盎近1幎間で、427 DL
Microsoft Azure SQL DBにデヌタを簡単に送信するPythonパッケヌゞです。
https://github.com/dacker-team/pyzure

本家のpyzuriは消えたものの、新たな逞材を発芋したした。

月になったらみんなに話しおあげたしょう。
䟋昚晩【pyzure】にトラむしお、良かったなあ

askocliあすくおしり

盎近1幎間で、78 DL
リモヌトのAskOmicsにデヌタを挿入するためのcliツヌル、ずのこず。

月になったら優しく諭しおあげたしょう。
䟋挿入するずきはたず【askocli】だよ

stockingsすずっきんぐす

盎近1幎間で、71 DL
完党なメッセヌゞの送受信を可胜にするWindows / Linux、
Python 2および3互換の゜ケットラッパヌ。

月になったらこっそり打ち明けたしょう
䟋実はいた【stockings】を䜿っおいるんだ

osexおせっくす

盎近1幎間で、34 DL
詳现䞍明です。ドキュメントが無いため扱いにくいかもしれたせん。

月になったら盞談しおみたしょう
䟋【osex】にハマっお、困っおるんです

pypi-cliぱいぱい-しりmypypiたいぱいぱい

盎近1幎間で、488 DL、109 DL

ぱいぱい系は倧量にあるため、党量は蚘茉出来たせん。
きっず䜿い勝手の良いパッケヌゞも倚いこずでしょう。

月になったら絶賛したしょう
䟋【mypypi】は最高だ

※pypi-rankingsパむパむ-ランキングスずかもありたした。
 䟋昚日はずっず【pypi-rankings】を芋おいたんだ

pypantsぱいぱん぀pypandasぱいぱんだす

盎近1幎間で、570 DL、1,114 DL

月になったら倧きな声で宣蚀したしょう
䟋わたしはい぀も【pypandas】

pantsぱん぀fancypantsふぁんしヌぱん぀

盎近1幎間で、535 DL、40 DL

月になったら同僚に玹介しおあげたしょう
䟋がくの【fancypants】を芋せおあげるよ

doraemon-robotframeworkどらえもん-ろがっずふれヌむわヌく

盎近1幎間で、512 DL
受け入れテストずロボットプロセス自動化RPAのための汎甚自動化フレヌムワヌク
「robotframework」を青タヌキの圢にしたもののようです

月になったら宿題を忘れおも怖くありたせん
䟋困ったずきは【doraemon-robotframework】に頌むこずにするね

bakaばか

盎近1幎間で、49 DL
Pyramidのコアを䜿甚するWebアプリケヌションフレヌムワヌクのようです。

月になったら詊しおみたしょう
䟋パ゜コンに【baka】を入れおみたんだ

hncommentsえっちんこめん぀

盎近1幎間で、52 DL

月になったら䜕ずなく぀ぶやいおみたしょう
䟋【hncomments】。ふふふ

sexytimeせくしヌたいむsexy-funせくしヌふぁん

盎近1幎間で、52 DL、25 DL

月になったら今埌の期埅を語りたしょう
䟋これから【sexytime】をはじめようか

感想かんそう

英語からカタカナにするずころが䞀番倧倉だったのですが、
英語の時点で既にパワヌワヌドが倚かったです。

月になったら、ぜひ実際に職堎や孊校などで
声を出しお読み䞊げおみたしょう。
呚囲の方はきっず「春の蚪れ」を感じるず思いたす。


以䞋は技術的な詳现なので倚くの人は芋なくおよいず思いたす。
興味のあるかたはぜひご参照ください。

矎しい名前のパッケヌゞ矀を、真面目に玹介しおおり、
か぀、その取埗甚コヌドを解説しおいる本蚘事が
「怜閲/削陀」されるこずは党く心配しおいたせん。

しかし、心が汚れたオトナが芋るず、
本来の意図ずは別な意味に受け取っおしたうかもしれたせん。

諞般の事情に぀き本蚘事は
䞍意に消えおしたう可胜性がある点、あしからずご了承ください。
消える前にぜひお手元でお詊しくださいたせ。

①パッケヌゞ䞀芧ダりンロヌド数情報取埗pypinfo

pipのパッケヌゞが登録されおいるPyPIぱいぱいでは、
その統蚈情報のデヌタセットを
Google/BigQueryで公開しおいたす。
その情報を容易に取埗出来るツヌルが
pypinfoです。

BigQueryを操䜜するために、
䞋蚘のサむトの手順に埓っお、
https://github.com/ofek/pypinfo
Google Cloud PlatformGCPのアカりントず、
認蚌情報JSONファむルを䜜る必芁がありたす。

JSONファむルたで䜜成したら、ブラりザで
Colaboratoryhttps://colab.research.google.com/?hl=ja
を立ち䞊げお、以䞋のようにコマンドを実行しおいきたしょう。

GoogleDriveをマりントしたす。
fromgoogle.colabimportdrivedrive.mount('/content/drive')
今回の䜜業フォルダを䜜りたす。
!mkdir"drive/My Drive/PYPI"#さきほど䜜成した認蚌甚のJSONファむルをここにアップロヌドしたしょう。
pypinfoをむンストヌルしたす。
pipinstallpypinfo
認蚌甚のJSONファむルのパスを指定しお、認蚌情報を取埗したす。
!pypinfo--auth"/content/drive/My Drive/PYPI/YourGCPProjectName-XXXXXXXXX.json"
pypinfoの疎通確認こんな感じに「request」のダりンロヌド数が取埗出来たす
!pypinforequests#Served from cache: False
#Data processed: 67.70 GiB
#Data billed: 67.70 GiB
#Estimated cost: $0.34
#
#| download_count |
#| -------------- |
#|     61,319,474 |

他にも、囜ごず、バヌゞョンごず、むンストヌル先OSごずなど、
様々な情報を取埗出来るので、公匏サむトの䟋に埓っお詊しおみたしょう。

䞊蚘の「Estimated cost: $0.34」にあるように、
BigQueryでは、ク゚リを投げるごずに、
読み取ったデヌタ量に応じお課金が生じるこずには泚意が必芁です。
が、1 TB/䞀か月のAlways Free枠ず、
新芏GCPナヌザ甚の300/幎の無料枠があるため、
通垞の䜿い方では倧䞈倫でしょう。
党量取埗系の重いク゚リだけは、連射しないように泚意しおください。

では、぀いに今回のデヌタ取埗甚のク゚リを投げおみたす。

盎近幎間を指定しおク゚リを投げ、結果をファむルに保存。
!pypinfo--days365--limit250000""project>"drive/My Drive/PYPI/PYPINFO_365_LIST.txt"#Served from cache: False
#Data processed: 636.49 GiB
#Data billed: 636.49 GiB
#Estimated cost: $3.11
#| project                                                                           | download_count |
#| --------------------------------------------------------------------------------- | -------------- |
#|                                                                           urllib3 |    950,108,414 |
#|                                                                               six |    788,263,157 |
#|                                                                          botocore |    693,156,212 |
#|                                                                          requests |    656,942,399 |
#  以䞋略

ご参考たでに、
盎近幎間の総ダりンロヌド数は、
箄 37,498,000,000 回
パッケヌゞの皮類は、玄 215,000皮類 でした。

パッケヌゞの総数が玄22䞇皮類なので、
盎近幎間レベルで芋るず、登録されおいるものは
ほずんどが「生きおいる」こずになりたす。
以前あったず蚀われおいるPychinkoぱいちんこが無いこずから、
定期的に棚卞しされおいるのかもしれたせん。
たた、盎近日で芋るず13侇4千皮類ほどでしたので、
倚少たずもに䜿われおいるものは10䞇皮類以䞋くらいでしょうか

②取埗デヌタの加工

先ほど取埗したパッケヌゞ名ダりンロヌド数のファむルは、
手元で人が閲芧する分には芋やすくお䟿利なのですが、
プログラミング的に扱うには、パヌスしお加工する必芁がありたすね。

冒頭のク゚リのコストの行や、衚の芋出し行/Total行などの陀去に泚意しお、
䞋蚘のように加工しおLIST圢匏にしたす。

結果ファむルを加工しながら読み蟌んでLISTにする
f=open('/content/drive/My Drive/PYPI/PYPINFO_365_LIST.txt')line=f.readline()# 1行ず぀読み蟌む(含改行文字)
pypinfo_list=[]whileline:#敷居が䞉぀の堎合芋出しず枠ずTotalがゞャマだが、それ以倖はこの条件で刀別可胜
ifline.count('|')!=3:line=f.readline()continueelse:#改行コヌド、カンマ、半角スペヌスは陀去
parsed_line=line.replace('\n','').replace(' ','').replace(',','')one_data=parsed_line.split('|')#['', 'urllib3', '950108414', '']の圢の真ん䞭個を䜿う
# 備考数倀もいたのずころ文字列扱い
one_data=one_data[1:3]pypinfo_list.append(one_data)line=f.readline()f.close#最初の行の芋出し行ず、最埌の合蚈行は陀去
pypinfo_list=pypinfo_list[2:-1]

pypinfoが提䟛しおいたりしないのかなヌず思いながらも、
自䜜しおしたいたした。仮に有ったずしおも、
䞀回玄かかるク゚リなので、テキスト版ず別に投げるより、
ク゚リ投入回数の節玄にもなるでしょう。
この①ず②は、Python関連の「デヌタ分析」を行う際にも有甚だず思いたす。

③パッケヌゞ名をカタカナにする技術alkana.py頑匵る

さお、パッケヌゞ名の䞀芧化が出来たしたが、
䟋えば、urllib ⇒ナヌアヌル゚ルリブ
python-dateutil ⇒ パむ゜ン-デむトナティル
などのようにパッケヌゞ名をカタカナ化するには
どうしたら良いのでしょうか

方針は以䞋のステップです。
英単語ずしお存圚しおいる蚀葉をカタカナにする
Pythonや、AWS、GITなどのIT特殊甚語をカタカナにする
「ロヌマ字倉換」を適甚出来るだけ適甚する
残った端数の文字は適圓に倉換しおおく⇒フ、など。

最初の、「英単語をカタカナに」は、䞋蚘の
alkana.pyの倉換テヌブルを䜿わせおいただきたした。
https://github.com/cod-sushi/alkana.py/blob/master/README_ja.md

に぀いおは、䞻にロヌマ字の芏則衚から、
330行ほどの倉換テヌブルを䜜成したした。
前述のalkana.pyからのデヌタず足し合わせお、
alkana_listずしお倉換テヌブルを䜜っおおきたす。

ここでのポむントは、その英語の文字列の長さをキヌずしお、
alkana_listを降順に゜ヌトしおおくこずです。

x[0]の項目にはあらかじめ文字列の長さを入れおおく
alkana_list=sorted(alkana_list,key=lambdax:x[0],reverse=True)# py ⇒ パむ、や、python ⇒ パむ゜ン など優先床の高いものに぀いおは、
# [30, 'py', 'パむ'] などず長さが長いこずにしお登録すれば優先床が䞊がる。

これで、長い単語から順に倉換が適甚されるこずになりたす。
実際に倉換しおいる様子は以䞋です。
分量があるため、䞀回分くらいかかりたす。
䞋蚘のようにtqdmで途䞭の進捗を衚瀺したり、
凊理終了埌はpickleで保存しおおくず䜿いやすいでしょう。

党モゞュヌルにカタナカ読み情報を付䞎する
fromtqdmimporttqdmpypinfo_jp_list=[]forpypinfointqdm(pypinfo_list):#日本語モゞュヌル名栌玍倉数この時点では英語を栌玍
jp_module_name=pypinfo[0]fordatainalkana_list:#倉換テヌブルを、順番通りに倉換しおいく。
jp_module_name=jp_module_name.replace(data[1],data[2])pypinfo_jp_list.append([pypinfo[0],jp_module_name,int(pypinfo[1])])print(len(pypinfo_jp_list))print(pypinfo_jp_list[0:10])importpicklewithopen('/content/drive/My Drive/PYPI/pypinfo_jp_list.pickle','wb')asf:pickle.dump(pypinfo_jp_list,f)

特殊な自然蚀語凊理ツヌルずしお、
なにか甚途もあるかもしれたせん。

④「矎しい蚀葉」が䜿われおいるパッケヌゞを探す

最埌に、特定のキヌワヌドが含たれおいるパッケヌゞを探したす。
予め「Beautiful_tango_list」にお奜みの単語を登録しおおき、
ひたすらルヌプするだけです。
「ぱい」などの倚数䜿われおいる甚語を入れるず、
結果が膚倧になっおしたう点は泚意したしょう。
今回は、ずある「お䞊品な単語をリストアップしおいるサむト」
の単語を拝借したした。

Colaboratoryではprint出力は5000行たでだず思うので、
䞇行くらいいくならば、䞋蚘のようにファむルぞ出力する方が良いでしょう。

Beautiful_tango_listの内容を怜玢しおテキストに曞く
result_str=""forwordinBeautiful_tango_list:result_str+="■"+" "+word+"\n"fordatainpypinfo_jp_list:ifwordindata[1]:result_str+=str(data)+"\n"result_str+="\n"withopen('/content/drive/My Drive/PYPI/Beautiful_Result.txt','w')asf:print(result_str,file=f)

お぀かれさたでした。
これらの技術コヌドを駆䜿しお、前述の結果のような、
矎しい名前のパッケヌゞを倚数芋぀けるこずが出来たのです。

あずがき

Pythonぱいそんのネヌミングセンスは奥が深いですね。
蟞曞をひくずきに隣の単語もみるように、
名前ずの偶然の巡りあわせだけからでも、
お気に入りのパッケヌゞずの出䌚いが生じたら玠晎らしいこずです。

PyPIぱいぱいが匕き合わせた運呜の出䌚い、
ずも蚀えるでしょう。
技術ぞの興味のきっかけが「名前が気になったので」
でも良いのではないでしょうか

いたっお真面目にパッケヌゞを玹介しおいる蚘事ですので、
本来の意図ずは違った意味を連想しおしたうような、
心が汚れたオトナのかたは、石を投げないでください。
どうぞよろしくお願い申し䞊げたす。

さあみなさんも、もっず
ぱい○ん ず ぱいぱ○ が
すきになりたしたでしょうか

ここたでお読みいただいた賢明な読者諞氏には、
○ に入る蚀葉は明らかですね。

誀解しおしたう方や、本蚘事にあらぬ文句を蚀う方がいたずしたら、
普段からそのようなこずばかり考えおいる方に違いありたせん。

珟堎からは以䞊です。

↧

ゲヌミングPCで機械孊習をしお、CPU/GPUの性胜の違いをColaboずも比范しおみた話【Windowsの機械孊習環境構築手順決定版。TF2.0察応】

$
0
0

ひずこずで蚀うず

栌安ゲヌミングPC(Windows)を賌入しお、
Anacondaの仮想環境でCPU/GPUを切り替えられるようにしお、
Tensorflow-GPU(v2.0)のコヌドを動かしお、
ColaboratoryのCPU/GPUも含めたパタヌンで、
性胜比范をしおみたよ。
性胜比范結果ずWindows版環境構築手順をたずめおおくね。ずいう蚘事。

  • 機械孊習にはGPUが有効だよ、っおよく聞く
  • ゲヌミングPCにはGPUがある、そしお最近安い

⇒ ゲヌミングPCのGPUを機械孊習に䜿っおみよう

ずいうこずで、Windows䞊でのGPU環境構築を実斜したが、
ハマりどころが倚く倧倉だった。

欲しいゲヌミングPCを「機械孊習甚だから」ず蚀っお
買う蚀い蚳になる決定版ずしおの蚘事。

GPUの性胜の違いが、孊習時間の決定的差になるずいうこずを・・・教えおやる

機械孊習GPU環境の぀の遞択肢ず、私芋

GPU有り自䜜PCにubuntu

  • 機械孊習ガチ勢にオススメ、高性胜
  • 高額になりがち党お合わせるず30䞇円くらい
  • 普段䜿いのWindowsやMacず別に買うずさらに倧きな出費
  • 王道であるため、動かしやすさ的にも良い
  • ※ゲヌミングPCのOSから入れ替えるパタヌンもコレ

Google Colaboratory

  • 初心者のお詊し䞊玚者たで幅広く察応
  • 無料で、高性胜GPUが䜿える
  • セットアップの手間いらず。Driveずの連携も䟿利
  • 䞀定時間ごずのリセットは気になる
  • Windows/Mac/Chromebookでもどこからでも䜿える

NVIDIA Jetson Nano

  • 䞭玚者以䞊。たたは、初心者のお詊しでも面癜い
  • 䜎䟡栌䞇円くらいだが性胜もそれなり
  • GPUメモリの䞊限で孊習出来る䞊限が違う点は芁泚意
  • 本䜓だけは安いが呚蟺機噚も0から揃えるず面倒
  • IoT機噚ずしおの利甚目的ならコレ䞀択
  • どちらかずいうず孊習甚よりPredict甚な気がする

GPU版のクラりドむンスタンス or サヌビス利甚

  • 埓量課金なので初心者向けず思わせお実は違う
  • 実行環境ずしお䜿う堎合、クラりド砎産に泚意
  • 簡単な開発環境ずしお䜿う堎合、ロックオンされがち
  • サヌビスにより様々

ゲヌミング(ノヌト)PC

  • ダヌクホヌス的存圚。通垞はWindowsなのをどう芋るか
  • 筐䜓の䟡栌は、セット販売なので同性胜での比范なら安い
  • 10䞇円30䞇円くらい
  • 機械孊習以倖の甚途にも䜿うならばコレ䞀択
  • ずいうか、ゲヌムにも䜿うなら100%コレしかない

Why ゲヌミングノヌトPCでやるの

個人的にデスクトップよりもノヌト掟で、別目的のマシンを
機械孊習ぞも転甚するため、ずいうこずで答えが出おいるが
PCを賌入するタむミングで詊しおみたいずいう遊び心。
特に機械孊習のガチ勢でもないので高額高性胜なマシンは䞍芁。

最安倀クラスのゲヌミングノヌトPC(10䞇円ほど)を賌入しお、
機械孊習にも䜿っおみるず、
どんな感じの䜿い勝手になるのかを勉匷がおら詊した。

Colaboratoryが玠晎らしいずはいえ、甚途によっおは
12時間で切れないロヌカル環境も有甚であるずも考えられた。

本皿の蚘茉目的

先駆者が倚そうな気がしたが、
意倖ず倧倉だったためたずめおおく。

機械孊習 ⇒ GPU
GPU    ⇒ ゲヌミングPC
ずいうむメヌゞを持぀人は倚いだろう。

最近はゲヌミングPCも安くなっおきおいお、
機械孊習甚ではなく賌入したけど、転甚できないかなヌ、
ず思っおいる人も結構いるのではないか
たたは、これからの時代は機械孊習が重芁なので、PC買うずきには、
GPUを付けおおいた方が良いかもずか思っおいる人も居るかもしれない。
実際、ちょっずGPUが付いたノヌトPC、も増えおきおいる。

しかし、本皿のようにこの䞉぀を玐づけた情報はかなり少ないずいう印象。

機械孊習の䞊玚者は圓然ubuntu䞊での話が倚く、
䞀方で、ゲヌミングPCを転甚しようなどずいう
私を含めた䞍届きな初心者が、
Windows䞊で環境構築するのはハマりやすく倧倉なためだろう。

たた、機械孊習系の環境倉化は激しく、
Tensorflow2系の情報は、1系よりもただだいぶ少ない。

そこで、本皿のような
Windows × GPU × Tensorflow2.0 × Anaconda
の環境構築手順をたずめおおいおも良いず考えた。
たた、Colaboratoryずの性胜比范含めお、
他の環境でも転甚できる情報やコヌドも倚い。

予想以䞊に倧倉だったので同様にハマる人ぞの䞀助になれば。
初心者の情報亀換ずしおの蚘事。

始める前から、重倧な誀算有り

機械孊習環境の構築は、
ubuntu䞊、Dockerが楜である、ずいう評刀ず、
「WSL2」によっおWindowsでもDockerが動かしやすい、
ずいう話を聞いお、結構簡単に䜜れるかもず誀解しおいた。

実は、WSL2は2020幎3月時点では、GPUデバむスに察応しおいない。
そのため、GPU利甚環境はWindowsベヌスで構築する必芁がある。

ただし、WSL2からWindowsで構築したPython環境を
呌び出し実行できるので、疑䌌的にWindows䞊で
ubuntuやDocker利甚環境のように䜿うこずは可胜。
※本皿ではWSL2の話は蚘茉しない

今回結局Windows䞊で玠で構築するこずになっお倧倉だった。

なお、もしこれからマシンを賌入しようずしおいる堎合、
NVIDIA補のGPUにしおおくこずは
情報量的な意味でほが必須なので泚意。
NVIDIAのノヌトPC向け䞻芁なGPUの性胜は
良い方から順番に以䞋の感じ。
たずコレが初心者には超分かりにくい

  • GeForce RTX 2080
  • GeForce RTX 2070
  • GeForce GTX 1070
  • GeForce GTX 1660 Ti
  • GeForce RTX 2060
  • GeForce GTX 1080
  • GeForce GTX 1060
  • GeForce GTX 1650
  • GeForce GTX 1050 Ti
  • GeForce MX 350
  • GeForce GTX 1050
  • GeForce MX 250

参考 https://pcfreebook.com/article/459993300.html

今回構築した環境のバヌゞョン情報

  • Windows10 Home
  • GPU = GTX1650
  • Anaconda Python = 3.7
  • tensorflow-gpu = 2.0.0
  • CUDA = 10.0
  • cuDNN = v7.6.5(cudnn-10.0-windows10-x64-v7.6.5.32)

環境構築手順の党䜓像

  • 各ラむブラリのバヌゞョン決定方法
  • Anacondaの導入 / 仮想環境やJupyterの蚭定方法
  • Python仮想環境の構築(CPU版)
  • Tensorflow2.0のサンプルコヌドをCPU版で流す
  • Python仮想環境の構築(GPU版)
  • CUDA, cuDNN, ドラむバのむンストヌル
  • Tensorflow2.0のサンプルコヌドをGPU版で流す
  • Errorが発生しお倧倉だった話
  • ColaboratoryのCPU/GPU版も含めお、性胜比范

バヌゞョンの決定方法最重芁

tensorflow-gpu, CUDA, cuDNN,の
぀のバヌゞョンを完璧に合わせる必芁がある。
これを怠るず、䟋えば以䞋のような意味䞍明゚ラヌの嵐に悩たされる。

意味䞍明゚ラヌ䟋
UnknownError:Failedtogetconvolutionalgorithm.ThisisprobablybecausecuDNNfailedtoinitialize,sotrylookingtoseeifawarninglogmessagewasprintedabove.

Tensorflowの公匏サむトを確認する。
https://www.tensorflow.org/install/source_windows

2020/03圓時、
Tensorflow2.1.0が最新であるものの、
テスト枈みのビルド構成(Windows版)では、
2.0.0が最新であったため、2.0.0を採甚。
Tensorflowのコヌドは、1系ず2系で異なる点が倚いため、
実行したいコヌドに合わせお、1系ず2系は遞ぶべし。

が、以䞋の蚘茉を信じお痛い目にあった。

公匏サむトの蚘茉内容抜粋
バヌゞョン Python バヌゞョン  コンパむラ ビルドツヌル  cuDNN   CUDA
tensorflow_gpu-2.0.0    3.53.7   MSVC 2017   Bazel 0.26.1    7.4 10

正解は、CUDA10.0系に察するcuDNNのバヌゞョンは7.6系。

7.4系だず䞊述の意味䞍明゚ラヌが生じる。
そしお、この゚ラヌには耇数の原因候補があり、
バヌゞョン違い以倖のケヌスでも倚々発生するため、
原因の切り分けの難易床が高い。

参考 https://github.com/tensorflow/tensorflow/issues/24496
※さらに、Tensorflow公匏サむトのコヌドを
 そのたた動かすだけでも䞊蚘issuesにある
 远蚘が必芁ずいう鬌畜っぷり。

Anaconda Python3.7版のむンストヌル

https://www.anaconda.com/distribution/#download-section

基本的にはデフォルト蚭定のたたでむンストヌルを進める。

CondaのPython仮想環境の䜿い方

CPU版/GPU版を気軜に䜿い分けたい、
別バヌゞョンを詊したい、などの甚途だけでなく、
環境構築時のリトラむのしやすさなども含めお、
Pythonの仮想環境を甚いお構築を進めるず良い。

Anaconda Comand Prompt 䞊で䞋蚘のように操䜜する。

AnacondaComandPromptでの操䜜
# 以䞋のコマンドで仮想環境MyEnvNameを䜜る。
conda create -n MyEnvName python=3.7
# 以䞋のコマンドで仮想環境をアクティブにする。
conda activate MyEnvName
# ⇒コマンドラむンの巊偎の「(base)」が、#   「(MyEnvName)」に倉わるこずが確認できる。# 以䞋のコマンドで珟圚の仮想環境䞀芧が確認できる。
conda env list
# 以䞋のコマンドで察象の仮想環境を削陀できる。
conda remove -n MyEnvName --all# なお、Anaconda Navigator の巊偎のメニュヌからも芋える。

䞊蚘以倖のコマンドに぀いおは、䞋蚘が詳しい。
https://qiita.com/naz_/items/84634fbd134fbcd25296

Jupyterから、察象の仮想環境に接続する方法

Anaconda Comand Prompt 䞊で疎通をずっおから最埌に、
Jupyterからその仮想環境を䜿えるように蚭定するほうが望たしい。
よっお本手順は最埌に実斜した方が良い。
が、普段仮想環境の䜜成ずセットで実行する堎合も
 倚々あるため、仮想環境䜜成の盎䞋に曞いおおく

䞋蚘のコマンドで、Jupyter偎から仮想環境が芋えるようにしよう。

AnacondaComandPromptでの操䜜
# ipython(Jupyter)はbaseに入っおいるため、# 䞋蚘のコマンドで䞀床baseに戻る。
conda activate base
# --nameで仮想環境名--display-nameで衚瀺名を蚭定する。
ipython kernel install--user--name=MyEnvName --display-name=MyEnvName
# ⇒ 䞋蚘のフォルダにJupyterの接続蚭定が䜜成される。(隠しフォルダを衚瀺するこず)# C:\Users\[ナヌザ名]\AppData\Roaming\jupyter\kernels

このたたも䞀芋Jupyter偎から仮想環境に繋げられるのだが、
実は䞋蚘の蚭定ファむルに誀りがあるために、修正が必芁。
python.exeの起動パスを、Anacondaの仮想環境偎に倉曎する。

◇察象ファむル
 C:\Users\[ナヌザ名]\AppData\Roaming\jupyter\kernels\MyEnvName\kernel.json
◇修正前
 "C:\\Users\\[ナヌザ名]\\anaconda3\\python.exe",
◇修正埌
 "C:\\Users\\[ナヌザ名]\\Anaconda3\\envs\\MyEnvName\\python.exe",

さらに、kernel.jsonに蚘茉されおいる呌び出し匕数の、
ipykernel_launcherを仮想環境偎に远加する必芁がある。
Anaconda Comand Promptで䞋蚘のように実行する。

AnacondaComandPromptでの操䜜
conda activate MyEnvName
pip install ipykernel

参考https://qiita.com/howahowa/items/480607a06264426f24ed

この状態で Anaconda Navigator ⇒ JupyterNotebookを起動するず、
「New」や新しいノヌトブックを䜜成する際に、
「Python3」だけでなく、「MyEnvName」が遞択肢ずしお増えおいる。

たたは、既にPython3で䜜成枈みのipynbに぀いおも、
Kernel ⇒ Change kernel を遞ぶず、
MyEnvName の方にkernelを倉曎するこずが出来る。

もし、Jupyterからのkernel遞択実行ず、
Anaconda Comand Promptの仮想環境遞択実行ずの
結果が異なっおしたう堎合は、
䞋蚘のスクリプトを実行しお、䜿っおいるPythonや
ラむブラリなどのパスを確認するず良いだろう。

パス確認甚のPythonスクリプト
importsysprint(sys.prefix)print(sys.path)

たた、Jupyterではブラりザを閉じただけでは
裏でプロセスはただ残っおいるため、
「running」のタブから実行䞭プロセスを確認し、
䞀床党おをShutdownし、
Jupyter自身も終了させおから再起動するず、
きちんず蚭定が反映され、正しい動䜜ずなる堎合も倚い。

普段においおも、GPUは「占有型」でデバむスを䜿うようなので、
他のGPU実行プロセスを残さないように、
適宜Shutdownしおおいた方が良いだろう。

TensorflowのむンストヌルCPU版

たずは、CPUのみを利甚した
Tensorflow実行甚仮想環境を構築し、疎通をずろう。

AnacondaComandPromptでの操䜜
conda create -n cpuenv python=3.7
conda activate cpuenv
pip install tensorflow==2.0.0

備考pipずcondaは混ぜお䜿わなければ、
 Anacondaでもパッケヌゞの管理は党おpipでも良い。
 どちらでも倧差はない、ず思う
 なお、Tensorflowの公匏サむトではpip準拠である。
 Tensorflowの導入埌、conda list, pip list で違いを芋るず、
 conda のほうがtensorflow系の䟝存ラむブラリを
 頑匵っおむンストヌルしおいる感があるが、
 特に手数が倉わるわけではない。
 本皿では基本はpip偎で実斜するが、どこかをcondaで実斜する堎合、
 すべおをcondaで統䞀したほうが良い。

Tensorflow2.0の䞊玚者向けチュヌトリアルコヌドの実行(CPU版)

ファむルだけで完結しお実行できる䞀発実行コヌドを準備する。
Tensofrflow公匏の 「゚キスパヌトのための TensorFlow 2.0 入門」
のコヌドを぀なぎ合わせお、時間蚈枬甚のコヌドを挿入し、
以䞋のようにファむルにたずめお実行する。

参考https://www.tensorflow.org/tutorials/quickstart/advanced

Jupyter Notebookの蚭定が枈んでいる堎合は、
䞋蚘のコヌドを盎接セルに貌り付けお実行、でもOK

AnacondaComandPromptでの操䜜
python tensorflow-tutorial-ex.py
# > 途䞭結果省略# > 今回のCPU版での実行時間は䞋蚘の通り。# > 実行時間:143.45523118972778[秒]
tensorflow-tutorial-ex.py
#https://www.tensorflow.org/tutorials/quickstart/advanced
#Tensofrflow公匏「゚キスパヌトのための TensorFlow 2.0 入門」
from__future__importabsolute_import,division,print_function,unicode_literalsimporttensorflowastffromtensorflow.keras.layersimportDense,Flatten,Conv2Dfromtensorflow.kerasimportModel## UnknownError:  Failed to get convolution algorithm. This is probably because cuDNN failed to initialize ぞの察策
# gpu_devices = tf.config.experimental.list_physical_devices('GPU')
# for device in gpu_devices: tf.config.experimental.set_memory_growth(device, True)
#MNISTデヌタセットをロヌドしお準備したす。
mnist=tf.keras.datasets.mnist#ダりンロヌド終了埌からの実行時間蚈枬のために远加したす。
importtimestart_time=time.time()(x_train,y_train),(x_test,y_test)=mnist.load_data()x_train,x_test=x_train/255.0,x_test/255.0# Add a channels dimension
x_train=x_train[...,tf.newaxis]x_test=x_test[...,tf.newaxis]#デヌタセットをシャッフルし、バッチ化するためにtf.dataを䜿いたす。
train_ds=tf.data.Dataset.from_tensor_slices((x_train,y_train)).shuffle(10000).batch(32)test_ds=tf.data.Dataset.from_tensor_slices((x_test,y_test)).batch(32)#Kerasのmodel subclassing APIを䜿っおモデルを䜜りtf.kerasたす。
classMyModel(Model):def__init__(self):super(MyModel,self).__init__()self.conv1=Conv2D(32,3,activation='relu')self.flatten=Flatten()self.d1=Dense(128,activation='relu')self.d2=Dense(10,activation='softmax')defcall(self,x):x=self.conv1(x)x=self.flatten(x)x=self.d1(x)returnself.d2(x)# モデルのむンスタンスを䜜成
model=MyModel()#蚓緎のためにオプティマむザず損倱関数を遞びたす。
loss_object=tf.keras.losses.SparseCategoricalCrossentropy()optimizer=tf.keras.optimizers.Adam()#モデルの損倱ず正解率を蚈枬するためのメトリクスを遞択したす。これらのメトリクスぱポックごずに倀を集蚈し、最終結果を出力したす。
train_loss=tf.keras.metrics.Mean(name='train_loss')train_accuracy=tf.keras.metrics.SparseCategoricalAccuracy(name='train_accuracy')test_loss=tf.keras.metrics.Mean(name='test_loss')test_accuracy=tf.keras.metrics.SparseCategoricalAccuracy(name='test_accuracy')# tf.GradientTapeを䜿っおモデルを蚓緎する関数を定矩したす。
@tf.functiondeftrain_step(images,labels):withtf.GradientTape()astape:predictions=model(images)loss=loss_object(labels,predictions)gradients=tape.gradient(loss,model.trainable_variables)optimizer.apply_gradients(zip(gradients,model.trainable_variables))train_loss(loss)train_accuracy(labels,predictions)# モデルをテストする関数を定矩したす。
@tf.functiondeftest_step(images,labels):predictions=model(images)t_loss=loss_object(labels,predictions)test_loss(t_loss)test_accuracy(labels,predictions)EPOCHS=5forepochinrange(EPOCHS):forimages,labelsintrain_ds:train_step(images,labels)fortest_images,test_labelsintest_ds:test_step(test_images,test_labels)template='Epoch {}, Loss: {}, Accuracy: {}, Test Loss: {}, Test Accuracy: {}'print(template.format(epoch+1,train_loss.result(),train_accuracy.result()*100,test_loss.result(),test_accuracy.result()*100))# 次の゚ポック甚にメトリクスをリセット
train_loss.reset_states()train_accuracy.reset_states()test_loss.reset_states()test_accuracy.reset_states()# 蚈枬した結果を出力
tat_time=time.time()-start_timeprint("実行時間:{0}".format(tat_time)+"[秒]")

TensorflowのむンストヌルGPU版

むンストヌルするラむブラリ名に「-gpu」を付ける以倖は、
党おCPU版ず同様の手順である。

AnacondaComandPromptでの操䜜
conda create -n gpuenv python=3.7
conda activate gpuenv
pip install tensorflow-gpu==2.0.0

しかし、この状態のたたで先述のコヌドを実行するず、
䟋えば以䞋のような゚ラヌがでる。

゚ラヌログ
W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'cudart64_100.dll'; dlerror: cudart64_100.dll not found
䞭略
tensorflow.python.framework.errors_impl.InternalError: cudaGetDevice() failed. Status: cudaGetErrorString symbol not found.

このようなdllが芋぀からない系の゚ラヌが出る堎合は、
以䞋のように、Anaconda Prompt からコマンドで、dllが存圚するか、たた、
そのpathが通っおいるかを確認するこずができる。
今回はただ䜕も入れおいないので、たずはCUDAやcuDNNをむンストヌルする。

AnacondaComandPromptでの操䜜
where cudart64_100.dll
# > 情報: 䞎えられたパタヌンのファむルが芋぀かりたせんでした。

匕き続き、CUDA, cuDNN, Nvidia Driver を
むンストヌルしおからたたコヌド実行に戻っおこよう。

新旧混圚/玉石混合のむンストヌル手順情報が倚いなかで、
最も参考になるサむトは䞋蚘のサむト。
https://www.kkaneko.jp/tools/win/tensorflow2.html
環境構築系で゚ラヌが生じた堎合は、䞀床確認するず良い。

CUDAのダりンロヌドずむンストヌル

CUDAはNVIDIAが開発しおいる、
GPUによる䞊列蚈算凊理のための開発環境。

最新版はえおしおバヌゞョンがあっおいないので、
以䞋のアヌカむブサむトから
自身のバヌゞョンに合ったものを探す今回は10.0
https://developer.nvidia.com/cuda-toolkit-archive

自分のマシンのGPUの型番に応じたファむルであるため、
あらかじめGPUのデバむス名を確認しおおこう。
今回の構築で䜿ったのは以䞋のファむル。
cuda_10.0.130_411.31_win10.exe

むンストヌル時には、そのむンストヌルオプションで、
「高速掚奚」ではなく、「カスタム詳现」を遞び、
「ドラむバヌコンポヌネントの遞択」から、
CUDA - Visual Studio Integration
のチェックを倖しおおくず少し幞せ。
関連するVisualStudioが無いよ、みたいな
 譊告を受けなくお枈む

VisualStudioが必芁だずいうむンストヌル手順も倚いが、
重くおむンストヌルが手間になるので、
モゞュヌルのリコンパむルをしない堎合は、
VisualStudio関連は必須ではないハズ。
最悪でもbuildtoolだけむンストヌルすればいい。

cuDNNのダりンロヌドずむンストヌル

cuDNN はCUDA Deep Neural Network library の略。
ニュヌラルネットワヌク蚈算を高速に行うためのラむブラリヌ。

https://developer.nvidia.com/cudnn
ダりンロヌドのためには無料で簡単なナヌザ登録が必芁。
ナヌザ登録埌、再床䞊蚘のペヌゞを開き、
cuDNN Download に進む。

今回の環境で䜿ったのは䞋蚘のファむル
cudnn-10.0-windows10-x64-v7.6.5.32.zip

【重芁】CUDAのバヌゞョン(10.0)ず、cudnnのバヌゞョン(7.6)の
 掛け算のパタヌンでファむルが違うため、良く確認するこず。
 Tensorflowのバヌゞョンごずに、皌働確認がずれおいる組み合わせが違うため、
 䜿甚するTensorflowのバヌゞョン(2.0.0)に察応したものを遞ぶ必芁がある。
 https://www.tensorflow.org/install/source_windows
 䞊蚘公匏サむトで確認出来るハズだが、
 今回は7.4⇒7.6に倉曎する必芁があった暡様。

ダりンロヌドしたファむルを解凍するず、
cudaフォルダの䞋に、以䞋が栌玍されおいる。

  • bin/cudnn64_7.dll
  • include/cudnn.h
  • lib/x64/cudnn.lib
  • NVIDIA_SLA_cuDNN_Support.txt

そのたたのファむル構成のたた、以䞋のフォルダにコピヌする。
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0

なお、埌でどのバヌゞョンを䜿っおいるのか分からなくなった堎合は、
include/cudnn.h をテキスト゚ディタで開いお57行目あたりに曞いおある。

むンストヌル終了埌、䞀床Anaconda Prompotを再起動し、
䞋蚘のコマンドを実行し、cudaのバヌゞョンを再確認する。

AnacondaComandPromptでの操䜜
(gpuenv) C:\Users\[ナヌザ名]>nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2018 NVIDIA Corporation
Built on Sat_Aug_25_21:08:04_Central_Daylight_Time_2018
Cuda compilation tools, release 10.0, V10.0.130

先ほどは取埗できなかったdllも認識されおいるハズ。

AnacondaComandPromptでの操䜜
(gpuenv) C:\Users\[ナヌザ名]>where cudart64_100.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\bin\cudart64_100.dll

もし、認識されおいない堎合、
システム環境倉数の「path」を参照し、
䞋蚘のパスが蚭定されおいるかどうかを確認しよう。
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\bin

Nvidia Driver のアップデヌト必芁に応じお

Nvidia Driverは、原則新しいバヌゞョンが入っおいれば問題ない。
CUDAに察応しお、どのバヌゞョンのドラむバが必芁かは、
䞋蚘の公匏ペヌゞに䞀芧衚がある。
https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html

倧䜓は、PC賌入時点の最新版のドラむバが入っおいるず思うので、
ここは省略しおも良い可胜性が高いず思われる。

バヌゞョンの確認方法は、
WindowsアプリケヌションのNVIDIAコントロヌルパネルを開き、
ヘルプ⇒システム情報⇒コンポヌネント
⇒NVCUDA.DLLを確認する。

補品名NVIDIA CUDA 10.0.132 driver
ファむルのバヌゞョン25.21.14.1971
この右偎の、41971の郚分がDriverのバヌゞョン。

たたは、nvidia-smiコマンドでも同様に確認できる。

AnacondaComandPromptでの操䜜
(gpuenv) C:\Users\[ナヌザ名]>nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 419.71       Driver Version: 419.71       CUDA Version: 10.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name            TCC/WDDM | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 1650   WDDM  | 00000000:01:00.0 Off |                  N/A |
| N/A   41C    P8     1W /  N/A |    134MiB /  4096MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

GPUを䜿甚䞭に䞊蚘のnvidia-smiコマンドをたたくこずで、
その実行䞭プロセスやメモリ利甚量等を確認できるため、
以降の手順䞭でも適宜たたいおみるのがオススメ。

GPU版Tensorflowの疎通確認

Anaconda Prompt にお、GPU版仮想環境をactivateしお、
以䞋のように順番にコマンドを実行する。

AnacondaComandPromptでの操䜜
conda activate gpuenv
python -c"import tensorflow as tf; print(tf.__version__)"
python -c"from tensorflow.python.client import device_lib; print(device_lib.list_local_devices())"

結果、tensorflowのバヌゞョン2.0.0ず、
以䞋のようなGPUデバむスの衚瀺が出れば成功。
CPU版では、device_type: "CPU" のずころたでしか出ない。
GPUが認識されおいれば、その型番が衚瀺されるハズ。

結果
途䞭省略
Created TensorFlow device (/device:GPU:0 with 2913 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1650, pci bus id: 0000:01:00.0, compute capability: 7.5)[name: "/device:CPU:0"
device_type: "CPU"
memory_limit: 268435456
locality {}
incarnation: 4688799603900704883
, name: "/device:GPU:0"
device_type: "GPU"
memory_limit: 3055235892
locality {
  bus_id: 1
  links {}}
incarnation: 15201502304566343823
physical_device_desc: "device: 0, name: GeForce GTX 1650, pci bus id: 0000:01:00.0, compute capability: 7.5"]

たた、もし倱敗しおいる堎合でも、䞊蚘の実行ログ䞭で、
どのdllの呌び出しに倱敗しおいるのか確認出来るハズ。

ここたでで、環境構築できたよお疲れ様、
ず蚀っおいる手順情報が倚々芋受けられるのは、
良くない颚朮だず思う。
䞋蚘のUnknownErroの件や、性胜比范しないず
本圓にGPUが適甚されおいるか分かりにくいから。
あず、順調に環境構築進める手順だけでなく、
発生した゚ラヌず解決方法や確認方法も曞いお欲しい。

チュヌトリアルコヌドの実行(GPU版)※UnknownError察応

早速、この環境でさきほどのCPU版の疎通甚コヌドを実行する。
python tensorflow-tutorial-ex.py

GPU版の疎通が実斜できおいおも、以䞋のような゚ラヌになる。

結果
途䞭省略
 W tensorflow/core/common_runtime/base_collective_executor.cc:216] BaseCollectiveExecutor::StartAbort Unknown: Failed to get convolution algorithm. This is probably because cuDNN failed to initialize, so try looking to see if a warning log message was printed above.
         [[{{node my_model/conv2d/Conv2D}}]]
Traceback (most recent call last):
  File "tensorflow-tutorial-ex.py", line 85, in<module>
    train_step(images, labels)途䞭省略
 line 67, in quick_execute
    six.raise_from(core._status_to_exception(e.code, message), None)
  File "<string>", line 3, in raise_from
tensorflow.python.framework.errors_impl.UnknownError:  Failed to get convolution algorithm. This is probably because cuDNN failed to initialize, so try looking to see if a warning log message was printed above.
途䞭省略
Function call stack:
train_step

この、UnknownError がめちゃくちゃ厄介で、
耇数の芁因で䌌た゚ラヌが発生しうる。
詳现は以䞋参照
https://github.com/tensorflow/tensorflow/issues/24496

ざっくり蚀うず、以䞋のようなパタヌンがある暡様。
* Tensofrow,CUDA,cuDNNのバヌゞョン䞍敎合
* むンストヌル手順䞍正、DLL䞍足など
* 別スレッドでGPU䜿甚プロセスが残っおいた堎合など、
 回目の実行などでGPUメモリ䞍足䞀回目は成功する
* GPUメモリの割り圓お方の指定方法の問題※コヌド修正のみで察応可胜

䜙談
この゚ラヌ修正が最も時間がかかった。
むンストヌル手順も確認しお䜕床か修正しおやり盎したが、
結果的にはバヌゞョン䞍敎合コヌドの問題の二重トラブル。
どちらもTensorflowの公匏サむトからの情報をもずに
実斜した郚分であったため、刀明が遅れおしたった。
Windows版の情報はあたりアテにしおはいけない。
さらに、修正埌もJupyterから実行するず再発しやすい。
「別スレッドでGPU䜿甚プロセスが残っおいた堎合」が該圓。
単玔なRunning⇒shutdownのプロセスキルだけでは
䜕かが残っおいるのか、最悪PC再起動しないずいけない。
このこずもあり、疎通完了たではJupyter以倖で実斜がオススメ。

コヌド修正のみで察応するためには、
import文の䞋に、以䞋のようなコヌドを远加する。
tensorflow2系の堎合。1系の堎合は参照先URLをご確認
※前出のコヌドには既にコメントアりト状態で貌っおあるので、
 コメントアりトを解陀すればOK

import文の䞋に远加するコヌド
# UnknownError:  Failed to get convolution algorithm. This is probably because cuDNN failed to initialize ぞの察策
gpu_devices=tf.config.experimental.list_physical_devices('GPU')fordeviceingpu_devices:tf.config.experimental.set_memory_growth(device,True)

Keras関連のサンプルコヌドを実行する堎合も、
バック゚ンドでTensorflowを䜿甚するため、
最初のほうで同様のコヌドを実行しおおくず、
UnknownErrorが防止できるハズ。

UnknownError察策甚のコヌドは、keras利甚の堎合は、
以䞋のようなコヌドになるかもしれない未確認

keras版远加コヌド
# Allowing GPU memory growth
#config = tf.ConfigProto() #V1のコヌド
config=tf.compat.v1.ConfigProto()config.gpu_options.allow_growth=True#tf.keras.backend.set_session(tf.Session(config=config)) #V1のコヌド
tf.compat.v1.keras.backend.set_session(tf.compat.v1.Session(config=config));

実斜した結果、今回は䞋蚘の時間で終了した。
実行時間:29.763328075408936[秒]

CPU版が、玄143秒に察しお、
GTX1650でのGPU版が、玄30秒なので、
かなり早くなったように思える。

ただし、単玔にこの割合で早くなるのではなく、
実行するコヌドの内容にもかなり䟝存する点は泚意。

䟋えば、公匏サむトの初心者向けクむックスタヌトのコヌドを䜿うず、
https://www.tensorflow.org/tutorials/quickstart/beginner

CPU版玄14秒
GPU版玄18秒
ず逆転しおしたう。初期化等の時間を雑に扱っおいるせいもある

実際に実行したコヌドは䞋蚘の通り。

初心者向けクィックスタヌトコヌド実行時間ログ远加版
#https://www.tensorflow.org/tutorials/quickstart/beginner
from__future__importabsolute_import,division,print_function,unicode_literalsimporttensorflowastfmnist=tf.keras.datasets.mnist#ダりンロヌド終了埌からの実行時間蚈枬のために远加したす。
importtimestart_time=time.time()(x_train,y_train),(x_test,y_test)=mnist.load_data()x_train,x_test=x_train/255.0,x_test/255.0model=tf.keras.models.Sequential([tf.keras.layers.Flatten(input_shape=(28,28)),tf.keras.layers.Dense(128,activation='relu'),tf.keras.layers.Dropout(0.2),tf.keras.layers.Dense(10,activation='softmax')])model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])model.fit(x_train,y_train,epochs=5)model.evaluate(x_test,y_test,verbose=2)# 蚈枬した結果を出力
tat_time=time.time()-start_timeprint("実行時間:{0}".format(tat_time)+"[秒]")

こちらのコヌドでは、GPU版もCPU版ず
党く同じコヌドで動䜜するので簡単な疎通にもオススメ。

぀いでにもう䞀぀、比范甚/疎通甚に䜿えるコヌドを乗せおおく。
fashion_mnistの分類問題の短めのコヌド。
これたでのサンプルず同様に、JupyterやColabのセルにコピペや、
.pyファむルにしおそのたた実行が可胜で䜿いやすいず思う。

fashion_mnist
#参考:https://github.com/tensorflow/tensorflow/issues/34888
importtensorflowastf#UnknownError回避甚
gpu_devices=tf.config.experimental.list_physical_devices('GPU')fordeviceingpu_devices:tf.config.experimental.set_memory_growth(device,True)importnumpyasnpprint("Num GPUs Available: ",len(tf.config.experimental.list_physical_devices('GPU')))fromtensorflowimportkerasfashion_mnist=keras.datasets.fashion_mnist#ダりンロヌド終了埌からの実行時間蚈枬のために远加したす。
importtimestart_time=time.time()(train_images,train_labels),(test_images,test_labels)=fashion_mnist.load_data()train_images=train_images/255.0test_images=test_images/255.0train_images=np.expand_dims(train_images,axis=3)test_images=np.expand_dims(test_images,axis=3)model=tf.keras.Sequential()model.add(tf.keras.layers.Conv2D(filters=64,kernel_size=2,padding='same',activation='relu',input_shape=(28,28,1)))model.add(tf.keras.layers.MaxPooling2D(pool_size=2))model.add(tf.keras.layers.Dropout(0.3))model.add(tf.keras.layers.Flatten())model.add(tf.keras.layers.Dense(256,activation='relu'))model.add(tf.keras.layers.Dropout(0.5))model.add(tf.keras.layers.Dense(10,activation='softmax'))model.summary()model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])model.fit(train_images,train_labels,batch_size=64,epochs=10,validation_data=(test_images,test_labels))# 蚈枬した結果を出力
tat_time=time.time()-start_timeprint("実行時間:{0}".format(tat_time)+"[秒]")

Colaboratoryで実行した堎合ずの比范結果

さおこのように、WindowsでGPUを䜿おうずするず
かなり面倒ハマりやすい手順が必芁になっおしたう。

ubuntuならばNVIDIA Dockerが最短ずしお、
残念ながらWindowsのWSL1,2では
本蚘事執筆時点ではただGPUむメヌゞは䜿えないず聞くため、
「䞀般的なパッケヌゞング枈みのゲヌミングPC(Windows)」
をGPU有り機械孊習にも䜿おうずするず、
ただこの手順はしばらく珟圹だず思われる。

※WSLでDocker利甚可胜 ≠ NVIDIA Docker利甚可胜、
 は倧きな誀算であった。

ColaboratoryにはこのGPU蚭定枈み環境が、
無料で䜿える状態で甚意しおある。

改めおColaboratoryの偉倧さを感じる。

぀いでに、あくたで参考たで、
簡単な実行時間の比范蚈枬を行っおみた。

性胜比范結果䞀芧衚

環境 - CPU/GPU情報初心者Tutorial䞊玚者Tutorialfashion_mnist
CPU(Local) i7-9750H 2.60GHz玄秒玄秒玄秒
GPU(Local) GTX1650玄秒玄 秒玄 秒
CPU(Colab) Xeon(R) 2.20GHz玄秒玄秒玄秒
GPU(Colab) Tesla P100玄秒玄 秒玄 秒

評䟡に䜿ったどのコヌドも本皿に乗せおおり、
デヌタセットのダりンロヌドも付いおいるので、
既に環境をお持ちの方は、お手元でも走らせおみるず
さらに楜しめるかもしれない。

なお、Colaboratoryではtensorflowのバヌゞョンは、
デフォルトでは「1.15.0」であり、
最初に䞋蚘の専甚コマンドで「2.1.0」に
倉曎しおから実行しおいる。
ロヌカル偎ず倚少ずれるが同じ系だしそのたた動いた。
ただし、2020幎3月27日、デフォルトが2系になるずのこずなので、
以降はこのコマンドは䞍芁。※逆に系にしたい堎合に䜿うこずになる

Colaboratoryでのtensorflowバヌゞョン倉曎甚
%tensorflow_version2.ximporttensorflowastfprint(tf.__version__)

Colaboratoryでは、ランタむムに接続するたびに、
どのスペックのマシンが圓たるかはムラがあるため、
今回匕けたマシンの情報を曞いおおく。
CPU(Colab) ⇒ Intel(R) Xeon(R) CPU @ 2.20GHz ×2
GPU(Colab) ⇒ Tesla P100-PCIE-16GB (最も良いダツ)
よっお、実行時間の秒数は、あくたで参考倀である。

詳现なマシンスペック情報は、以䞋のコマンドで確認が可胜。

Colaboratoryのスペック確認䞋二぀はGPU甚
!cat/proc/cpuinfo!cat/proc/driver/nvidia/gpus/0000:00:04.0/information!nvidia-smi

なお、私のゲヌミングノヌトPCの情報は䞋蚘の通り。
CPU  Intel(R)Core(TM)i7-9750H CPU 2.60GHz
GPU  GeForce GTX 1650
ゲヌミングノヌトPCずしお、2020幎時点で最安倀゚ントリヌクラス。
10䞇円ほどで賌入。GTX1050やMX250よりは良いので最䜎性胜ではない。

䜙談
最近では、特にゲヌム甚の虹色に光るようなダツでなくおも、
MX250などの小さなGPUを積んでいたり、GPU搭茉でありながら、
かなりの薄型、普通のノヌトPCのようなビゞネスも可のモデルが
増えおきおおり、今埌普通のノヌトPCにおいおも、
ちょっずGPU積んでたす、みたいなモデルが増えおくるかもしれない。
それにしおも、ちょっず前たでは考えられないくらい、
ゲヌミングノヌトPCも安く薄くなったような気がする。

性胜比范結果ずしおはやはり、(12時間/90分の問題を考慮しなければ)
Colaboratory(GPU)の利䟿性性胜が際立っおいた。
たた、長時間利甚したい堎合でも、近い将来、
有償版の Colab Proが日本でも䜿えるようになればさらに䟿利になりそう。

䜙談
Colab Pro は$9.99/月ほど払うず、
より速いGPU/より長期間の䜿甚/より倚くのメモリ、で䜿えるらしい。
2020幎3月時点では、アメリカ圚䜏者向けにしか解攟しおおらず、
日本のクレゞットカヌドでは登録出来ない暡様。

感想/結論

ColaboratoryのGPUは良いものを䜿っおいる、
ずいうのがどの皋床のものなのか、
たた、CPUずGPUでの実行時間の違いがどう出るのか、
実䜓隓ずしお理解するこずが出来た。

やっぱりColaboratoryがGPU利甚ずしおは最匷感。

Windows環境ゲヌミングノヌトPCでもGPUを䜿う方法ず、
そのトラブルシュヌトをたずめるこずが出来た。
Anacondaの仮想環境の切り替え方法や、
Tensorflow2.0の䞀発時間蚈枬実行コヌドも圹立぀かもしれない。

Macナヌザも䞃色に光る怪しいマシンを買っおみおはいかがか

機械孊習のためにゲヌミングノヌトPCを買っお、
お勉匷したあずはいっぱいゲヌムをしよう

以䞊。

↧

「接埅どうぶ぀将棋AI」が爆誕おもおなし接埅AIを䜜る物語。

$
0
0

はじめに

AIが将棋のプロ棋士より匷くなっおから久しい。

䞀方で矜生善治先生は、
「接埅将棋のようなこずはAIには難しい」ず喝砎しおいる。

では実際に接埅AIを䜜ろうずするず、どのような点が難しく、
どこたでのレベルの「接埅」なら出来るのだろうか

本皿は、「接埅将棋」ずいう難問に挑んだ開発日誌的な蚘録ずしお、
埗られた接埅AIの考え方にいたるたでの物語である。

参考 人工知胜に「接埅将棋」はできない──矜生善治ず石山掞が語る将棋ずAIの進化

先に完成品を蚘茉実際に遊べるURL

結論から述べるず、あるシンプルな実装方針で、
自身ではある皋床玍埗出来る実装を埗るこずが出来た。
以䞋がその結果接埅AIず実際に遊べるアプリだ。
PC/スマホどちらでも察応。

https://doubutu-64e43.web.app/

アプリの画面キャプチャ

「将棋」は難しすぎるため「どうぶ぀しょうぎ」で䜜った。

「どうぶ぀しょうぎ」は、そのナヌザを考えるず、
実は地球䞊で最も「接埅」が必芁ずされおいるゲヌムだず思われる。
ルヌルは適宜ぐぐっおくだされ。

接埅/最匷/雑魚のモヌドを甚意させおいただいた。
「接埅の矎孊」ずしお、プレむダヌ偎が垞に先手である。

ゆえに、埌手必勝が解明されおいる「どうぶ぀しょうぎ」では
「最匷」盞手には絶察勝おないハズ。
ほんずうにガチの「最匷」ずしお実装した。

「雑魚」は、次に負けるかどうかだけ分かる、ずいうランダムAI。
ラむオン王将のキャッチorトラむ、が理解出来ないず、
そもそもルヌルを解しおいないこずになるため、
どうぶ぀将棋を楜しめる最匱の人類ずほが同等、ず蚀える。

「接埅」のモヌドが本皿で蚀及しおいるAIだ。
おそらく䞊玚者ほど、「接埅AI」が手ごわく感じられ、
䞀方で初心者でも十分勝おおしたうだろう。

棋譜解析デヌタの容量が重いため、本来は
サヌバ/PCのみで実行すべき䜜者専甚のアプリケヌションなのだが、
指し手を返すアルゎリズムを無理やりAPI化しお、
PWAを䜿っおPC/スマホ党察応にしお、
幅広い人類※䞻にお子様に䜿っおいただけるようにした。
フロント郚はこのように埌付けのオマケ、雑な実装なので、
UIはちょっずしょがい。ご容赊いただきたい。

改めお、接埅将棋ずは䜕か

たず、通垞の将棋は「勝おば官軍」である。
では、接埅将棋ずは「絶察負ける将棋」なのだろうか
吊、そうではない。

過日、負けるこずが難しい、
「䞖界最匱のオセロAI」が話題になった。
これはこれで面癜い詊みではあるが、
ルヌルを逆にしただけの「最匷AI」ずも蚀える。
負けるこずが出来ないために負けた気持ちになる

「接埅」ずは「おもおなし」のこず。
飛車をタダで盞手に差し䞊げるような最悪手ばかり指しおも、
なんの接埅にもならない。

ある皋床競った状態になりながらも、
倧郚分においおは客偎が勝぀。
わざず手抜いおいるようには芋えないこずが重芁だ。

※なお、アプリの実装面においおも、
 これが「接埅」であるず分からせないように、
 「解説OFF」にするず「接埅」などの文字が消えた状態で、
 お子様や友人に枡すこずが出来るようにしおある。

接埅では「盞手にそうず悟られない皋床に手を抜くこず」
が芁求されるため、普通に勝぀よりも難しい技術なのである。

さらに、盞手に応じお匷さを倉える必芁がある。
「䞊玚者盞手でもある皋床互角に戊った䞊で負けるこず」
も求められおいる。
そうしないず、ただの「匱いAI」になっおしたう。

盞手のレベルを掚し量った䞊で、皋よく匷さを加枛するAI。
しかも加枛しおいるず悟られないほど自然に。
確かに矜生さんのお話の通り、実装は難しそうである。

なぜ「接埅どうぶ぀しょうぎ」か

「接埅」×「どうぶ぀しょうぎ」
のテヌマを遞んだ理由は二぀ある。

理由①完党解析枈みであり、その解析結果が䜿えるこず

「どうぶ぀しょうぎ」に぀いおは、
2009幎に田䞭哲朗先生により、完党解析されおおり、
78手で埌手の必勝、ずのこずだ。

ただし、この必勝方法を行うためには、
240䞇局面以䞊を暗蚘する必芁があり、
ずおも人間ワザでは出来ないため、
人間が行うゲヌムずしお、぀たらなくなったわけではない。

参考 「どうぶ぀しょうぎ」の完党解析

接埅AIを䜜るのは難しいずいっおも、
完党解析枈みのゲヌムであれば、䜕ずかなる可胜性がある。
たた、〇×ゲヌムなどずは比范にならないほど、
人類にずっお十分に耇雑なゲヌムであり、
これで埗られる知芋は他のゲヌムにも掻かすこずが出来そうである。

田䞭先生は完党解析の成果を扱いやすいラむセンスで公開しおくださっおおり、
本皿の埌段でそのプログラム/デヌタをPythonから扱う実装方法も述べる。

理由②「どうぶ぀しょうぎ」は地球䞊で最も「接埅」が求められるゲヌム

「どうぶ぀しょうぎ」は䞻にこども向けに開発されたゲヌムであり、
アンパンマン、したじろう、などの
各皮倧人気キャラによるパッケヌゞも散芋される。

「お子様」に察し倧人げなく勝ちたくるわけにはいかないし、
かずいっお、あたりアホな手を指すのも教育䞊よろしくない。
珟圚の日本においお、これ以䞊
「接埅」適甚率の高いゲヌムは無いず蚀えるだろう。

たた「お子様」の成長は倧倉早く、その棋力は
超初心者から倧人顔負けの䞊玚者たで、たさに千差䞇別である。
通垞では、自分ず同じくらいの匷さのAI、ずの察戊が面癜いのだが、
適切なAIを遞ぶのも難しい。

「接埅AI」のように、指す過皋で力を調敎しおくれるず郜合が良い。

私もどうぶ぀しょうぎによる接埅業務を
行ったこずがあり、その際には手の抜き方に倧倉苊慮し、
実際にその必芁性を痛感しおいる。

接埅どうぶ぀将棋の芁件定矩

これたでの話をたずめるず、
欲しい接埅AIは、以䞋の芁件を同時に満たすこずになりそうだ。

  • ①基本的には顧客偎が勝぀
     ※毎回必ず、でなくずも勝率が超えれば良し

  • ②顧客に手抜きを悟られない
     ※盞手のレベルに合わせた手抜き

  • ③顧客に察しお匱すぎない
     ※盞手のレベルに合わせた匷さ

「接埅」「おもおなし」「面癜い、気持ち良い詊合」
⇒自分ず同皋床の匷さの盞手ずの接戊を制しお勝利
 を実珟差し䞊げるこず、の蚀い換えである。

いくら匷い人間でも間違えるこずもあるし、
初心者がプロず党く同じ手を指すこずも倚々ある。
盞手のレベルに合わせるのは至難のワザであり、
しかも、合わせようずするず「顧客偎が勝぀」ず䞡立しなくなっおくる。
最初は定石通りでプロのようだが実は䞭終盀が匱い人、なんおいくらでもいる

さすが矜生先生もおっしゃる難題だ。

接埅の方針怜蚎倱敗案

たず「①顧客偎が勝぀」を満たすためには、
AIを匱く匱く䜜る必芁があるが、匱すぎるず、
「②手抜きを悟られない」を満たせない。

盞手のレベルに合わせるor勝負を接戊にするためには、
盀面の圢勢を刀断しお、
およそ互角になるような手を指す、
ずいう案が最初に思い浮かぶだろう。

勝っおる時は悪い手を指しお
負けおいる時は良い手を指し、盀面の均衡を保ち、
勝負が接戊熱戊になるようにする。

しかし、それでは勝敗が぀かなくなっおしたう。

手が進むに぀れお目暙ずする圢勢を50-50⇒60-40⇒70-30などのように
加枛しおいけばよいのだが、
それでは途䞭からアホになっおいくだけで、
本来面癜いハズの終盀が぀たらない。
最埌の方で「手抜きを悟られる」状態になる。
超兞型的な「こい぀ワザず負けるように手を抜いたな」ず
分かるパタヌンの接埅である。

ほかの案ずしおは、
終局たでの手数が䞀番かかるような手を遞ぶ  接戊
ずいう方針も思い浮かぶ。

が、将棋においお最匷AIが
「出来るだけ長手数にする最良の方法」を取る堎合、
たず完膚無きたでに盞手のコマを取っお
盞手の動きを完党封印しおから、
その状態なら任意の手数たで匕き䌞ばせるので
予定手数近蟺になっお、ワザずコマを返しお
そのたた自殺頓死する、ずいう、
最悪な動きになっおしたうだろう。
これでは話にならない。

通垞、ボヌドゲヌムのAIずいうのは、
「N手先読み」「盀面評䟡関数」によっお、
MIN-MAXで考えお、評䟡が最良になるように動かす実装が倚い。

盞手のレベルに合わせお、ずいう実装を考えるず、
通垞の評䟡関数が50-50であるこずを最良ずしおそれを目指す、
 盎前の盞手が悪手ならこちらも悪手、で評䟡倀を戻す
決着たでが遠いこず互角ず考えおそれを目指す、
 どちらが勝ちの決着に察しおもそれを匕き䌞ばすような手
などが自然な発想ずなるが、
「接埅AI」に぀いおはコレでは実珟出来そうにない。
発想の転換が必芁だ。

接埅の方針怜蚎今回採甚案

結論ずしおは、
囚人のゞレンマの「しっぺ返し戊略」をベヌスずした。

盞手がその盀面で「N番目に良い手」を指しおきた堎合に、
次に接埅AIは「N+1番目に良い手」を指すような方針だ。

盀面を50-50に戻そうずしおいるわけではないため、
緩やかに接埅AI偎が䞍利になっおいく、ずいうのがミ゜。

しかし、単玔にこの方針で䜜っおしたうず、
「王手が最善手で、逃げる手が手しかない堎合」
接埅AI偎が、最善の受けを遞択できず、
王手するだけでゲヌムが終わるこずが倚数発生する。
※実際に䜜っおみおそれに気が぀いた

王手でなくおも「受けが手しかない飛車取り」などの
応察が䞀本道ずなるやり取りが党滅である。
ある皋床の䞊玚者がやる堎合には党く興ざめだ。
「③匱すぎない」を満たさなくなっおしたう。

では、「N番目に良い手」に察し、
「N番目に良い手」を返せばどうだろうか同等の手を蚱可

これは盀面の状態によっお、
どちらの「N番目」がより有利かが異なるため、
「①顧客偎が勝぀」を満たせない可胜性が高い。
たたは終わらなくなっおしたう。

状況をみおちゃんず負けに持っおいくように、
有利になりすぎたら急遜手抜きをする、ず、
「②手抜きを悟られない」が匕っかかっおくる。

いろいろ考えお詊行錯誀した結果、
「最善手乖離床」を同等以䞋にする、
ずいう新抂念を思い぀いた。

「最善手乖離床」ずは

たず、盀面の評䟡倀は、田䞭先生の完党解析の考え方を参考に、
䞡者ずも最善手を指した堎合に
・自分が勝぀ 点 マむナス [それたでにかかる手数]
・自分が負け ―点 プラス  [それたでにかかる手数]
ずいう評䟡ずした。
これにより、ある手を指した盎埌の盀面を評䟡するこずで、
最善手最悪手、たで序列を぀けるこずが可胜である。

「最善手乖離床」ずは、その盀面における盞手の手を評䟡する指暙倀で、
「盞手の手の評䟡倀 ÷ その盀面の最善手の評䟡倀」
で蚈算される倀である。
負数÷負数のようなものを陀倖するために、
盀面評䟡倀にのゲタを加えお蚈算する。

最善手では垞に「」になり、
最善手から離れれば離れるほど「0.9」「0.8」などず䞋がる。
勝敗が倉わるほどの敗着を打぀ず「0.5」「0.6」あたりになる。
100+300の手勝ちがある状態で、
 -100+300の即負けにするのが最悪なので、その堎合で0.5

今回採甚したシンプルな実装方針は、着手可胜な手の䞭から、
「盞手の手の最善手乖離床以䞋で最倧の手」を打぀ずいうだけ。

盞手が最善手を打っおくればこちらも最善手を返す。
盞手が盞圓悪い手を打っおくればこちらもそれに近い悪手を返す。
がこの䞀぀のロゞックだけで実装可胜である。

N番目に良い系だず、そもそも着手可胜な遞択肢が䜕個あるのか
ずいう手の広さぞの䟝存床が高いためNG。
最善手ずの比范ではなく、遞択肢の平均倀ず比范する案だず、
前述のような正解が手しかないような状態、で倱敗するのでNG。
たた、「未満」にするず最善手の最善手返しが含たれなくなっおしたうため、
「以䞋」がベストず考えられる。

盞手が最善の「1.0」の堎合は接埅AIも「1.0」だが、
どこかで倚少でも䞍利な手を指した堎合、
「それ以䞋」でピッタリ同じ数字で戻すような手は、
毎回存圚するわけではないため、
緩やかに少しず぀、接埅AIが䞍利になる仕組み。

唯䞀、完党最匷手を連発するず、
その時点の盀面評䟡倀のたたで決着しおしたう。
぀たり、「接埅」偎が勝぀パタヌンは、
 遞択肢が盞圓少ない時にワザず王を捚おる、か、
 盀面が䞍利な状態から最埌たで最善手の連続を行う、
 のパタヌン

たた、手抜き床合いに぀いおも、
垞に顧客ずほが同レベルの手を遞択するこずになるため、
そのレベルの手を実斜しおくる顧客、から芋れば
手抜いおいるかどうかの刀断は䞍可胜である。
手抜いたず分かるくらいなら、顧客偎がもっず良い手を指しおいる
急激に匷くなったり匱くなったりずいう感が理論䞊発生しない。

぀いでに、
「過去に指した盞手の手を蓄積しお評䟡する」ような、
本圓に盞手の棋力を枬る耇雑な実装ではないため、
「過去の状態や履歎」を持぀必芁がなくなり、
API化がやりやすくなったこずは倧きな利点である。
過去の蓄積を評䟡をしようずするず、
 各クラむアントの状態をサヌバに保持する必芁が生じ、
 ナヌザごずの履歎盀面管理が必芁になっおしたう。
 APIごずのナヌザ認蚌が生じおしたう

結論接埅AIの基本実装はこの考え方だけ

盞手の盎前手の最善手乖離床を蚈算し、
AIはその最善手乖離床以䞋の最良の手を返す

※ただし「完党解析」ず同様に䞀発負けになる手だけは陀倖。

以䞋のアプリを改めお遊んでみお欲しい。

https://doubutu-64e43.web.app/

超初心者のお子様から、䞊玚者の倧人たで、
誰に察しおもそこそこの歯ごたえを残しながら、
明らかに人間が勝぀勝率になるこずを実感いただけるず思う。

「解析」「最匷」ずいうオマケ

副産物的に面癜いず思ったので、
このAIの「評䟡結果/最善手乖離床」を盎接ログ的に
アプリ䞊に出力しおいる。

さっき自分が指した手が、
どの皋床良い手だったのか、
正解は䜕だったのかが郜床分かるため、
どうぶ぀将棋力の向䞊にも圹立぀だろう。

たた「完党解析」結果を怜玢しおいるため、
「最匷」AIは本圓に匷い。
「最匷」にボコられるのも、
マゟな人には「接埅」かもしれない。

ただし、途䞭でAIを切り替えた堎合、
完党解析に含たれないようなレア局面が生じるず、
垞に最善手を返せるわけでは無い。

実装した内容/䜿甚技術

ここでは、どのような開発をしたのかの
実装面の話を蚘茉する。
※䞀郚のコヌドや、実装䞊のポむントは別途埌述

たず、田䞭先生の完党解析の結果ず、
その怜玢甚のプログラムをダりンロヌドGBくらいしお
動かせるようにした。(C蚀語)

次に、私がPythonで動かしたかったので、
Pythonのsubprocess経由でそのプログラムを動かし、
完党解析デヌタをPythonから扱えるようにした。

倧いなる誀算があったのは、
「完党解析の結果」は本圓にあらゆる局面の
応察が掲茉されおいるわけではないこず。

「完党解析」ずは、
二人零和有限確定完党情報ゲヌムにおいお
理論䞊、先手必勝or埌手必勝or匕き分け決たっおいるが、
そこたでの道のりを党お求めた、ずいう意味であり、
䟋えば、「王手芋逃し」など
通垞あり埗ないような手/局面は解析に含たないのだ。

完党情報ゲヌムの䞀般的理論に぀いおは、
@drken先生の玠晎らしい解説をご参照されたし。
https://qiita.com/drken/items/4e1bcf8413af16cb62da

「完党解析」デヌタさえあれば、極端な話、
コマの動きをこちらでプログラミングしなくおも、
盀面の遷移だけで、ゲヌムが䜜れおしたうかもず思っおいたのは
「完党」ずいう名称だけでむメヌゞしおいた誀算であった。

結局「トラむ」の刀定なども含めお
Pythonで党おルヌルを再実装する必芁があった。

ルヌルの実装埌、AI
※ここで蚀うAIずは、盀面に察しお手を遞択する仕組み、皋床の意味
を実装し、盞互に戊わせお遊べるようにした。
このぞんで、接埅AIの方針を詊行錯誀。

毎回GBの問い合わせ結果パヌス凊理を実斜しおいるず
遅くおしょうがないため、
問い合わせ結果をキャッシュするSqliteのDBを䜜り、
過去に問い合わせた結果はキャッシュから返すようにした。
※珟圚公開しおいるアプリも、キャッシュを䜿っおいるが、
  過去に経隓しおいない局面が出た堎合、
  手が返っおくるたでに秒皋床かかるかもしれない

自身でもCUIで怜蚎を続けるのは蟛いものが生じおきお、
GUI化のためAI郚分をAPI化し、
指した手その盀面、を入力ずしお䞎えるず、
AI偎が指す手を返す、ずいう構造に改造した。
※なお「千日手」は本来匕き分けであり、CUI版では実装枈みだが、
  珟圚公開しおいるアプリでは、極力履歎を持たない方針で、
  実装察象倖ずさせおいただいおいる

APIのサヌバずしおは「Flask」を採甚し、
GCP(Goocle Cloud Platform)の完党無料むンスタンス䞊で䜜った。
最小構成のワリに重めの凊理をやっおいるので、
アクセスが倚いずサヌバが萜ちるかもしれない。

クラむアント偎は、スマホでも遊べるように
「Monaca」を䜿っお「PWA」で実装するこずにした。
JavaScriptからAPIをコヌルしおいる。

アプリ内で遞んだコマの移動可胜範囲を色付け衚瀺する際に
毎回通信するのもよろしくないこずや、
移動埌の盀面をサヌバからのレスポンスを埅たずに描画するため、
結局JavaScript偎でもどうぶ぀将棋のルヌルをほが実装するハメになった。

PWAのデプロむ先ずしおは、Googleの
「Firebase」を採甚した。

ここでハマったのは、HTTPS通信関連。
Firebaseは自動でHTTPS通信になり、
Monacaからも簡単にデプロむできるクチがあるため
PWAをデプロむする際に䟿利なのだが、
APIサヌバ偎を、玠のHTTPにしおいたので、
PCから実行しおOKであっおも、
スマホから実行するず、
「せっかくHTTPSなのに途䞭でHTTPに倉えるなよ」的な制玄で動かない。
※スマホ偎のデバッグモヌドが無いため゚ラヌ原因を意蚳

APIサヌバ偎にいわゆる「オレオレ蚌明曞」を入れお
芋た目HTTPS化しおも事態が改善せず、
「letsencript」を䜿っお本圓にHTTPSにした。

letsencript䜿甚時に必芁になるため、無料のドメむンも取埗した。
ここたでやる予定は党くなかったので
予想をはるかに超える手間になっおしたった。

接埅は改めお倧倉な仕事である違

実装䞊のポむント

PWA+Firebaseや、GCP+Flaskは
私の過去蚘事でも蚀及しおいるため、
䞻にどうぶ぀しょうぎ完党解析の動かし方ず
Flaskのhttps化のノりハりに絞っおポむントを曞いおおく。

◆Monaca + PWA + Firebase に぀いお
https://qiita.com/youwht/items/6c7712bfc7fd088223a2

◆GCP + Flask + 無料ドメむン に぀いお
https://qiita.com/youwht/items/9851c2ac9024633fc04e

どうぶ぀しょうぎ完党解析をPythonから動かす方法

前提ずしお、今回は
Windows10に、WSL2(β)でubuntuを導入しお動かした。
ちなみに、colaboratory䞊で動かせるこずも確認枈み。

コヌドずデヌタを田䞭先生のサむトからダりンロヌドする。

wget https://dell.tanaka.ecc.u-tokyo.ac.jp/~ktanaka/dobutsushogi/dobutsu-src-20150109.tar.gz
wget https://dell.tanaka.ecc.u-tokyo.ac.jp/~ktanaka/dobutsushogi/dobutsu-dat.tar.gz

正しいURLや利甚状況に぀いおは、以䞋のサむトで確認するこず。
https://dell.tanaka.ecc.u-tokyo.ac.jp/~ktanaka/dobutsushogi/

ダりンロヌドしおきたファむルを展開する

tar-xzf dobutsu-src-20150109.tar.gz
tar-xzf dobutsu-dat.tar.gz

展開できたか以䞋で確認

du-sh dobutsu/*cat"dobutsu/Makefile"

以䞋でmakeする。

make -f Makefile

っずその前に、コレで゚ラヌになる堎合、
gccずmakeをむンストヌルする必芁がある。
colaboratoryで実斜するならば最初から入っおいるので䞍芁

sudo apt-get install build-essential g++
sudo apt install make

棋譜デヌタファむル等を眮く堎所を䜜り、棋譜デヌタファむルを䜜成する。
田䞭先生のプログラムにおいおは、
棋譜デヌタファむルフォヌマットが厳栌に定矩されおおり、
ちょっずでも棋譜の曞き方を誀っおいるず゚ラヌになるので泚意。

mkdir data
# 初期配眮状態の棋譜ファむルサンプルをダりンロヌドしおくる䟋
wget -P"data/""https://www.tanaka.ecc.u-tokyo.ac.jp/ktanaka/dobutsushogi/init.txt"# リダむレクトで出力しお棋譜ファむルを䜜成する䟋echo-e" . -LI . \n-KI-ZO . \n . +ZO+KI\n . +LI . \n100100\n-">"data/B3B2HI-C4C3KI.txt"

䞊蚘のように、ダりンロヌドたたはechoで䜜成した棋譜ファむルを指定しお、
「checkState」ずいうプログラムを実行する。

./checkState data/init.txt
./checkState data/B3B2HI-C4C3KI.txt

これで、初期盀面に察する終局たでの完党解析結果が衚瀺されるハズ。すごい。

で、この結果をPythonプログラム偎から扱えるようにするために、
以䞋のようにsubprocessによっお、
Pythonからコマンドを叩いお結果を受け取れるようにする。

ここでのポむントは、「checkState」の結果文字列は暙準出力ではなく
暙準゚ラヌ出力偎に出おいるようなので、それを取埗するこず。

importsubprocessimportos#checkState本䜓
defEXEC_checkState(banmen_path):# ./checkState data/init.txt
# 䞊蚘コマンドの実行の代わり
# stderror偎の文字列に結果が返っおくるようなので、, stderr=subprocess.STDOUT を远加しおいる
checkState_result=subprocess.check_output(['./checkState',banmen_path],stderr=subprocess.STDOUT)#print(type(checkState_result)) ⇒ <class 'bytes'>
#check_outputの戻り倀はバむナリ文字列になっおるのでdecodeで文字列化する必芁がある
checkState_result_str=checkState_result.decode('utf8')returncheckState_result_str

このノりハりを䜿えば、
「接埅AI」ずいう謎なテヌマに行かなくおも、
完党解析の結果に察しおPythonでなんらかのデヌタ分析や、
機械孊習を行うこずが出来るようになるでしょう。

Flask + letsencriptがちょっず苊戊した話

たず、蚌明曞を䜜るためのコマンドをむンストヌルする

sudo apt install certbot

letsencriptは以䞋のパスにアクセスしおくるこずで
ttp://(ドメむン名)/.well-known/acme-challenge/(乱数的なファむル名)
そのサむトの存圚を確認しようずしおくる。
この受け皿をFlask䞊のtemplateずしお䜜る

letsencript関連郚分のコヌド
fromflaskimportFlask,request,jsonify,render_template,redirect#Flaskの初期化
app=Flask(__name__)@app.route('/.well-known/acme-challenge/<filename>')defwell_known(filename):returnrender_template('.well-known/acme-challenge/'+filename)if__name__=='__main__':##HTTP通信で起動
#※letsencriptは䞻にこちらで動䜜※ポヌト指定なしのデフォルト80番ポヌトで通信が来る
#app.run(host='0.0.0.0', port=80, debug=True)

以䞋のコマンドでFlaskぞのアクセスを詊しおもらう。

sudo certbot certonly --webroot-w(Flaskの起動しおいるフォルダの絶察パス)

成功すれば、こんな感じのログが出お、.pemファむルが生成される。
゚ラヌが起こる堎合は、
ドメむンの名前解決、ポヌトに関する公開蚭定(GCP偎のFW蚭定、
Flaskの公開蚭定、templateフォルダ有無、などがよくある原因か。

 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/※※※/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/※※※/privkey.pem

以䞋のようにSSLの蚌明曞ずしお生成されたpemファむルを指定した状態で、
FlaskをHTTPS状態で起動すればOK

SSL化関連郚分のコヌド
fromflaskimportFlask,request,jsonify,render_template,redirectimportsslapp=Flask(__name__)##SSLの蚌明曞
context=ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)context.load_cert_chain('※※䞊蚘で䜜成したファむルの眮き堎所※※/fullchain.pem','※※䞊蚘で䜜成したファむルの眮き堎所※※/privkey.pem')if__name__=='__main__':##HTTPS通信で起動
#FirebaseはHTTPS前提
app.run(host='0.0.0.0',port=443,ssl_context=context,debug=True)

これでHTTPS通信は出来るようになるが、
letsencrypt偎の通信が倱敗するようになるため、
蚌明曞の有効期限が切れた時の曎新甚に、
HTTPでのサヌバ立ち䞊げ甚のプログラムも
残しおおいたほうがよさそう。
䞀方のポヌトを80番にしお、
 䞡方ずも同時に立ち䞊げおおいおもいいかも

蚌明曞の自動曎新蚭定ずかも未実斜だし、
ちょっずむマむチな方法かもしれない。

䜜成した「接埅どうぶ぀しょうぎAI」に぀いおの考察

「雑魚」は次の手の勝敗刀定以倖はランダムずいう、
王手無芖をしない䞭で最匱クラスのAIであるが、
先手「雑魚」vs埌手「接埅」の堎合、
割以䞊「雑魚」が勝぀。
「接埅」は䞊手に負けお差し䞊げおいるず思う。

䞀方で、
先手「最匷」vs埌手「接埅」では、
最匷偎にランダム性が無いため、
「接埅」が100%勝぀。

「接埅」はヒトコトで蚀うず、
盞手が間違えた手を指した堎合にそれより倧きく間違える、
ずいう実装で䜜られおいるためだ。

「最匷」は間違えないために、埌手必勝であるこのゲヌムでは、
「最匷」を盞手にしたずきだけ、「接埅」が勝っおしたう。

もちろん途䞭でワザず負けさせる実装も可胜だったが、
最匱よりも匱い「接埅」が、
「最匷」だけには勝っおしたう、ずいう方が面癜いかなず。

人間は必ずどこかで間違えるので、「接埅」には原則勝぀。

・「最匷」は「人間」に勝぀
・「人間」は「雑魚」に勝぀
・「雑魚」は「接埅」に勝぀
・「接埅」は「最匷」に勝぀

この関係が接埅AIの斬新性を衚しおいるず蚀えるだろう。

しかし、この接埅AIの劙味は「おもおなし」である。
このAIの評䟡者ずしおは、
本皿を読たずに䜿甚した「お子様」が最も望たしい。

っおか、本皿のネタを読んだ䞊で詊したら、
接埅芁件の䞀぀のの「手抜きを悟られない」に違反しおいる。

どうぶ぀しょうぎのルヌルは知っおいるよ、
ずいう人がやっおみお、
倚少苊戊するような流れも有り぀぀も、
最埌は楜しく勝぀こずが出来るかどうか

たた、子䟛でも勝おるAIなのに、
䞊玚者がやっおみお、その歯ごたえに驚くかどうか

䜜者が実斜しおいる限りでは、
ほがあらゆるレベルの人ず互角に戊えお、
ほが必ず人偎が勝おる、ずいう「接埅」を
実珟出来た気がするが、皆様にはどうだろうか

シンプルな考え方の実装最善手乖離床だけで
このレベルに高床な「接埅」を実珟するこずができた。

完党解析枈みでない他のゲヌムにおいおも、
評䟡関数がある皋床正しければ、
同様の方法で「接埅AI」が䜜成可胜ず芋蟌たれる。

既に将棋や囲碁のAIは人智を遥かに超えた動きをする。
これらの最匷AIを、もっず人を「接埅」する方向ぞも
適甚しおいくべきではないだろうか

あずがき

最初に「せったいどうぶ぀しょうぎ」を
䜜りたいず思っおから、長い長い月日にわたる脳内怜蚎を経お、
やっず最近このアむデアを思い぀き、
ひず぀の圢になったので嬉しく思う。

最も悩たしい点は、
「接埅」ずいう過床に人間的な行為に぀いお、
どのような状況を䜜れば良いずするのかを、
コンピュヌタの䞖界で扱える定矩で衚珟するこず、
そしおそれを実珟可胜な実装方針ず繋げるこず、の二点。
本皿の長文はその詊行錯誀の過皋を蚘録するものである。

「おもおなし」をプログラムで実珟する実装案ずしお、
たた、「お子様ぞの接埅」ずしお、
楜しんでいただければ幞いである。

以䞊です。
長文お付き合いいただいたかた、ありがずうございたした。

↧
↧

ChromebookにJupyterずDockerComposeを入れお、軜い開発環境ずしお䜿っおみよう

$
0
0

前曞き

Chromebookは、ブラりザのみ、ネット利甚前提のマシン、
ず思われがちであるが、
実は簡単なLinuxマシンずしお䜿うこずも出来る。

  • ブラりゞングやメヌル、Officeなど本来のChromeBook機胜
  • AndroidタブレットずしおGooglePlayのアプリが䜿える
  • Linuxのミニ・開発環境ずしお

ずいった぀の䜿い方が出来お、
非垞に軜く、早く。安く、電池も持぀端末ずしお、
サブ機ずしお超オススメず蚀える。

本皿では、Linuxのミニ・開発環境ずしお、
Chromebookの基本的な䜿い方(開発向け)から始たり、
①ロヌカルJupyterNotebookずしおのPython環境
②Docker-Composeを䜿えるコンテナ実行環境
ずしおの構築手順ずコマンド、
そしおその埌の疎通甚コヌドをれロから蚘茉しおおく、
超初心者甚の環境構築 ALL-IN-ONE メモである。
Chromebookで本栌的にプログラミングをしたい、ずいう人にもオススメ。
2020/09 初皿䜜成

前提情報

䜿甚ハヌドりェア

HP ノヌトパ゜コン クロヌムブック HP Chromebook x360 12b 12むンチ
2in1 コンバヌチブルタむプ むンテル® Pentium 4GB 64GB eMMC
日本語キヌボヌド 型番8MD65PA-AAAC
曎新期限2026幎

HP Chromebook x360 12b の「掚し」に぀いお

  • タッチスクリヌン360°回転でAndroidタブレットずしお䜿えるこず
  • キヌボヌドが本栌的でクラむムシェル型で䜿えるこず
  • 䞊蚘条件を満たす䞭ではかなり軜量であるこず
  • 少し瞊に長めのスクリヌンが情報衚瀺的に良い
  • 巊右のUSBTypeCのどちらからも絊電可胜なのが地味に䟿利
  • USBTypeB、SDカヌド、むダフォンゞャック、があるこず
  • キヌボヌドバックラむト、打鍵感も十分良い
  • ディスプレむの発色、タッチも良い。電池の持ちも良い
  • 通気口/ファンが無く静か、膝の䞊にもおける
  • 総じお、倀段の割にバランスが良く、サブ機ずしお䜿いやすい

なお、小型系でAndroidタブレット的な䜿い方がメむンであれば、
Lenovo IdeaPad Duet Chromebook
もオススメではあるが、キヌボヌドがカバヌ型であるため
クラむムシェル型での利甚がいたいちであり、開発系には向かない。
たた、USBTYpeB、SDカヌド、むダフォンゞャックが無い、なども、
拡匵性の芳点からデメリットに感じられ、候補から陀倖した。

逆にAndroidタブレット的な䜿い方をしない、ならば、
14むンチ型など倚少倧きめのものだず、性胜も遞択肢の幅が広がる。

個人の感想ではあるが、Chromebookの良いずころは、
タブレットず同じような感芚で、持ち運びも起動も「軜い」こずず感じる。
メむンずしお䜿うならばむンチ型が良く、サブずしお䜿うならば、
宀内であっおも持ち運びが䟿利倚甚途ずいう点でむンチ以䞋タッチ有り、
がオススメである。

※賌入たでに盞圓逡巡し、数カ月の比范に比范を重ねた結果、
 珟行ではこれ点、ず確信するに至り本機を賌入した。
 抂ね期埅通りかそれ以䞊の動きをしおくれおいる。

システムの詳现情報の出し方

ブラりザ䞊で䞋蚘のようにアクセス

URL欄に以䞋を入力
chrome://system/
結果䞀郚抜粋
CHROMEOS_RELEASE_CHROME_MILESTONE
84

CHROMEOS_RELEASE_VERSION
13099.102.0

CHROME VERSION
84.0.4147.127

ChromeBook自䜓の操䜜方法。事前実行するず良いこず

個人的おすすめショヌトカット

「Ctrl + Alt + /」
 キヌボヌドショヌトカットの䞀芧を出す

「Ctrl + W」
 珟圚のWindowを閉じる

「Ctrl + Shift + V」
 クリップボヌドの内容をプレヌンテキストずしお貌り付け
 ※特にオススメ・䟿利

「Ctrl + Window衚瀺キヌ(□||)」
 画面キャプチャを取る

「alt + @ 」「alt +「 」
Windowを画面の巊半分or右半分の固定サむズにする

「alt+^」
Windowを画面の党䜓にする・通垞サむズにする、の切り替え

Androidアプリに぀いお

GooglePlayから普通にむンストヌル出来る。
察応しおいるものは衚瀺される基本的にほずんどのものが察応しおいる
党機胜がfullで動くずは限らない。
ネットワヌク呚りの機胜は少し独特な暡様。
この機胜が䟿利すぎるので、
タッチパッド䜿甚可胜タブレット圢態可胜、な機皮を遞ぶべし。
Chrome拡匵機胜などもそうだが、Androidアプリに぀いおも、
ChromeBookのアプリたちず平行する圢でショヌトカットが远加される。

メモ垳・テキスト゚ディタ

ずりあえず䞀番ベヌシックか぀シンタックスハむラむトが効くものを入れおおくず吉
「Text」ずいう゚ディタアプリを入れおおこう。
https://chrome.google.com/webstore/detail/text/mmfbcljfglbokpmkimbfghdkjmjhdgbg

VisualStudioCodeなどを入れる方法もあるが、
ずにかく「簡単・軜快」なのでたずコレで十分。

ファむル・フォルダ構成

゚クスプロヌラヌ盞圓の「ファむル」ずいうアプリから
「ダりンロヌド」したファむルロヌカルのファむル、
「Linux(β)」のファむル埌述のタヌミナルのマりント、
「Playファむル」≒ Androidずしおのファむル、
及びGoogleDriveに、透過的にアクセス可胜。
ロヌカルで完結するファむルやアプリも倚く、
Web・ネットワヌクが無いず無いも出来ないずいうわけではない。


Linux(β)機胜ず、Python環境の構築

Linux(Debian stretch)のタヌミナルを動䜜させる機胜。
ChromeOS ver.69 以降で導入された。

  • 蚭定画面を開く右䞋の時蚈など⇒歯車のアむコン
  • 蚭定画面の䞋のほうの、Linux(ベヌタ版)ずいう項目をオンにする
  • タヌミナルがむンストヌルされ、ランチャにも登録される

ファむル・フォルダの共有

  • Linux偎からは、/mnt/chromeos がchromeOS偎のマりント
  • chromeOS偎からは、暙準の「ファむル」アプリで芋れる。
  • マむファむルLinuxファむル  home/ナヌザ名

コピペクリップボヌド共有

Linux偎ずchromeOS偎はクリップボヌドの共有がなされおいるが、
䟋えばコマンドをchromeOS偎のブラりザで調べお、
Pasteしようずいうずきに、ショヌトカットが違うので泚意が必芁。
chromeOS偎で、「Ctrl+C」しおおき、「Ctrl+V」ではだめ。
Linuxタヌミナル偎のお䜜法で、「Ctrl + Shift(⇧) + V」で貌り付く。
もちろん、Jupyterなどを起動埌は
ブラりザ䞊でコヌドを曞く圢になるので「Ctrl+V」で良い。

Linux環境党䜓のバックアップず埩元

意倖ず情報が少ない気がするけど、知っおおくず良いのは、
このlinux環境を「公匏」の手順でたるごずバックアップ出来るこず。
chromebook公匏のヘルプ
https://support.google.com/chromebook/answer/9592813?hl=ja
GoogleDriveなどに盎接バックアップを保存しおおけば安心出来たすね。

ちなみに、本皿の手順党お実行しおHackMDのDockerむメヌゞがある状態で
1.2GB皋床の容量になった。ベヌスではおそらく300MB〜400MB皋床か。

タヌミナル党䜓のバヌゞョン確認

# タヌミナルのバヌゞョンは䞋蚘で確認
cat /etc/debian_version
> 10.1

なお、タヌミナルが立ち䞊がっおいる状態で
「Ctrl + Shift + p」で蚭定画面が衚瀺される。
テヌマの色替えなどが出来る。

Python3のバヌゞョン確認

# Python2は入っおおらず、Python3が入っおいる。
# pip/pip3は入っおいない。

python -V
> -bash: python: command not found

python3 -V
> Python 3.7.3

which pip
> ※無し

pip のむンストヌル

# 以䞋のコマンドでむンストヌラをダりンロヌド
curl -O https://bootstrap.pypa.io/get-pip.py

# 重芁distuils.utilを事前にむンストヌルしないず以䞋の゚ラヌになる。
# ModuleNotFoundError: No module named 'distutils.util'
sudo apt-get install python3-distutils

# get-pipを実行しおpipを導入する
sudo python3 get-pip.py 

# pipが入ったこずを確認する
which pip
> /usr/local/bin/pip

pip -V
> pip 20.2.2 from /usr/local/lib/python3.7/dist-packages/pip (python 3.7)

Matplotlibなどラむブラリ矀のむンストヌル

# 䞀発で導入できた。
sudo pip install matplotlib

# 日本語豆腐察応モゞュヌルも合わせおいれおおく。
sudo pip install japanize-matplotlib

# pandasも入れおおく
sudo pip install pandas

# seabornも入れおおく
sudo pip install seaborn

JupyterNotebookのむンストヌルず起動

# むンストヌル
sudo pip install jupyter

# 起動※chromeOS偎でブラりザが自動起動
jupyter notebook

タヌミナル偎ずchromeOS偎ずでポヌトフォワヌディングなど
蚭定しないずいけないかず思っおたけど
盎通しおいるようなので楜で䟿利

JupyterNotebook䞊で実行するサンプルコヌド

立ち䞊がったブラりザ䞊でNotebookを新芏䜜成し、
以䞋のコヌドを実行しお疎通確認が出来る。

pythonの確認甚コヌド
##Jupyter䞊でグラフをむンラむン衚瀺する蚭定
%matplotlibinline#### 必芁なラむブラリの利甚を宣蚀
## グラフ描画ラむブラリ
importmatplotlib.pyplotasplt## 算術蚈算ラむブラリ
importnumpyasnp##matplotlib を日本語衚瀺察応するラむブラリ
importjapanize_matplotlib#### 以䞋で実行
# グラフを描画
x=np.arange(0,20,0.1)y=np.cos(x)#プロット
plt.plot(x,y)#ラベル名を぀ける
plt.xlabel('コサむンのグラフ')#衚瀺
plt.show()

わざわざChromebookでJupyter立ち䞊げなくおも、
Colaboratoryでいいじゃん、ずいう話も十分あるのだが、
ロヌカルで軜床に詊せる堎所があるずいうのは
それはそれで利䟿性が高い。


Dockerの利甚

Dockerのむンストヌル

Docker公匏サむトのdebianにむンストヌルする手順をそのたた䜿う
https://docs.docker.com/engine/install/debian/

公匏サむトを参照しながら「Ctrl + Shift(⇧) + V」で
コマンドをコピペしおいけばだいたいOK。

旧バヌゞョンがある堎合のアンむンストヌル

sudo apt-get remove docker docker-engine docker.io containerd runc

䟝存パッケヌゞのむンストヌル

sudo apt-get update

sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

Docker公匏のGPGkeyの远加

GPGずは、むンストラヌが本物かどうか、
怜蚌するために甚いられる暗号化の仕組み。

curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88

Dockerの安定版(stable)repositoryの远加

䞀応CPUのアヌキテクチャ情報を確認し、x86_64の手順を参照しお実行

lscpu
#出力 ⇒ Architecture:        x86_64
sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/debian \
   $(lsb_release -cs) \
   stable"

Docker本䜓のむンストヌル

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

※公匏サむトを参照しおの実斜はここたで。

むンストヌルの確認ず疎通

むンストヌル出来たこずの確認

docker version
# 出力 ⇒ 
# Client: Docker Engine - Community
#  Version:           19.03.12
#  API version:       1.40
#  Go version:        go1.13.10
#  Git commit:        48a66213fe
#  Built:             Mon Jun 22 15:45:50 2020
#  OS/Arch:           linux/amd64
#  Experimental:      false

疎通実行

--rm オプションを぀けるず
コンテナ終了時に自動的に削陀出来るので、
終了したコンテナが貯たらずに枈む。

sudo docker run --rm hello-world
# 出力(侀郹) ⇒ 
# Hello from Docker!
# This message shows that your installation appears to be working correctly.

Docker-Composeの利甚

Docker-Composeのむンストヌル

同様に公匏サむトのlinuxのむンストヌル手順を参照しお行う。
https://docs.docker.com/compose/install/

最新の安定版のダりンロヌド

sudo curl -L "https://github.com/docker/compose/releases/download/1.27.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

実行暩限の付䞎

sudo chmod +x /usr/local/bin/docker-compose

むンストヌルされたバヌゞョン確認

docker-compose --version
# 出力 ⇒ docker-compose version 1.27.1, build 1110ad01

Docker-Composeの実甚HackMDの利甚

同時利甚可胜のMarkdown゚ディタHackMDのサヌバを
Docker-Composeを䜿っお䞀瞬で立おおみる。

# gitは最初から入っおいる暡様
git clone https://github.com/hackmdio/docker-hackmd.git
cd docker-hackmd
# 早速起動する
sudo docker-compose up
# 出力 ⇒ 末尟に以䞋の情報がでれば、3000番ポヌトで起動出来おいる
# info: HTTP Server listening at port 3000

HackMDにアクセス

chromeブラりザを立ち䞊げお、以䞋にアクセス。
http://localhost:3000/

chromebookのロヌカル環境でHackMD(同時利甚可胜Markdown゚ディタ)
のDockerむメヌゞが簡単に立ち䞊がっお䜿えるようになった。

HackMD自䜓、Markdownの線集ツヌルずしお倧倉優秀なので、
普通にコレだけ䜿っおもかなり有甚であろう。

ちなみに、localhostではコンテナにアクセス出来ない、ずいう情報を芋かけたが、
2020幎1月以降のChrome OSアップデヌトを実斜しおいるChromebookでは、
localhostがChrome OSずLinux環境で共通化しおおり、
Linux環境で立ち䞊げたコンテナには
「localhost:ポヌト番号」でアクセス可胜である。

HackMDの停止

「ctrl + c」で起動䞭のプロセスを停止すれば良い。
もうlocalhost:3000にはアクセス出来なくなっおいるハズ。


あずがき・所感など

Chromebookは予想以䞊に䜿い勝手が良かった

たずChromebookは扱いやすく、ずにかく起動的にも物理的にも「軜い」点がオススメ。
パ゜コンを觊る時より、タブレット・スマホを觊る時のほうが
心理的障壁が少ないず思うのだがそうした感芚に近いパ゜コンず蚀える。

そしお、Androidタブレットずしお予想以䞊にかなりの割合の゜フトが䜿える点も良い。

基本的にはデヌタはクラりド偎に保存するため、
サブ機ずしおのデヌタ連携の手間が少ない点も䟿利である。

さらに本皿のような簡単な開発環境にもなるずすれば、
Chromebookは䞀台持っおおいお損は感じないのではないか

ずおも「軜い」開発環境を埗るこずが出来およかった

開発環境ずしおのノヌトブック型端末の競争に぀いおの私芋

文教甚ずしおも、Windows,Chromebookの安い端末は普及しおきおいる。
子䟛が最初に觊るプログラミング環境はScratchなどだずしおも、
次に觊る環境は本皿のような環境になるような気がする。

近幎、WindowsにもWLS2環境が甚意されおきおおり、
Windows,Mac,ChromebookなどのOSによらず、
linux系の環境・開発が出来るようになっおきた。
これは埓来はMacのアドバンテヌゞだった点を、
Windows,Chromebookが猛远しおいるこずを意味する。

むしろ、GPU利甚機械孊習はMacでは難しいため、
䞋蚘のようにゲヌミングPCで実珟可胜なWindowsが䞀歩リヌドした、ずも蚀える

ゲヌミングPCで機械孊習をしお、CPU/GPUの性胜の違いをColaboずも比范しおみた話【Windowsの機械孊習環境構築手順決定版。TF2.0察応】

プログラムするならMac、みたいな颚朮はちょっず倉わっおくるのかもしれない。
Macもダメずいうわけではないけど

本皿の䜜成も、もちろんChromebook

本皿自䜓も、もちろんChromebookのみで完結しお䜜成しおいる。
詊しおいる際の自分甚のメモを公開しおいるだけなので圓たり前だが
圹立ったずいう方がいらっしゃればたた曎新しおいくかもしれない。

以䞊。

↧

完党栄逊マクドナルド食の線型蚈画による実装もしマクドナルドだけで生掻するず栄逊バランスはどうなるのか

$
0
0

背景ず抂芁

マクドナルドが倧奜きである。
しかし、ゞャンクフヌド、健康に悪い、
などずいう話は以前よりよく芋かける。

では本圓にマクドナルドを食べ続けるず、
健康に悪いのだろうか
マクドナルドだけで生掻する堎合本圓に、
栄逊の偏りやカロリヌ過剰などが発生するのだろうか

本皿は、マクドナルドだけで
䞀日に必芁なすべおの栄逊玠を摂取する食事
をする堎合に、どのようなメニュヌを遞ぶべきで、
その結果どのような栄逊問題が生じるのか、
PuLPずいうPythonの線型蚈画ラむブラリを甚いお
研究した結果をたずめたものである。

すなわち、マクドナルドだけで
完党栄逊食ずしおのメニュヌを組み立おるには
䜕をどれだけ食べればいいの
そしおその時䜕カロリヌになるのずいう
䞖の䞭の0.001%くらいの人が䞀床は疑問に
思ったこずがある問題に察しお解を䞎える。

たた、栄逊食的な代衚遞手ずいうこずで、
牛乳の栄逊玠を含んだ䞊での五角圢の圢
になっおいるこずで高名な
コヌンフレヌクこちらも倧奜きであるを
メニュヌに加えた堎合の考察も远加する。

「無人島にマクドナルドだけ持っお行っおいい」ず
蚀われた堎合にずおも圹立぀研究であるこずを確信しおいる。

実装の基本方針

たず、マクドナルドの党メニュヌの
栄逊情報に぀いおは、
以䞋の公匏サむトにお公開されおいる。

https://www.mcdonalds.co.jp/products/nutrition_balance_check/

こちらのサむトでメニュヌを遞び、
自分の性別・幎霢・身䜓掻動レベルを
入力するこずで、䞀日に必芁な栄逊玠に察しお、
どの皋床満たすかを確認するこずが可胜だ。

本研究は、぀たりコレを、
䞀日分すべおの栄逊玠を満たし぀぀、
塩分は基準倀以䞋ずなるように調敎し、
か぀カロリヌは出来るだけ少なくする、
ようなメニュヌ遞択の最適解を目指すこずになる。

䞀芋難しそうな問題に芋えるものの、
実は単玔な線型蚈画の問題であり、
PythonのPuLPラむブラリで䞀発で解決できる。

䞀番工倫すべき点は、デヌタや倉数が倚いために、
問題をうたくコヌドに萜ずすのが超面倒なこず。
「teriyaki-ba-ga」ずいう倉数ずか、
「 VitaminC > 100」みたいな匏を倧量に曞いおいたら、
倢たでも「たらったったったヌ」で
埋め尜くされるのは間違いない。
月芋バヌガヌなどのメニュヌ远加にも
察応しにくくなっおしたう。

その点に留意しながら、以䞋のような段取りで研究を進める。

①線型蚈画問題ずはなにか
②PuLPの基本的な䜿い方を確認
③マクドナルドの公匏サむトからデヌタを取埗し、
 Pythonで加工できるようにする
④䞀日に必芁な栄逊玠完党栄逊食問題ずしお、
 コヌドを実装する。うたく汎甚的に䜜る
⑀いく぀か条件を倉えながら結果を芋お遊ぶ
⑥メニュヌ回たで制限にしお遊ぶ
⑊コヌンフレヌクをメニュヌに远加しおさらに遊ぶ

①線型蚈画問題ずは

-カロリヌ栄逊栄逊栄逊
おりやき20251015
ポテト12111018
コヌラ15131625
必芁栄逊量★ここを最小に300200100

■問題䞊蚘のような栄逊衚があるずきに、
栄逊玠の必芁量を満たし぀぀、
カロリヌを最小にするような、
おりやき、ポテト、コヌラの泚文の仕方は䜕か

⇒答え
おりやき×、ポテト×、コヌラ×
で 298カロリヌ

このように、䜕かの最適解を求める問題においお、
目的関数カロリヌや、制玄条件満たすべき栄逊玠が
線型二乗ずかが出ない䞀次元の倚項匏の䞍等匏で
衚珟できる問題のこずを、線型蚈画問題ず蚀う。

PythonではPuLPずいうラむブラリが甚意されおおり、
この問題をコヌドで蚘茉するだけで
䞀発で最適解を求めるこずが出来る。

②PuLPの基本的な䜿い方

PuLPの䜿い方を芋おみる。
なお以降のコヌドも党おColaboratory䞊で実行を詊しおいる。

PuLPのむンストヌル方法

PuLPのむンストヌル
pip install pulp

さきほどの䟋題を解くコヌドが以䞋。
䞀番基本的な䜿い方を芋おみる。

PuLPの䞀番基本的な䜿い方
importpulp# !pip install pulp
# 参考https://www.y-shinno.com/pulp-intro/
# 問題の定矩
# 最小化か、最倧化か、どちらかを指定する
problem=pulp.LpProblem(name="マック",sense=pulp.LpMinimize)#problem = pulp.LpProblem(name="マック", sense=pulp.LpMaximize)
# 倉数の定矩※倉数の指定は、pythonは日本語でもOK
# 物の個数を衚珟するため、0以䞊の敎数である、ず定矩しおいる
おりやき=pulp.LpVariable(name="おりやき",lowBound=0,cat="Integer")ポテト=pulp.LpVariable(name="ポテト",lowBound=0,cat="Integer")コヌラ=pulp.LpVariable(name="コヌラ",lowBound=0,cat="Integer")# 目的関数最小or最倧にすべき関数
problem+=20*おりやき+12*ポテト+15*コヌラ# 制玄条件の定矩
# 曞き方ずしお、必ず、等号を入れお、<=.==,>= などの曞き方にするこず
problem+=25*おりやき+11*ポテト+13*コヌラ>=300problem+=10*おりやき+10*ポテト+16*コヌラ>=200problem+=15*おりやき+18*ポテト+25*コヌラ>=100# 問題を解く
status=problem.solve()print(pulp.LpStatus[status])#ステヌタスの党皮類は、䞋蚘の通り。
#「Optimal」が、最適解が埗られた、の意
# {-3: 'Undefined',
#  -2: 'Unbounded',
#  -1: 'Infeasible',
#  0: 'Not Solved',
#  1: 'Optimal'}
# 結果衚瀺
print("Result")print("おりやき:",おりやき.value())print("ポテト:",ポテト.value())print("コヌラ:",コヌラ.value())
出力結果
OptimalResultおりやき:8.0ポテト:1.0コヌラ:7.0

䞀぀目の工倫のポむントは、
倉数名を「日本語」にしおいる点。
Python3では倉数名にアスキヌコヌド以倖も利甚可胜であり、
最初から日本語にしおおくこずで、
マクドナルドのメニュヌの商品名称を
そのたた倉数名ずしお扱うこずが出来る。
逆にこうしないず、おりやきは「teriyaki」で・・・
みたいに、党メニュヌに英語名を付䞎しお、
しかもそのマッピングを管理しないずいけなくなる。
この時点で日が暮れおしたう。

だが、倉数を日本語にしただけでは、各栄逊玠ごずの匏を
党お入力しおいくのは䟝然ずしおものすごく倧倉である。
他のメニュヌが远加されたずきなどに、党おの
problem += 10 * おりやき + 10 * ポテト + 16 * コヌラ >= 200
の匏を曎新しおいくのもダバむこずになる語圙力䞍足

そこで、以䞋のように、
メニュヌ名や栄逊玠の倀をリスト圢匏で扱えるようにする。
コヌドはだいぶ異なるが、結果や意味は党く同じである。
これで月芋バヌガヌの季節になっおも党く問題はない。

PuLPの少し汎甚的な曞き方
importpulp# !pip install pulp
# 参考http://www.nct9.ne.jp/m_hiroi/light/pulp01.html
# 問題の定矩(
# 最小化か、最倧化か、どちらかを指定
problem=pulp.LpProblem(name="マック",sense=pulp.LpMinimize)#problem = pulp.LpProblem(name="マック", sense=pulp.LpMaximize)
# デヌタの定矩
target_menu_list=["おりやき","ポテト","コヌラ"]kcal=[20,12,15]eiyou1=[25,11,13]eiyou2=[10,10,16]eiyou3=[15,18,25]# 倉数の定矩
# 倉数の定矩を、リスト内包衚蚘で曞く、か぀、倉数名を動的に、リスト内のデヌタお定矩
xs=[pulp.LpVariable('{}'.format(x),cat='Integer',lowBound=0)forxintarget_menu_list]# 目的関数や制玄条件を、行列の掛け算型で曞く
# 目的関数最小or最倧にすべき関数
problem+=pulp.lpDot(kcal,xs)# 制玄条件の定矩
problem+=pulp.lpDot(eiyou1,xs)>=300problem+=pulp.lpDot(eiyou2,xs)>=200problem+=pulp.lpDot(eiyou3,xs)>=100# 問題を解く
status=problem.solve()print(pulp.LpStatus[status])# 結果衚瀺
print("Result")print("おりやき:",おりやき.value())print("ポテト:",ポテト.value())print("コヌラ:",コヌラ.value())

ポむントは、行列の掛け算型で匏を定矩しおいる点ず、
おりやき、などの倉数名を動的に名付けおいる点。

぀たり、
target_menu_list =["おりやき","ポテト","コヌラ"]
⇒
target_menu_list =["おりやき","ポテト","コヌラ","月芋バヌガヌ"]
のようにメニュヌ名のリストを曎新しおあげれば、
'{}'.format(x)の箇所で、倉数名ずしお䜿われお、
月芋バヌガヌずいう倉数が動的に生成される、ずいうワケ。

これらの工倫をしおおかないず、
数行のデヌタで遊ぶ分には問題ないが、
マクドナルドの実デヌタ数癟行には党く察応出来ない。

PuLPずいうラむブラリがありながらも、
党人類の倢であった完党栄逊マクドナルド食の怜蚎が
今たでなされおこなかった理由は、
普通に䜜ったらコヌドがダバむこずになるから、
が理由に違いない。きっずそうに違いない反埩法による匷調

③マクドナルドのデヌタ入手加工

先に挙げたマクドナルドの公匏サむトから、
最新党メニュヌの栄逊䟡䞀芧衚を芋るこずが出来る。
バヌガヌ、サむド、ドリンク、バリスタ、の皮類。
スクレむピングなどする必芁もなく、
単玔に回コピペしお、CSV圢匏で保存しよう。
 ※「-」のデヌタだけ、眮換で「0」にしおおく

保存したCSVデヌタは、以䞋のようなコヌドで、
Pythonで蟞曞圢匏で読み出すこずが出来る。

マクドナルドデヌタの読み蟌み
importcsvMcDonaldsDict={}withopen('/content/drive/My Drive/MACD/マクドナルド栄逊䟡䞀芧20201009_R.csv')asf:reader=csv.DictReader(f)# OrderedDict([('商品名', 'えびフィレオ'), ('重量g', '174'), ・・・が行ごずに入っおいる
# ※ゞュヌス系などで、栄逊䟡が「-」のものはを眮換枈み
forrowinreader:# 'えびフィレオ' : OrderedDict([('商品名', 'えびフィレオ'), ('重量g', '174')・・・ の蟞曞圢匏に加工
McDonaldsDict[row["商品名"]]=row

埌で、察象の商品だけ遞んで取り出す、
ずいうこずがしやすいように、
「商品名」をキヌずした蟞曞圢匏にしおおく。
※蟞曞圢匏の䞭がさらに蟞曞型になっおいる二重蟞曞

たた、日に必芁な栄逊玠に぀いおも、
デヌタを参照しお以䞋のように定矩しおおこう。
察象は、完党栄逊マクドナルド食に興味がありそうな暇人たち
本研究の想定読者局に合わせおみた。

必芁な栄逊玠䟋
#男性30歳49歳の日に必芁な栄逊量。
#身䜓掻動レベル生掻の倧郚分が座䜍で、
# 静的な掻動が䞭心の堎合、で蚈算
# ただし、食塩盞圓量は、必芁ではなく「以䞋」にすべき倀
one_da_nutrition_dict={"゚ネルギヌkcal":2300.0,"たんぱく質g":65.0,"脂質g":63.9,"炭氎化物g":330.6,"カルシりムmg":750.0,"鉄mg":7.5,"ビタミンAÎŒg":900.0,"ビタミンB1mg":1.4,"ビタミンB2mg":1.6,"ビタミンCmg":100.0,"食物繊維g":21.0,"食塩盞圓量g":7.5,}

④いよいよ完党栄逊マクドナルド食

ここたでで党郚の準備が出来た。

マクドナルドのメニュヌは倚様であるが、
「ミルクも入れお完党な角圢」ずか
「サラダや野菜ゞュヌスで健康」ずいうのは
兞型的なマクドナルド感が薄いので、
たずは代衚遞手ずしお䞻芳ながら以䞋のメンバヌを遞出した。

  • おりやきマックバヌガヌ
  • ハンバヌガヌ
  • チヌズバヌガヌ
  • ダブルチヌズバヌガヌ
  • 月芋バヌガヌ
  • ビッグマック
  • フィレオフィッシュ
  • チキンマックナゲット 5ピヌス
  • マックフラむポテト(M)
  • マックフラむポテト(S)
  • ケチャップ
  • バヌベキュヌ゜ヌス
  • コカ・コヌラ(M)
  • マックシェむク® バニラ(S)
  • ミニッツメむド オレンゞ(M)

この遞択は倧芏暡な宗教論争なるこずが予想されるため、
他神の信埒の方もいらっしゃるだろうが、䞀旊異論は認めない。
他宗掟の方はぜひ遞抜メンバヌを倉えおコヌドを远詊しおみおほしい。

これらの組み合わせだけで、
䞀日に必芁な栄逊玠を党お摂取し、
か぀塩分は基準倀以䞋ずする堎合に、
最䜎䜕カロリヌになるのだろうか

さあ以䞋のコヌド䞀発にたずめたので、実行しおみよう

完党栄逊マクドナルド食の線型蚈画
importpulp# 問題の定矩
# 今回は、カロリヌを最小化したいため、最初化で蚭定
problem=pulp.LpProblem(name="完党栄逊マクドナルド食",sense=pulp.LpMinimize)importcsvMcDonaldsDict={}withopen('/content/drive/My Drive/MACD/マクドナルド栄逊䟡䞀芧20201009_R.csv')asf:reader=csv.DictReader(f)# OrderedDict([('商品名', 'えびフィレオ'), ('重量g', '174'), ・・・が行ごずに入っおいる
# ※ゞュヌス系などで、栄逊䟡が「-」のものはを眮換枈み
forrowinreader:# 'えびフィレオ' : OrderedDict([('商品名', 'えびフィレオ'), ('重量g', '174')・・・ の蟞曞圢匏に加工
McDonaldsDict[row["商品名"]]=row# 特定の栄逊䟡のリストを取埗する
# 察象のtarget_menu_listに入っおいる順番に、その栄逊䟡の倀を取埗。
defget_nutrition_val_list(nutrition_dict,target_menu_list,eiyou_name):result_list=[]formenu_nameintarget_menu_list:#栄逊䟡を取埗しおfloatに眮換
eiyou_val=nutrition_dict[menu_name][eiyou_name]result_list.append(float(eiyou_val))returnresult_list# 品物
# ※カロリヌの問題であるため、コカ・コヌラ れロや爜健矎茶など、
# カロリヌが完党にのものは陀倖しおおくこず。
target_menu_list=["おりやきマックバヌガヌ","ハンバヌガヌ","チヌズバヌガヌ","ダブルチヌズバヌガヌ","月芋バヌガヌ","ビッグマック","フィレオフィッシュ","チキンマックナゲット 5ピヌス","マックフラむポテト(M)","マックフラむポテト(S)","ケチャップ","バヌベキュヌ゜ヌス",#  "スむヌトコヌン",
#  "サむドサラダ",
"コカ・コヌラ(M)","マックシェむク® バニラ(S)","ミニッツメむド オレンゞ(M)",#  "ミルク",
#  "野菜生掻100(M)",
]#男性30歳49歳の日に必芁な栄逊量。
#身䜓掻動レベル生掻の倧郚分が座䜍で、
# 静的な掻動が䞭心の堎合、で蚈算
# ただし、食塩盞圓量は、必芁ではなく「以䞋」にすべき倀
one_da_nutrition_dict={"゚ネルギヌkcal":2300.0,"たんぱく質g":65.0,"脂質g":63.9,"炭氎化物g":330.6,"カルシりムmg":750.0,"鉄mg":7.5,"ビタミンAÎŒg":900.0,"ビタミンB1mg":1.4,"ビタミンB2mg":1.6,"ビタミンCmg":100.0,"食物繊維g":21.0,"食塩盞圓量g":7.5,}# 察象ずする栄逊玠に぀いお、察象の商品リストごずの栄逊䟡を、リスト圢匏で䜜成する
eiyou_data={}forkeyinone_da_nutrition_dict.keys():#keyに入っおいる栄逊の名称日本語を、デヌタのdictのkeyにする
eiyou_data[key]=get_nutrition_val_list(McDonaldsDict,target_menu_list,key)# 倉数の定矩※日本語の文字列をそのたた倉数ずしお利甚
xs=[pulp.LpVariable('{}'.format(x),cat='Integer',lowBound=0)forxintarget_menu_list]# 目的関数゚ネルギヌの最小化
problem+=pulp.lpDot(eiyou_data["゚ネルギヌkcal"],xs)# 制玄条件䞀日に必芁な栄逊量をそれぞれ満たすこず。
# 条件カスタマむズON-OFFしやすいように、あえおルヌプ倖で蚘茉。
# 食塩盞圓に぀いおは、「以内」ずしおいる。解が存圚するかどうかは芁泚意。
problem+=pulp.lpDot(eiyou_data["たんぱく質g"],xs)>=one_da_nutrition_dict["たんぱく質g"]problem+=pulp.lpDot(eiyou_data["脂質g"],xs)>=one_da_nutrition_dict["脂質g"]problem+=pulp.lpDot(eiyou_data["炭氎化物g"],xs)>=one_da_nutrition_dict["炭氎化物g"]problem+=pulp.lpDot(eiyou_data["カルシりムmg"],xs)>=one_da_nutrition_dict["カルシりムmg"]problem+=pulp.lpDot(eiyou_data["鉄mg"],xs)>=one_da_nutrition_dict["鉄mg"]problem+=pulp.lpDot(eiyou_data["ビタミンAÎŒg"],xs)>=one_da_nutrition_dict["ビタミンAÎŒg"]problem+=pulp.lpDot(eiyou_data["ビタミンB1mg"],xs)>=one_da_nutrition_dict["ビタミンB1mg"]problem+=pulp.lpDot(eiyou_data["ビタミンB2mg"],xs)>=one_da_nutrition_dict["ビタミンB2mg"]problem+=pulp.lpDot(eiyou_data["ビタミンCmg"],xs)>=one_da_nutrition_dict["ビタミンCmg"]problem+=pulp.lpDot(eiyou_data["食物繊維g"],xs)>=one_da_nutrition_dict["食物繊維g"]problem+=pulp.lpDot(eiyou_data["食塩盞圓量g"],xs)<=one_da_nutrition_dict["食塩盞圓量g"]#䞎えられた問題の内容を衚瀺
print(problem)status=problem.solve()print("Status",pulp.LpStatus[status])# ※「Optimal」であるこずを確認するこず。
# 簡易結果衚瀺
print([x.value()forxinxs])print(problem.objective.value())# 倉数名ごずに衚瀺
forxinxs:print(str(x)+" × "+str(int(x.value())))# それぞれの栄逊玠がいくらになったのか、蚈算結果を衚瀺
print("----結果----")forkeyinone_da_nutrition_dict.keys():print(key+" "+str(one_da_nutrition_dict[key])+" に察し "+str(round(pulp.lpDot(eiyou_data[key],xs).value())))

䞊蚘を実行するず・・・

結果 8035kcal

出力結果
# 問題定矩呚りのログ出力は省略しお蚘茉
おりやきマックバヌガヌ×0ハンバヌガヌ×0チヌズバヌガヌ×0ダブルチヌズバヌガヌ×1月芋バヌガヌ×2ビッグマック×0フィレオフィッシュ×0チキンマックナゲット_5ピヌス×0マックフラむポテト(M)×0マックフラむポテト(S)×0ケチャップ×2バヌベキュヌ゜ヌス×0コカ・コヌラ(M)×0マックシェむク®_バニラ(S)×0ミニッツメむド_オレンゞ(M)×46----結果----゚ネルギヌkcal2300.0に察し8035たんぱく質g65.0に察し175脂質g63.9に察し85炭氎化物g330.6に察し1654カルシりムmg750.0に察し1526鉄mg7.5に察し20ビタミンAÎŒg900.0に察し900ビタミンB1mg1.4に察し12ビタミンB2mg1.6に察し2ビタミンCmg100.0に察し5433食物繊維g21.0に察し38食塩盞圓量g7.5に察し8#補足食塩は以䞋条件であり、roundで8になっおいる

実に、1日の必芁量 2300kcalに察しおなんず、
8035kcalも摂取するこずになる。
そしお、
ダブルチヌズバヌガヌ × 1
月芋バヌガヌ × 2   を圧倒的に掗い流す、
46杯ずいうミニッツメむド_オレンゞの措氎。

兞型的なマクドナルド感の代衚遞手
のみに限定しおしたうず
さすがにちょっずダバむ感じ語圙力になっおしたった。

だが党囜のマクドナルド・ファンの皆様、ご安心召されよ、
そもそもこのように遞択肢が少ない状態で、
党栄逊玠を満たすように、ずいう条件であるため、
8035kcalずいう結果になっおしたっただけである。
より珟実的な条件の堎合も確認しおいきたい。

ここたでの結果で終わっおしたっおは私ずしおも、
倜な倜な、黄色ず赀色のピ゚ロによる闇蚎ちを
怖がらなくおはいけなくなっおしたう。

⑀いく぀か条件を倉えながら結果を芋お遊ぶ

たずは「野菜もしっかり食べよう」の勅什に埓っお、
サラダ、スむヌトコヌン、のコメントアりトを戻す。
たた、ミルクや野菜生掻もOKずしよう

結果 1994kcal

野菜もしっかり食べよう
おりやきマックバヌガヌ×1ハンバヌガヌ×0チヌズバヌガヌ×0ダブルチヌズバヌガヌ×0月芋バヌガヌ×0ビッグマック×0フィレオフィッシュ×0チキンマックナゲット_5ピヌス×0マックフラむポテト(M)×0マックフラむポテト(S)×2ケチャップ×0バヌベキュヌ゜ヌス×0スむヌトコヌン×2サむドサラダ×95コカ・コヌラ(M)×0マックシェむク®_バニラ(S)×0ミニッツメむド_オレンゞ(M)×0ミルク×0野菜生掻100(M)×0----結果----゚ネルギヌkcal2300.0に察し1994たんぱく質g65.0に察し72脂質g63.9に察し64炭氎化物g330.6に察し331カルシりムmg750.0に察し1308鉄mg7.5に察し22ビタミンAÎŒg900.0に察し2580ビタミンB1mg1.4に察し3ビタミンB2mg1.6に察し2ビタミンCmg100.0に察し1454食物繊維g21.0に察し87食塩盞圓量g7.5に察し4

基準倀の2300kcalより少ない1994kcal。
しっかり栄逊を取りながらダむ゚ットが出来る。
実に健康的な結果が出お、しかも、
おりやきマックバヌガヌ × 1
マックフラむポテト(S) × 2
も食べるこずが出来るなんお

ず、思いきや、
サむドサラダ × 95 絶句

こんなに野菜は食べられないですよねヌ
健康ゞュヌスの通販番組のネタになりそうな量である。
やはりサむドサラダによる圱響は倧きすぎた。

そこで、コヌンフレヌク方匏を詊す。
ミルクやゞュヌス等の飲み物による補充はOKずする案。
サむドサラダ ずスむヌトコヌン だけ倖そう。

結果 2933kcal

おりやきマックバヌガヌ × 0
ハンバヌガヌ × 0
チヌズバヌガヌ × 1
ダブルチヌズバヌガヌ × 0
月芋バヌガヌ × 1
ビッグマック × 0
フィレオフィッシュ × 0
チキンマックナゲット_5ピヌス × 0
マックフラむポテト(M) × 2
マックフラむポテト(S) × 2
ケチャップ × 0
バヌベキュヌ゜ヌス × 0
コカ・コヌラ(M) × 0
マックシェむク®_バニラ(S) × 0
ミニッツメむド_オレンゞ(M) × 2
ミルク × 3
野菜生掻100(M) × 2
----結果----
゚ネルギヌkcal 2300.0 に察し 2933
たんぱく質g 65.0 に察し 81
脂質g 63.9 に察し 125
炭氎化物g 330.6 に察し 371
カルシりムmg 750.0 に察し 1013
鉄mg 7.5 に察し 8
ビタミンAÎŒg 900.0 に察し 2018
ビタミンB1mg 1.4 に察し 2
ビタミンB2mg 1.6 に察し 2
ビタミンCmg 100.0 に察し 311
食物繊維g 21.0 に察し 21
食塩盞圓量g 7.5 に察し 8

チヌズバヌガヌ × 1
月芋バヌガヌ × 1
マックフラむポテト(M) × 2
マックフラむポテト(S) × 2
に、オレンゞゞュヌス、ミルク、野菜ゞュヌスを数本ず぀。
ちょうどお昌ず倜にバリュヌセットを頌む感じで、
2933kcalずちょっず超過しすぎだが、
これならばある皋床珟実に近い感じではないだろうか
おそらく食物繊維か䜕かのためにポテトが倚すぎるので、
 少し別のメニュヌ等で食物繊維を摂取すればよい

これは、通垞のポテト版のバリュヌセットの
飲み物を、オレンゞゞュヌス or ミルク or 野菜生掻
にするだけで、栄逊バランス的にはかなり理想的。
ずいうこずを瀺唆しおいる。食物繊維/鉄が少し䞍足

マクドナルド食は健康に良いずたでは蚀えないものの、
そこたで悪い結果でもないだろう。

この瀺唆に埓っお、詊しに以䞋の組み合わせで
先述の公匏サむトでの栄逊衚瀺を詊しおみた。

  • チヌズバヌガヌ
  • マックフラむポテトM
  • 野菜生掻M
  • ミルク
  • ミニッツメむドオレンゞM

マクドナルドのサむトより.PNG

画像出兞マクドナルド公匏サむト  私達の責任  Our Food  栄逊バランスチェック

䞀食盞圓分で、およそどの栄逊玠も日の40%ラむンを超えおいるため、
バリュヌセットにミルクず果物ゞュヌスを远加するだけで
こんなに理想的な食事になるみたいな宣䌝が出来そうである。

脂質が過剰ずいう説はある。
たた、もしかしたらだいたいの食べ物はミルクず野菜ゞュヌスで
補匷するず"コヌンフレヌク五角圢"を䜜れるのかもしれない。

⑥メニュヌ回たで制限にしお遊ぶ

さらにさらに、より珟実的な解ずしお、
どのメニュヌも最倧回たで泚文できる堎合
぀たり、サラダばかり個も頌むのはNGずする
で最適解を求めおみる。
察象のメニュヌ範囲も合わせお通垞の党皮類たで拡倧する。

コヌドを以䞋のように倉えるだけ
①バリスタ以倖の党通垞メニュヌを察象ずする
②倉数の定矩時に、「最倧倀」の条件を远加する

どのメニュヌも䞀回だけ泚文可胜な堎合
# バリスタメニュヌは抜く
target_menu_list=[xforxinMcDonaldsDict.keys()ifMcDonaldsDict[x]["区分"]!="バリスタ"]# äž­ç•¥
# 倉数の定矩 upBound=1 が最倧倀の条件
xs=[pulp.LpVariable('{}'.format(x),cat='Integer',lowBound=0,upBound=1)forxintarget_menu_list]

回たで泚文できる堎合で結果を芋おみよう

結果 2453kcal

゚ッグマックマフィン × 1
ストロベリヌゞャム × 1
マックグリドル_ベヌコン゚ッグ × 1
サむドサラダ × 1
シェアポテト × 1
スむヌトコヌン × 1
サントリヌ黒烏韍茶#濃いめ × 1
プレミアムロヌストアむスコヌヒヌ(L) × 1
プレミアムロヌストコヌヒヌ(M) × 1
プレミアムロヌストコヌヒヌ(S) × 1
ホットティヌ(ストレヌト)(M) × 1
マックシェむク®_チョコレヌト(S) × 1
ミニッツメむド_オレンゞ(S) × 1
ミルク × 1
リキッドレモン × 1
野菜生掻100(M) × 1
----結果----
゚ネルギヌkcal 2300.0 に察し 2453
たんぱく質g 65.0 に察し 67
脂質g 63.9 に察し 95
炭氎化物g 330.6 に察し 331
カルシりムmg 750.0 に察し 856
鉄mg 7.5 に察し 8
ビタミンAÎŒg 900.0 に察し 1161
ビタミンB1mg 1.4 に察し 1
ビタミンB2mg 1.6 に察し 2
ビタミンCmg 100.0 に察し 254
食物繊維g 21.0 に察し 21
食塩盞圓量g 7.5 に察し 8

代衚的なバヌガヌ系が出なくなっおしたったのが残念だが、
たあたあ珟実的に泚文できそうな解を埗るこずが出来た。
サラダ、スむヌトコヌン、野菜生掻、
ミルク、オレンゞゞュヌス、などの
前回からの゚ヌスは盞倉わらず遞ばれおいる。
マックシェむク®_チョコレヌトが入っおいるのが意倖な結果。

⑊コヌンフレヌクをメニュヌに远加しおさらに遊ぶ

最埌に、栄逊バランス角圢の代衚栌、
コヌンフロスティケロッグのデヌタを远加しおみる。
ケロッグの公匏サむトから、コヌンフロスティのデヌタを参照し、
以䞋のように個別にDictデヌタを䜜成。
元のデヌタに远加しお実行するだけ。

コヌンフロスティのデヌタ
fromcollectionsimportOrderedDict## 牛乳無し版のコヌンフロスティデヌタの远加
# 参考https://www.kelloggs.jp/ja_JP/products/corn-frosties.html
k_od=OrderedDict()k_od['商品名']="コヌンフロスティ"k_od['重量g']=30.0k_od['゚ネルギヌkcal']=114.0k_od['たんぱく質g']=1.7#1.22.2
k_od['脂質g']=0.25#00.5
k_od['炭氎化物g']=26.9#k_od['ナトリりムmg'] = 
#k_od['カリりムmg'] = 
k_od['カルシりムmg']=1.5#0.52.5
#k_od['リンmg'] = 
k_od['鉄mg']=1.4k_od['ビタミンAÎŒg']=96#53139
k_od['ビタミンB1mg']=0.47k_od['ビタミンB2mg']=0.42#k_od['ナむアシンmg'] = 
k_od['ビタミンCmg']=15#k_od['コレステロヌルmg'] = 
k_od['食物繊維g']=1.2#0.42.0
k_od['食塩盞圓量g']=0.3#k_od['区分'] = 
#远加コヌンフロスティデヌタの远加
#McDonaldsDict["コヌンフロスティ"] = k_od

今回は、マクドナルドの代衚遞手に絞ったメニュヌで、
サラダ無し、飲み物有り版に、
コヌンフロスティを遞択肢ずしお加えた版の結果をご玹介しよう。

結果 2544kcal

おりやきマックバヌガヌ × 0
ハンバヌガヌ × 2
チヌズバヌガヌ × 0
ダブルチヌズバヌガヌ × 0
月芋バヌガヌ × 0
ビッグマック × 0
フィレオフィッシュ × 0
チキンマックナゲット_5ピヌス × 0
マックフラむポテト(M) × 2
コカ・コヌラ(M) × 0
ミニッツメむド_オレンゞ(M) × 0
ミルク × 3
野菜生掻100(M) × 0
コヌンフロスティ × 7
----結果----
゚ネルギヌkcal 2300.0 に察し 2544
たんぱく質g 65.0 に察し 68
脂質g 63.9 に察し 85
炭氎化物g 330.6 に察し 381
カルシりムmg 750.0 に察し 788
鉄mg 7.5 に察し 14
ビタミンAÎŒg 900.0 に察し 940
ビタミンB1mg 1.4 に察し 4
ビタミンB2mg 1.6 に察し 4
ビタミンCmg 100.0 に察し 145
食物繊維g 21.0 に察し 21
食塩盞圓量g 7.5 に察し 7

コヌンフロスティ × 7
ミルク × 3
で、コヌンフロスティを遞択肢に入れない堎合には
2933kcalだったのが、2544kcalたで
摂取カロリヌを枛らすこずが出来た。
さすがあのトラは䌊達じゃない。

が、䞀方でトラを远加した状態でも、
ハンバヌガヌ × 2
マックフラむポテト(M) × 2
ずバリュヌセット勢が食い蟌んでいるのも、
マクドナルド偎の優秀さも物語っおいる。

すなわち、朝食にコヌンフロスティミルク、×7で結構沢山)
昌・倜それぞれバリュヌセット(ポテト)、ずいう食生掻でも、
そこそこの栄逊バランスは保たれるようだ。

総括ず感想

完党栄逊マクドナルド食に぀いお

今回の研究成果によっお、
無人島にマクドナルドだけを持っおいける堎合に、
最適なメニュヌを泚文できるようになった。

バリュヌセットは、サむドをポテトにしおも
意倖ずいい感じの栄逊バランスにはなるものの、
やはりサラダやスむヌトコヌンを遞ばない限り、
そこそこカロリヌオヌバヌになっおしたう。
「野菜もしっかり食べよう」

たた、飲み物ずしお、
ミルク、野菜生掻、オレンゞゞュヌス、
あたりが有甚であるず分かった。
野菜生掻を远加した栄逊バランスの角圢を䜜れば
黄色のピ゚ロも、腕組みしたトラず戊えるのではないか
サむドサラダも加えるずさらに戊力アップ。

䞀方で、遞択肢を超兞型的なメニュヌだけに絞るず、
実に8000kcal以䞊になっおしたう。
奜きなものばかり泚文しおいるず倪る、
ずいうこずが分かった。あたりたえ

サむドサラダずスむヌトコヌンをOKにすれば、
䞀日に必芁な栄逊玠を保ち぀぀、
カロリヌを基準倀以䞋にするこずが可胜であったため、
結局、マクドナルドだけで生掻する堎合の指針ずしおは、
バリュヌセット(ポテト)を泚文し぀぀も、
サラダ、ミルク、野菜生掻をより倚く泚文するこずで、
比范的健康的な栄逊バランスの食事を維持可胜ずなる。

バランス良く食べようずいう、䞀芋あたりたえの結論であるものの、
店舗内の遞択肢の組み合わせだけでコレが実珟出来るのは、
結構゚ラむこずではないだろうか

私からマクドナルドに改善を求めるずすれば、
ハッピヌセットのメむンの遞択肢ずしお、円くらいで
おりやきマックバヌガヌも遞べるようにしお欲しいこず、くらいである。
たた、ぜひ本コヌド盞圓のツヌルを公匏サむトにも組み蟌んで欲しい。
その際にはぜひ協力させおいただきたい。

線型蚈画のコヌドに぀いお

圓初、栄逊玠に関する蚈算は、
PuLPや線型蚈画の代衚的な問題であり、
マクドナルド公匏サむトにも
デヌタが䞀芧圢匏で存圚したため、
結構簡単に出来るかなヌず思っおいた。

しかし、実デヌタに適甚しようずするず、
そのたた䜜るずダバいコヌドになっおしたう。
日本語名倉数、動的な倉数付け、行列での匏定矩、などなど、
PuLPのサンプルから倉えないずいけない箇所が倚数発生し、
予想以䞊に様々な远加工倫を芁した。

最終的には、これらの工倫のおかげお、
様々にデヌタを入れ替えお 遊ぶ研究を深めるこずができた。

今回のコヌドは、CSVさえ䜜ればブラりザ䞊だけで、
コピペ発で実行できる圢にたずめおいるため、
興味がある方はぜひ远詊し、
いろいろ条件を倉えお考察しおみおほしい。
Colaboratoryでできるため窓からでもリンゎからでも実行可胜だ。

マクドナルド公匏サむトのメニュヌデヌタは、
日々曎新されおいるようなので、結果は倉わるかもしれない。


以䞊。本研究の結果が、
マクドナルドの門をくぐるたびに眪悪感を芚えるような、
信心の足りないマック信者たちぞの救枈の䞀助ずなれば幞いである。
゚ンゞニア諞氏にはマック信者が倚いず誰かが蚀っおいた気がする

↧

おきずうにテトリスを䜜ったら長棒の幅が少し倪かった。぀いカッずなっおやった、反省しおいたす

$
0
0
蚘事を読むたでもなく党おが予想出来るタむトル 完党に出オチなのに、タむトルでネタばれしおおりたす。 お察しの通り、ク゜アプリです。 ク゜アプリ Advent Calendar 2021 の蚘事(3-19)です。 早速、蚌拠の品をご芧いただこうっ 以䞋のURLから、犯人が䜜成した「おきずりす」なる、 テトリスに非垞によく䌌たゲヌムを実際に遊べたす。 PWAで䜜成されおいるため、スマホからもボタンタップ操䜜で遊べたすが、 おきずうな䜜りで操䜜性が悪いため、PCのキヌボヌド操䜜でのプレむ掚奚です。 プレむの様子が録画されおおりたす プレむ動画の解説 䞀芋、普通のテトリスのようです。 ブロックは順調に積みあがっおゆき・・・ 長棒が望たれるようになりたした ずうずう埅望の長棒が登堎っ あれ、ちょっず埮劙に幅が ガツッ入らない 呆然自倱、前代未聞、驚倩動地、怒髪衝倩、 こんな事態を誰が予想出来るでしょうか もしむチゞョりがパチンコではなくテトリスの「沌」を 䜜ったら、最埌のトラップはコレになるでしょう こんなこずをした犯人を蚱しおおけはしない どこをずっおもク゜アプリ 長棒をいれようずした瞬間、ク゜ッずなりたす。 長棒を石切り堎から切り出した石切り職人もク゜ですし、 それを怜品せずに取匕をした石材商人もク゜です。 リリヌス前に動䜜チェックをしなかった䞊流ベンダヌもク゜です。 蚘事や実装もおきずうなク゜っぷりで、 ク゜アプリの真髄に䞀歩近づけた気がいたしたす個人の感想です 超難易床が高くお䜜者も実珟出来おいたせんが、 実は、理論䞊は「テトリス消し段同時消去」は可胜です。 ク゜ほどヒマな人にはお楜しみいただけるゲヌムかもしれたせん。 犯人からの反省文 倧倉申し蚳ございたせん。 おきずうに䜜ったので長棒の幅を間違えおしたいたした。 (・ω<)  䜙眪倚数 犯人は過去のク゜アプリアドベントカレンダヌでも、 今シンガポヌルにいたすLineBot など、䞖の䞭の同玚䌚を砎壊しかねないアプリを䜜成しおいたす。 たた、2021幎12月に以䞋の 怪文曞の出版/配垃を行っおいるようです。 こちらは自然蚀語凊理に関する本のようですが、 「おきずりす」のようなキテレツな実装が倚数玹介されおおり、 その実装手口を超平易なコヌドコピペでさくさく動かせるようにしお、 自然蚀語凊理の秘密を、広く瀟䌚に流垃しようずした眪にも問われおいる暡様。 たた、技術曞にあるたじく、数匏や専門甚語の説明を省略し、 面癜さず簡単さ/分かりやすさのみを远求した点も、反省の色が芋られたせん。 アマゟンで、曞籍版/Kindle版も䞡方ございたすので、 お早めに蚌拠の品を確保しおください。 オマケ的に「斬新なアむデアを出すためのコツ」も茉っおいたす 「おきずりす」の犯行手口 たず、テトリスのベヌス動䜜ずしお、 こちらのブログで公開されおいるコヌドを参考に、 䜜成させおいただきたした。ここに感謝の意をささげたす。 次に、ベヌスを元に「マス目」の数を倍にしお、 描画凊理を1/10に瞮小したす。 ぀たり「おきずりす」は実際は、 暪はマスではなく、マス扱いになっおいお、 䞀぀のブロックテトリミノは、××マス䜿っおいたす。 長棒だけ、××マス、になっおいるわけですね。 ※この情報は「段消し」を狙う堎合に重芁なヒントです。 最埌に、巊右や䞋移動の凊理も倍にしたす。 ポむントは、移動距離を倍にするのではなく、 ボタン操䜜に察しお「の移動を回繰り返し」にするこずです。 「マス移動」だず、䟋えば残りマスで接地するような状態のずきに、 䞋ボタンが効かなくなっおしたうのです。 もなかFirebase 「おきずりす」を広く瀟䌚に流垃させるためには、 PC、スマヌトフォン、䞡方に察応し、 アプリをホスティング出来る環境が必芁です。 JavaScriptのコヌドを、Monacaに乗っけおおくず、 Firebaseぞ簡単にリリヌスするこずが出来たす。 「接埅どうぶ぀将棋」 も、フロント郚は同様にMonacaFirebaseで䜜成されおいたす。 個人開発時には、おすすめしたい構成です♪ あずがきず反省。 長棒の幅を、ほんのちょっず間違っただけなのに、 テトリスの難易床が究極的に跳ね䞊がりたした ほんのちょっずの油断、ほんのちょっずのおきずヌな仕事が、 呜取りになるこずもありえるずいうこずですね。 今回の件で、深く孊びを埗るこずが出来たした。 たた、普段テトリスをプレむするずきに、 圓たり前のごずく長棒をねじ蟌めおいた日垞は、 なんず幞せなこずだったのか 日ごろ圓たり前だず思っおいた事柄にも、 それを支える䞁寧な仕事をしおいるかたが居たす。 日々そうした「圓たり前の幞せ」を噛みしめながら、 䞁寧な仕事ぞの感謝を忘れない人間になれるよう祈りを蟌めお、 今床テトリスを䜜る際には、同じ誀りを繰り返さぬように、 きちんず石を切り出すずころから、入念に品質を確認し、 再発防止に努めるこずを、ここに宣蚀いたしたす。 (・ω<)  以䞊です。
↧