90秒布教活動のすゝめ

オタクは語りがちなんです。これは仕方ないんです。
ただ、オタク内部だけでも人によって好きな領域があり、
それ以外の領域の映像なしで語りが5分もかかると、
聞いている側は意識はあの世に行ってます。

布教活動は結局90秒ぐらいが丁度いい。というお話

  • プレゼン対決
  • 好きこそ簡潔にまとめる
  • やってみる
  • NG
続きを読む

性欲の科学の感想

性欲の科学 なぜ男は「素人」に興奮し女は「男同士」に萌えるのか | オギ・オーガス, サイ・ガダム, 坂東 智子 | 医学・薬学 | Kindleストア | Amazon

2021年現在から見て約10年ほど前に話題になったらしい書籍「性欲の科学」を読了しました
ネットの検索ワードや、その当時のアメリカ人を中心としたインタビューが中心であるため
当時の状況と2020年代初頭とは状況が少し異なる部分もありますが、
根本的な人間の性欲部分は変わらなく、男女の性に関する体、心の反応の違いなどが調査や検索ワードによって如実に出ており
男の性について、女の心情について掘り下げているのがメインの話。

読書対象について

一部抜粋

ポルノファンのほとんどが、女の子たちが実際にオルガスムを得ていると思い込んでいるんじゃないかな(ほとんどの男が、自分の彼女に自分はオルガスムを与えていると思い込んでいるのと同じだよ)でもね、ほとんどの子はシーンに没頭するより、新しく買う靴のことでも考えているんじゃないの

といった、男女の基本的な違いも書いているため、
この本はぜひとも高校の保健体育に取り込んでほしいと思います。
あと、AVの男優は全員実際にオルガスムを与えていると思っていると思ってる成人男性も見てほしいと思いました。

名言並べてみる

結構名言が多かったのでざっと並べておきます

第2章 熟女人気と体のパーツの好みに関する考察より

  • 女性よりも男性の方がペニスに興味があり、大きなペニスについても男性の方がはるかに強い関心がある

確かにスーパー銭湯行くと自分は腹部周辺見ます

  • 歴史を通じて男が露出するのは精神障害と考えられてきた。それが本当だとしたら、インターネットを見れば、地球は頭のおかしい男たちの惑星だということになる。

今は二極化してますね。頭のおかしい勢がどんどん駆逐されている悲しい現実ではありますが

  • 突筆すべきことに、日本のアニメにはとてつもなく大きなペニスの男がたびたび登場し、時には少女の腕よりも長いペニスの男が登場する

第4章 セックスする前に脳が男を品定めする

  • 女性にとって、セックスは人生を一変させるほどの大きな投資になりかねない。セックスが妊娠や授乳、10年以上にわたる子育てにつながることがあるのだ。そういう役割を全うするには多大な時間とリソースとエネルギーを必要とする。

第9章 浮気妻と素人娘は競争原理と本物志向の表れ

  • あなたが男なら、ロマンス小説のヒロインには本当はこう言ってほしいのではないだろうか「ああ、あなたったら、クンニが好きだったのね?あなたがどんなにクンニ好きかよーくわかるは!あなたって支配的な、ただのクンニ好きだったのね!」
    あなたが女なら、ポルノ映画の裸の男が、涙を溜めてこう言ってくれないかと何度も思っただろう「俺は初めて会った時から、君に一目惚れだったんだよ」

第10章「支配」と「服従」あなたはどっちがお好き?

  • 男の性欲はパワフルで激しく、急を要する者である。そのおかげで、男は未知の新しい場所に足を踏み入れ、新たな体験への道を切り開くことができる。男の性欲には何者にも縛られずに、鎮まることもないので、幸運とアバンチュールを求めて長い距離を彷徨い歩く原動力におなる。日本のアニメのようなすばらしい作品を生み出す原動力にもなる。

おそらく性欲だけではないとは思いますが、そこも作品の原動力の一つにはあるとは思います。
最近は洗礼されているのでそれだけではないんですが

  • 一方女性は感情や「心」を捉えるキューを重視し、性的欲望を満足させるのに適した官能小説を生み出す。女性が反応するキューは驚くほど多岐にわたっている

思うに、性別向け作品問わず、心の心情がよく出てる作品ってどちら向けの作品もよく読んでる人が作っているのかと思います。あとは作品の本人の心情も深く追及し、議論しているようにも見れます

第11章 そして欲望はイリュージョンを生み新たな次元へ

  • ふたなりのキャラクターは、極めて女性的な肉体の持ち主だ。大抵はとても若く、巨乳で、砂時計のような体つきをしている。目は大きく、まつ毛は長く、綺麗な顔をしている。さらに彼女たちは、馬並みの巨根を備えている。

ふたなりってアニメ好きでも同人界隈に明るくないとなかなか知らないことをよくご存知で。で特徴もよく捉えてます

  • 女性の顔に悦びが表れていたら、それが「女性の快感」という心を捉えるキューとなる。女性の顔に驚きや動揺が表れていたら、「性的服従」という心を捉えるキューになる

女性作家が書く官能小説はものすごく心情が細かく描かれていて好きなんですが、そういう理由も一つあるんですね

  • BL小説は、登場人物の感情描写がメインで、生き生きとした感情が描かれていないシーンはほとんどない。体のパーツは詳細にかかれることはなく、人を犯す行為も、極めて和らいだ書き方になっている。男2人の間に明確な支配と服従の関係があるにもかかわらず、最後には決まって2人は永遠の絆で結ばれている。

BLもそうですが、男性向けの作品と女性向け作品の違いの一つが、
2人は永遠の絆で結ばれました。めでたしめでたし。
ここで終わるのが女性向け作品。続編が作られるのが男性向け。
が多い気がします

個人的にマジで!?っとなった記載

2010年代から海外でやたらと日本のアニメが普及し始めたが、これの理由の一つに
流行ったアニメの一部が貧乳キャラが多く、貧乳好きの海外男性勢が食いついた。
らしいです

やたらと変身小説について詳しい

この作者、何故か変身小説(男が女になっちゃう小説)に詳しい。何故か

よく読んでらっしゃる

  • 変身小説では、変身女性といろいろな男たちのセックスシーンがやたらと多い

  • ほとんどの変身小説にバストサイズへの異様なまでのこだわりが感じらえる

  • 主人公は元々小さい一物の持ち主であることが多いのだ。面白いことに、男が女に変わると、頭が弱くなることも多い。

よくわかります。その通りです

  • しかし最後には女になった男も女でいることになれ、新しい人生と女ならではの特権を喜んで受け入れることになる

  • 変身小説ファンの中には、単にエロチックな興味の的になるという欲求を満たしているだけの人もいるだろう。みんなが自分に憧れているというのが快感なのだ

結論

もしあなたが女性なら、あなたが太っていようが痩せていようが、AカップだろうがEカップだろうが、ママだろうがおばあちゃんだろうが、つまりあなたの特徴がどんなものであっても、たくさんの男性にとってあなたはセクシーな理想の女性なのだ
もしあなたが男性なら、あなたが攻撃的だろうが平和主義者だろうが、ダジャレ好きだろうがストイックだろうが、金持ちだろうが一文なしだろうが、傷跡があろうが虚弱だろうが、あなたに恋する女性はたくさんいる。そしてその恋にあなたが応えるなら、あなたを激しく求める女性がたくさんいるのだ

追記

この書籍は2012年の調査をベースに作成しているが、分野的に大々的に調査が難しいせいか、調査結果がまとまった記事がなかなかないが、
2018年に我らがFANZAが統計調査をしているが、何の因縁か、人気ジャンルの順位の2位の"人妻"であり、書籍による調査結果の第二位も"人妻"だったのでなにかを感じます

special.dmm.co.jp

202106読了書籍

2021年6月はどういうわけか書籍を読みまくった月でしたので軽い感想

読了

タイトル 作者
2040年の未来予測 成毛 眞
悪の出世学 ヒトラースターリン毛沢東 中川右介
ミライをつくろう! VRで紡ぐバーチャル創世記 西田 宗千佳
元コミュ障アナウンサーが考案した 会話がしんどい人のための話し方・聞き方の教科書 吉田 尚記
NETFLIX コンテンツ帝国の野望―GAFAを超える最強IT企業― ジーナ・キーティング. 翻訳:牧野 洋
東大教授が教える独学勉強法 柳川 範之

2040年の未来予測

2040年の未来予測 | 成毛 眞 | ビジネス・経済 | Kindleストア | Amazon

概要

表題の通り、2040年の医療や5G以降など技術的な予想、現実ベースにした日本の老人が今よりも多くなることによる年金や温暖化の進行等、社会問題などの概要をまとめた書籍。

感想

未来技術の予想は難しく、社会問題の予想は大体が悪い方向に予想は可能ではあると思ったが、それを解決に向かう技術が20年後までにどこまで実現しているかは予想が難しいな。少なくても20年後は温暖化で暑くなっているのは間違いなさそう

悪の出世学 ヒトラースターリン毛沢東

https://www.amazon.co.jp/dp/B00K665VUM/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

概要

(Amazonの概要文より)ヒトラースターリン毛沢東の権力掌握術を分析。若い頃は無名で平凡だった彼らは、いかにして自分の価値を実力以上に高め、政敵を葬り、反対する者を排除して有利に事を進め、すべてを制したか。

感想

書籍を読み切った際に感想を書いております

onthebacksoftheflyer.hatenadiary.jp

読み切って数週間経ちましたが、今思うと 毛沢東とかはヒトラースターリンを多少なりとも見ながら行動できた点、少し有利に働いたかと思う。実際はそれよりも現場を知らない毛沢東の上司に問題があったようだ どこの世界にも現場と本部との乖離はいいことを産まないようだと

ミライをつくろう! VRで紡ぐバーチャル創世記

https://www.amazon.co.jp/dp/B088LV7TV6/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

概要

VR元年と言われた2018年から見たAR,VRの5年前後の予想と、コロナ禍の2020年時点での中間振り返り。

読み終わって思ったこと

2018年で一気にVTuber増えたが2021年になって企業、個人あわせると1万人以上いるらしい。その中でも桐生ココといった日本だけでなく、世界に影響を与えているのはほんの一部の点、結局youtuberに遠からず、近からずな世界に見えてます。さらにスタジオやキャラクター作成などでyoutuberに比べてコストがかかる点が過酷な世界。Vtuberがどんどん大衆化し、それに比例してアンチも増えている印象。

元コミュ障アナウンサーが考案した 会話がしんどい人のための話し方・聞き方の教科書

https://www.amazon.co.jp/dp/B08G15JF7N/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

概要と感想

会話における相手が不快に思わない返し方や、会話が続きやすくなる返し方。また場所やシチュエーションごとの会話の返答方法や、自分に興味がなかった話題が上がったときの相手が不快に思わなくかつ自分も興味を持たせるような会話の続け方など、プライベートに超使える会話術 あとはこれのビジネスでの会議での発言集的な本があればいいのだが

NETFLIX コンテンツ帝国の野望―GAFAを超える最強IT企業―

https://www.amazon.co.jp/dp/B07RPL1Y6M/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

概要と感想

NETFLIXがFANNGの一角になる前の起業から郵便でのDVDレンタル事業から、インターネットでの顧客の好みの映画を読み取り、それをレコメンドする「シネマッチ」を用いた他社の差別化。ネットを武器にして2000年代後半の最大のライバルだった全米大手のDVDレンタル会社「ブロックバスター」(日本でいうTSUTAYA)の打倒に向けたNETFLIXの創業者(マーク・ランドルフとリード・ヘイスティングス。特にヘイスティングス)を中心としたNETFLIXのドキュメンタリー

当然NETFLIX中心の著書となっているが、NETFLIXの苦難や事実をベースとした動きなどでNETFLIXがどうやって巨大化していくかを見れた スタートアップは生き残るのがごく一握りであり、時代によって淘汰される場合もあると実感しているが、そこにどうやって生き残るかというのがメインのドキュメントのように見えた

東大教授が教える独学勉強法

https://www.amazon.co.jp/dp/B00R2X26W8/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

概要と感想

学校での詰め込み学習ではなく、独学で勉強する際の目標設定の重要さ。目標に向けた達成度の設定(厳しく設定するとすぐにモチベーションがなくなるため長期的な目線でゆっくりと)。答えがない学問へのアプローチ方法など 人によって勉強方法があると思うが、これはその一つとしてみると自分なりのヒントが得れるかもしれないなと思った

小説8050感想

小説8050読了したので感想を

https://www.amazon.co.jp/%E5%B0%8F%E8%AA%AC8050-%E6%9E%97-%E7%9C%9F%E7%90%86%E5%AD%90/dp/4103631112/ref=tmm_hrd_swatch_0?_encoding=UTF8&qid=&sr=

登場人物

この小説は家族を主にして、そこから付随して登場人物が出てきているので、ここでは家族のみを

大澤家 年齢 職業 その他
大澤 正樹 父親 50代 歯科開業医 語り部
大澤 節子 母親 50代 専業主婦
大澤 翔太 20歳前後 引きこもり
大澤 由依 22歳前後 早稲田大→就職

概要兼感想

8050問題は、子供が10代ないし20代ごろから引きこもってしまい、そのまま社会に復帰することができずに、気がついたら親が80代、子供が引きこもりの50代となってしまい、年金頼りの生活。また親が死んだら子供の行き場所がなくなってしまう問題のことを指している

ja.wikipedia.org

ただし、本作では8050家族ではなく両親は50代、引きこもっている子供は20歳前後となっている

まずメインとなる大澤家はどこにでもいそうな典型的な人物で構成されている。 語り部兼メインの正樹(父親)は性格共々、典型的な50代子持ち夫。 妻の方も性格もいそうなタイプの50代の専業主婦、 子供が自立したら30年前後付き合ったが性格のずれから離婚願望がある夫婦となっている。

特に正樹(父親)については

  • 行動が短絡的。やや短気。
  • 俺の中で世界は完結している。していないことは思い通りに短絡的にする。自分の中で決めつけ
  • 子供=自分の所有物。
  • 翔太が引きこもりになったのは俺のせいではない。妻や姉のせい。
  • 節子については楽天的であまり考えていないと思っていた。引きこもりに対して行動するまでは

と、どこにでもいそうなダメな夫が強調されており、子供を持つと夫はこうなるのかと思うとゾッとするとものだ

また引きこもっている翔太に対して正樹がメインで動いて、短絡的な夫を止める節子がブレーキ役として動いているが、どちらの行動も悪手に思えて、それを特に正樹が自覚していない点が憎くて、作者の長い結婚生活で夫をよく見ているなと思った

ここで書いている自分の周りには子供を持ち始めた同僚、同郷が増えているが、引きこもりは私の子供はこうならないというのが一番ありえないことで、誰にでもなる典型問題であり、立ち向かい方が非常に難しい問題であり、引きこもり理由もそれぞれ違うので"これ"が解決方法というのはないと思うが、それでも一つの参考になりそうな物語の作り方だと思った

個人的には文章的には読みやすい内容になっているが、内容は映画「DAU. ナターシャ」以来の心を抉ってくる作品。

悪の出世学 ヒトラー、スターリン、毛沢東

書籍:悪の出世学 ヒトラースターリン毛沢東 を読了したので簡単な感想を www.amazon.co.jp

20世紀のヤヴェぇやつ代表格のヒトラースターリン毛沢東の出世についてフォーカスした本

この3人の共通点として出世前の上司(レーニン等)がおり当然トップではないが、 党の中では何かしらの形でいないと運営が回らないポジションを掴み取った。 序列では下となっている場合でも自らの権力や能力で出来ることを最大限に活かして出世し、 反対派を粛清しているなどやり方はともかくだが、反対派を締め出すことには成功しており、 それにより独裁を保つことに成功している。 あと3人ともどこかしらで投獄されていたりしているが、そこからの復活もやり方はともかくうまい。

特にヒトラーは後のスティーブ・ジョブズの"カリスマがあり、いなくなった途端に党や企業の価値が一気に下がるため、考え方が極端だが結局いないと運営が回らない"という点でなかなか似ているかと感じた

後の実績についてはあれなので決して賞賛できないが、出世についてはうまくやってるなと思った

機械学習から短文を作らせた話(実装編)

機械学習であれな文章を使って単語を学習させ、短文を作らせるようにした話 のやったことの詳細です

ただし、この方法については既存のフレームワークは使用しておらず
書籍:"ゼロから作るDeep Learning❷"で提供されているライブラリをベースにしているため、
前提としてここのライブラリが必要になります

www.oreilly.co.jp

(一応githubでソースは公開されていますが、おそらく購入特典かと思いますので、ここでは掲載しません。。)

また、ここで示した方法は簡易的であるため精度についてはあまりよくないです。
本格的な自然言語処理については別の方法をご確認ください

大雑把な流れは下記になります。

  1. 環境整備
  2. ノクターンノベルから年間Top3の作品をスクレイピング
  3. スクレイピングした文章を単語ごとに分割する"わかち"
  4. 機械学習を用いて文章を学習させる。
  5. 学習させたたモデリングを使って、入力した単語から短文を作成する

前提

環境はローカルで全部実行する方法が一番シンプルかと思いますが、
我が家のMacbook Air M1のスペックでも、進行具合を見るに学習時に2,3日かかることが予想されました。
ここではすでにある程度環境整備が済んでいるGoogle Colabと、
ローカルを併用して実行することとします

0.環境整備

ローカル編

ここではすでに"ゼロから作るDeep Learning❷"のライブラリをローカルに展開し
必要なライブラリをインストールしていることを前提として話を進めます。
使用するフォルダ及びファイルは下記になります

(root)
|-common
|-dataset
   |- ptb.py
|-ch06
   |- better_rnnlm.py
   |- rnnlm_gen.py
   |- train_better_rnnlm.py
|-ch07
   |- generate_better_text.py

Google Colab編

必須ではないです。ローカルでも全て実行可能です。

ファイルは2つ作ります。
スクレイピング用のcolabについては、適当なgoogle driveに新たにフォルダを作成し、そこをベースにgoogle colaboratoryを作成します
下記は一例です

f:id:onthebacksoftheflyer:20210313142623p:plain
スクレイピング実行一例

1.スクレイピング

まずノクターンノベルから作品をスクレイピングします。
自分はここについてはGoogle Colabで実行しております

google colaboratoryを新規作成します。
ブラウザ上でPythonコードを入力できる状態にします
ライブラリをインストールするために、下記をインストールします

!pip install readability-lxml
!pip install html2text
!pip install janome

次にライブラリをインポートします。

import requests
import urllib
from bs4 import BeautifulSoup
from readability.readability import Document
import html2text
import re

次にスクレイピングする作品のURL及び、スクレイピングはtxtファイルで保存されるので、そのtxtファイルの名前を設定します

# 作品URL
urls = ['https://novel18.syosetu.com/n4913gc/']
# 出力ファイル名
filename = 'nocturn_kankin.txt'

ここから本題のスクレイピングです。
ノクターンノベルの仕様上、ユーザーエージェントとcookieにてover18かどうかの設定が必要になります
注)結構時間かかります(20分前後)

text_list = []

def extract_body(url):
    #set UA
    header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0"}
   
    #set cookie
    cookie = {"over18": "yes"}

    page = 1
    is_articles = True
    body_list = []
    while is_articles:
      # URLを設定し接続     
      chapterlistUrl = "{}{}/".format(url,page)
      responseCL  = requests.get(url=chapterlistUrl, headers=header, cookies=cookie)
      chapterlistHtml = responseCL.content
      if page == 1 or page % 10 == 0:
        print('page_{0}:実行中'.format(page))
        print(chapterlistUrl)
      # ページごとに本文を抽出
      soup = BeautifulSoup(chapterlistHtml, "html.parser")
      bodys = soup.find_all("div", id="novel_honbun")
      if len(bodys) != 0:
        for body in bodys: 
          body_list.append(body.text)
        page += 1
      else:
        is_articles = False
    body_text = ' '.join(body_list)
    return body_text

for url in urls:
    print(url)
    text_list.append(extract_body(url))

これが終わると、作品の小説がリストとして出来上がります
あとはそれをtxtにしてダウンロードします

with open(filename, 'w', encoding='utf-8') as f:
   for x in text_list:
       f.write(str(x) + ";;\n")
print("file is saved")

生成したtxtファイルをダウンロードします

from google.colab import files
files.download(filename)

続きに行く前に、このモデルは学習用作品、テスト用作品、パラメータ調整検証用作品の三つが必要ですので
3作品以上スクレイピングが必要になります。
一番いいのは1作品を学習用、テスト用、検証用の三分割にする方がいいと思いますが、ここでは簡易的に3作品をスクレイピングする形とします。

2.わかち

これで作品をtxtファイルにできました。ただし、現時点では文章は単語同士で繋がっており、このままだと機械学習にかけても大したものはできません。
文章を単語に分ける必要があります。これを"わかち"と呼ぶようです
ここではMecabを使ってわかちを実行します。こういうツール開発チームには頭が上がりません taku910.github.io


まずMeCabをインストールします。ここではmacを想定します

$ brew install mecab
$ brew install mecab-ipadic
$ pip install mecab-python3

続いて、MeCabの性能を引き上げるために、neologd辞書をインストールします

$ brew install mecab mecab-ipadic git curl xz # 必要なもののみインストールする
$ git clone --depth 1 git@github.com:neologd/mecab-ipadic-neologd.git
cd mecab-ipadic-neologd
./bin/install-mecab-ipadic-neologd -n


ここでは新たにフォルダー(例:wakachi)を作りその中で作業をします。
この中に先ほどダウンロードファイルと、新たに一つファイルを作成します(wakachi.py)

(root)
|-wakachi
   |- wakachi.py
   |- nocturn_kankin.txt

そしてwakachi.pyは下記のようにします

###使用方法
# コマンド実行
#$ python wakachi.py nocturn_kankin.txt
###
# mecab 大文字小文字に注意
import MeCab
# datetime
import time
# 引数取得
import sys
from sys import argv
import os

def mecab_parse(data):
    # 分かち書きのみ出力する設定にする
    mecab = MeCab.Tagger('-Owakati -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd -b 16384')
    text = mecab.parse(data)
    
    return text

def splitStr2(str, num):
    l = []
    for i in range(num):
        l.append(str[i::num])
    l = ["".join(i) for i in zip(*l)]
    rem = len(str) % num  # zip で捨てられた余り
    if rem:
        l.append(str[-rem:])
    return l

# mecabの読み込み限界文字列数
limit = 2600000
print('実行中…')
# 引数の取得
input_file_name= sys.argv[1]

# 解析対象テキストファイルを開く
f =  open(input_file_name,'r')
# ファイルを読み込む
data = f.read()

text = ''
if len(data) > limit:
    mecab_list = []
    strLists = splitStr2(data, limit)
    for data_str in strLists:
        text = data_str + '\n'
    text = mecab_parse(data)

else:
    # 分かち書きのみ出力する設定にする
    text = mecab_parse(data)

# ファイル
# 同一ディレクトリに出力
replace_input_file_name = input_file_name.replace('.txt', '')
out_file_name = replace_input_file_name + "_wakachi.txt"
try:
    os.makedirs(replace_input_file_name)
    with open(os.path.join(replace_input_file_name, out_file_name), 'w') as f:
        f.write(text)
except FileExistsError:
    with open(out_file_name, 'w') as f:
        f.write(text)
print('ファイル出力完了 ファイル名:'+ out_file_name)

そして、コマンドラインからこのファイルがあるディレクトリへ移動し、下記を実行します

$ python wakachi.py nocturn_kankin.txt

これでわかちができます

文字数が多い場合

ただし、文字数があまりにも多いとMecabが対応できません。その際は小説のファイルを分割します

下記ファイルを新規作成します。

###使用方法
# コマンド実行
#$ python file_split.py minimum.txt
###

# 引数取得
import sys
from sys import argv

def splitStr2(str, num):
    l = []
    for i in range(num):
        l.append(str[i::num])
    l = ["".join(i) for i in zip(*l)]
    rem = len(str) % num  # zip で捨てられた余り
    if rem:
        l.append(str[-rem:])
    return l

# mecabの読み込み限界文字列数
limit = 2000000

print('実行中…')
# 引数の取得
input_file_name= sys.argv[1]
# 解析対象テキストファイルを開く
f =  open(input_file_name,'r')
# ファイルを読み込む
data = f.read()

if len(data) > limit:
    mecab_list = []
    strLists = splitStr2(data, limit)
    for index, data_str in enumerate(strLists):
        #出力ファイル名
        out_file_name = input_file_name.replace('.txt', '') + "_" + str(index) + ".txt"
        with open(out_file_name, 'w') as f:
            f.write(data_str)
        print('ファイル出力完了 ファイル名:'+ out_file_name)

そして下記コマンドを実行すると、ファイル名のフォルダが作成され、その中に分割したファイルが出力されます

$ python file_split.py nocturn_kankin.txt

これでわかちができました。

機械学習を用いて文章を学習させる。

いよいよ本題です。
わかちファイルを用いて実際にモデルを作成します

データセットの整備

まず、datasetについて設定します。
ここでは先ほどのtxtファイルとptb.pyファイルを設定します

(root)
|-common
|-dataset
   |- ptb.py
   |- nocturn_kankin_wakachi.txt (例: 学習用)
   |- nocturn_tensei_slave_wakachi.txt(例: テスト用)
   |- nocturn_tundele_wakachi.txt(例: 検証用)

次にptb.pyの整備を行います。中身は教材ではgithubからtxtをダウンロードする形ですが
今回はローカルにtxtがあるのが前提ですので、それに合わせます

# coding: utf-8
import sys
import os
sys.path.append('..')
try:
    import urllib.request
except ImportError:
    raise ImportError('Use Python3!')
import pickle
import numpy as np


key_file = {
    'train':'nocturn_kankin_wakachi.txt', #学習用ファイル(ファイル名に合わせてください)
    'test':'nocturn_tensei_slave_wakachi.txt', #テスト用ファイル(ファイル名に合わせてください)
    'valid':'nocturn_tundele_wakachi.txt' #検証用ファイル(ファイル名に合わせてください)
}
save_file = {
    'train':'nocturn.train.npy',
    'test':'nocturn.test.npy',
    'valid':'nocturn.valid.npy'
}
vocab_file = 'nocturn.vocab.pkl'

dataset_dir = os.path.dirname(os.path.abspath(__file__))


def load_vocab():
    vocab_path = dataset_dir + '/' + vocab_file

    if os.path.exists(vocab_path):
        with open(vocab_path, 'rb') as f:
            word_to_id, id_to_word = pickle.load(f)
        return word_to_id, id_to_word

    word_to_id = {}
    id_to_word = {}
    data_type = 'train'
    file_name = key_file[data_type]
    file_path = dataset_dir + '/' + file_name

    words = open(file_path).read().replace('\n', '<eos>').strip().split()

    for i, word in enumerate(words):
        if word not in word_to_id:
            tmp_id = len(word_to_id)
            word_to_id[word] = tmp_id
            id_to_word[tmp_id] = word

    with open(vocab_path, 'wb') as f:
        pickle.dump((word_to_id, id_to_word), f)

    return word_to_id, id_to_word


def load_data(data_type='train'):
    '''
        :param data_type: データの種類:'train' or 'test' or 'valid (val)'
        :return:
    '''
    if data_type == 'val': data_type = 'valid'
    save_path = dataset_dir + '/' + save_file[data_type]

    word_to_id, id_to_word = load_vocab()

    if os.path.exists(save_path):
        corpus = np.load(save_path)
        return corpus, word_to_id, id_to_word

    file_name = key_file[data_type]
    file_path = dataset_dir + '/' + file_name

    words = open(file_path).read().replace('\n', '<eos>').strip().split()

    # corpus = np.array([word_to_id[w] for w in words])
    # 教材のソースをそのまま利用するとここでエラーが出るので、簡易的に細工
    if data_type == 'train':
        corpus = np.array([word_to_id[w] for w in words])
    else:
        corpus = np.array([word_to_id[w] for w in words if w in word_to_id])

    np.save(save_path, corpus)
    return corpus, word_to_id, id_to_word


if __name__ == '__main__':
    for data_type in ('train', 'val', 'test'):
        load_data(data_type)

 学習モデル

続いて学習モデルの生成です。 フォルダ構成については好みですが、ここでは新たにフォルダを切って、この中で作業をします。フォルダにはこれらファイルを格納します

(root)
|-common
   |-(教材の通り)
|-ch06
   |- rnnlm.py
   |- better_rnnlm.py
   |- rnnlm_gen.py
   |- train_better_rnnlm.py
|-ch07
   |- generate_better_text.py

から一部ファイル(rnnlm.py, better_rnnlm.py)をcommonにうつします

(root)
|-common
   |-(教材の通り)
   |- rnnlm.py
   |- better_rnnlm.py
|-dataset
   |- ptb.py
   |- nocturn_kankin_wakachi.txt (例: 学習用)
   |- nocturn_tensei_slave_wakachi.txt(例: テスト用)
   |- nocturn_tundele_wakachi.txt(例: 検証用)
|-ch06
   |- rnnlm_gen.py
   |- train_better_rnnlm.py
|-ch07
   |- generate_better_text.py

次に、その他学習ファイル、及び文章生成に必要なファイルを全て新たにフォルダを切ってまとめてしまいます
最終的なフォルダ構成は下記になります。

(root)
|-common
   |-(教材の通り)
   |- rnnlm.py
   |- better_rnnlm.py
|-dataset
   |- ptb.py
   |- nocturn_kankin_wakachi.txt (例: 学習用)
   |- nocturn_tensei_slave_wakachi.txt(例: テスト用)
   |- nocturn_tundele_wakachi.txt(例: 検証用)
|-learn
  |-generate_better_text.py
  |-train_better_rnnlm.py

次に、learn.train_better_rnnlm.pyを編集します。 具体的には教材ソースをベースに、ライブラリを一部移動し、datasetも変更したので、それを合わせます 以下は一例です

# coding: utf-8
import sys
sys.path.append('..')
from common import config
# GPUで実行する場合は下記のコメントアウトを消去(要cupy)
# ==============================================
# config.GPU = True
# ==============================================
from common.optimizer import SGD
from common.trainer import RnnlmTrainer
from common.util import eval_perplexity, to_gpu
from dataset import ptb  # ★ 今回の入力データに合わせる
from common.better_rnnlm import BetterRnnlm # 移動したbetter_rnnlmにパスを合わせる


# ハイパーパラメータの設定
batch_size = 20
wordvec_size = 650
hidden_size = 650
time_size = 35
lr = 20.0
max_epoch = 40
max_grad = 0.25
dropout = 0.5

# 学習データの読み込み
corpus, word_to_id, id_to_word = ptb.load_data('train')  # ★コーパス変更
corpus_val, _, _ = ptb.load_data('val')  # ★コーパス変更
corpus_test, _, _ = ptb.load_data('test')  # ★コーパス変更

print(len(corpus))
print(len(corpus_val))
print(len(corpus_test))


if config.GPU:
    corpus = to_gpu(corpus)
    corpus_val = to_gpu(corpus_val)
    corpus_test = to_gpu(corpus_test)

vocab_size = len(word_to_id)
xs = corpus[:-1]
ts = corpus[1:]

model = BetterRnnlm(vocab_size, wordvec_size, hidden_size, dropout)
optimizer = SGD(lr)
trainer = RnnlmTrainer(model, optimizer)

best_ppl = float('inf')
for epoch in range(max_epoch):
    trainer.fit(xs, ts, max_epoch=1, batch_size=batch_size,
                time_size=time_size, max_grad=max_grad)

    model.reset_state()
    ppl = eval_perplexity(model, corpus_val)
    print('valid perplexity: ', ppl)

    if best_ppl > ppl:
        best_ppl = ppl
        model.save_params()
    else:
        lr /= 4.0
        optimizer.lr = lr

    model.reset_state()
    print('-' * 50)


# テストデータでの評価
model.reset_state()
ppl_test = eval_perplexity(model, corpus_test)
print('test perplexity: ', ppl_test)

Google colabで実行

これで準備が整いました。
ここから実行するわけですが、如何せん実行しても相当重いです。
我が家のMacbook Air M1でも3日ほどかかりました。
そこで、Google colab上で実行することにします。

準備として、train_better_rnnlm.pyのヘッダの一部を変更します。config.GPUをtrueにします

# GPUで実行する場合は下記のコメントアウトを消去(要cupy)
# ==============================================
config.GPU = True
# ==============================================


次に、これら下記のフォルダ構成をgoole driveの適当なところにアップします。

(root)
|-common
   |-(教材の通り)
   |- rnnlm.py
   |- better_rnnlm.py
|-dataset
   |- ptb.py
   |- nocturn_kankin_wakachi.txt (例: 学習用)
   |- nocturn_tensei_slave_wakachi.txt(例: テスト用)
   |- nocturn_tundele_wakachi.txt(例: 検証用)
|-learn
  |-generate_better_text.py
  |-train_better_rnnlm.py

もし、一回実行したりしてpycacheフォルダがある場合は削除してください。

なおpycacheフォルダーはコンパイル済みのモジュールがキャッシュされる場所なのでアップロードはしないでください。Google Colabで実行すると自動的に生成されます

次に、learnフォルダに対して、google colaboratoryファイルを作成します 画像はいろいろ違っていますが一例です。

一例
一例

次にgoogle colaboratoryに対して以下の感じで記載します。パスは各自の構成に合わせてください google colabの一例

最後に、ランタイムをGPUに変更します。 下記画像のように設定します ランタイム変更方法1 ランタイム変更2

 実行

いよいよ実行です google colabを上から順に実行すれば、学習が開始されます ただし、これでも2,3時間かかるので気長に待ちましょう。

文章作成

前回の学習が終わると、BetterRnnlm.pklが作成されます。これを使って文章作成をします。
ここまでくると、もうすぐです。
google colab上で実行するとBetterRnnlm.pklgoogle driveに保存されるので、
まずはこれをローカルにダウンロードし(ファイルを右クリックからダウンロード可能)
learnフォルダに配置します

(root)
|-learn
  |-BetterRnnlm.pkl
  |-generate_better_text.py
  |-train_better_rnnlm.py

次にこれも好みですがcommonフォルダにch06フォルダにあるrnnlm_gen.pyを移動します

(root)
|-common
  |-rnnlm_gen.py
  |-その他

rnnlm_gen.pyのヘッダの一部を変更します

# coding: utf-8
import sys
sys.path.append('..')
import numpy as np
from common.functions import softmax
from common.rnnlm import Rnnlm #ch06.better_rnnlmから変更
from common.better_rnnlm import BetterRnnlm #ch06.better_rnnlmから変更

次にlearn.generate_better_text.pyの一部編集します

###使用方法
# コマンド実行
#$ python generate_better_text.py 入力文字列
###
# coding: utf-8
import sys
sys.path.append('..')
from common.np import *
from common.rnnlm_gen import BetterRnnlmGen #ch06から変更
from dataset import ptb

・・・
model = BetterRnnlmGen(vocab_size=vocab_size)
model.load_params('BetterRnnlm.pkl')

# python generate_better_text.py 入力文字列

# 今回のデータセットに合わせて変更。日本語に合わせる
# start文字とskip文字の設定
start_word = sys.argv[1]
start_id = word_to_id[start_word]
skip_words = []  
skip_ids = [word_to_id[w] for w in skip_words]
# 文章生成
word_ids = model.generate(start_id, skip_ids, sample_size=120)
eos_id = word_to_id['<eos>']
txt = ''.join([id_to_word[i] if i != eos_id else '。\n' for i in word_ids])
txt = txt.replace('\n\n', '\n')  # 空行の除去
txt = txt.replace('」。\n', '」\n')  # 会話の最後に句点をつけてしまったものを除去
print(txt)

ここまで来たら実行可能になります

実行

コマンドラインから実行します。
コマンドラインでgenerate_better_text.pyのあるフォルダに遷移し、下記を実行します

$ python generate_better_text.py 入力文字列

すると短文が出力されます。 以下一例です らめぇ

短文文字数調整

もし、出力文字数を変更したい場合は、generate_better_text.py のmodel.generateしているところのsample_sizeを調整します

# 文章生成
word_ids = model.generate(start_id, skip_ids, sample_size=120) ### sample_sizeの数字を上下させることで文字数調整

お疲れ様でした。

参考

今回の学習モデル作成にあたり、大いに参考になりました書籍、記事です。ありがとうございます。

名著です www.oreilly.co.jp

note.com

qiita.com

qiita.com

みずほ銀行システム統合、苦闘の19年史

みずほ銀行システム統合、苦闘の19年史を読了しましたので感想を

www.amazon.co.jp

概要

この本は大枠はみずほフィナンシャルグループ(FG)が、みずほ銀行の勘定系システムの刷新・統合プロジェクトを始まりから新システム稼働までの19年を追った内容。

前提として、もともとみずほ銀行は、

2013年7月1日に、第一勧銀を前身とする当時のみずほ銀行を、富士銀行・日本興業銀行を前身とするみずほコーポレート銀行が吸収合併し、それと同時に行名を株式会社 みずほ銀行に変更し     た。このため、現在のみずほ銀行の直接の前身は、この「みずほコーポレート銀行」・日本興業銀行・富士銀行となっている。 みずほコーポレート銀行 - Wikipedia



統合時にみずほ銀行みずほコーポレート銀行、それぞれがもともと持っていた勘定システムが、
結果として合併時は統合プロジェクトこそ動いていたものの、実際には統合されずにそれぞれ残ったままとなり、それぞれの勘定システムをリレーコンピュータでつなぐ形となっていた。


しかし統合プロジェクトことあったものの人員不足により進まなかったが、東日本大震災発生時に義援金口座として指定されていたみずほ銀行の口座に対して、
想定以上の入金があったことにより、口座のみならずシステム全体が結果として異常終了し、復旧に10日かかっている。

そのことをきっかけに勘定システムを一から作り直し、勘定システム[MINORI]を2019年リリース。



これらの一連の出来事について

という3章構成で、外からできるだけ見える範囲の状況を、著者の大元である日経コンピュータの目線から書かれている書籍になります。
(べき論等もあり著者の偏見も入ってますが)

感想

自分は実際に現場を経験していないが、別の勘定システムの保守や開発に携わったり、自治体のシステムについて、MINORI開発と同様に自動生成ツールを用いた開発を行ったことあります。
みずほ銀行ほどの巨大さややばさはなかったが、それでも毎日残業は当たり前、社内外政治による仕様変更、巨大すぎて誰も既存システムの全容がわからない。
などなど


みずほ銀行の開発案件を聞くたびに、みずほはやばい。
とネットや他のエンジニアから噂で聞いていたが、その全容は内部告発ぐらいしか当時はわからなかったが、

  • 開発関連会社1000社
  • 期間8年
  • 費用4500億円(スカイツリー7本分)
  • 工数35万人月

    と、実際に数字で見ると、本当に恐ろしい。

方針について

AS IS(現行踏襲)ではなく、[この時、こうあるべき]という、方針でできるだけ要件を定義している。
震災時に起きた障害の原因等が書籍に書かれており、その対策として経営方針としては正しいとは思うが

  • 既存の機能がわからない
  • 勘定の業務内容が開発者がわかっているわけではない。

という現場目線の問題

  • 経営者がIT。およびIT現場に疎い
  • 社内政治、事情

ことに発端する開発現場の苦闘。
さらには勘定システム開発という巨大開発費をもらえるプロジェクトに目をつけた外部ベンダーに対する争い。

日本のSI業界の負の部分がもろに出ているうなづきしかない内容となっています

終わりに

いろいろ言いましたが、IT業界,銀行業界に携わった人。
そうでなくても内容は業界外の人でもわかる用語で説明しておりますので、その点では読みやすくなっている本です。

著者の日経コンピュータの偏見も入っておりますが、
全体的にはみずほ銀行よいしょでもなくみずほ銀行を落とすでもなく、という内容となっております。
ただMINORIに携わった開発者の苦労が報われるような書籍の内容ではないのが残念であります。
エンジニア的な新しいことは書いていないので悪しからず