機械学習を使って作文を生成してみた

学校の自由課題で「税の作文」が出ているのですが、これを機械学習で生成したら面白いのではないかと思ったのでやってみました。

まず初めにマルコフ連鎖という手法を使ったのですが、この手法はあまり精度がよくなく、文章中に出てくる単語が学習元のデータと同じになってしまうことがあるので著作権などの問題があります。

そこで、今回は「危険すぎる」と話題になったGPT2を使ってやっていきます。

試しに使ってみる

まず下のコマンドでGPT2をインストールします。

git clone https://github.com/tanreinama/gpt2-japanese
cd gpt2-japanese
pip install -r requirements.txt

次に下のコマンドでsmallモデルをダウンロードして解凍します。

wget https://www.nama.ne.jp/models/gpt2ja-small.tar.bz2
tar xvfj gpt2ja-small.tar.bz2

これで文章を生成するための環境は完成しました。 下のコマンドで文章の生成を実行します。

python gpt2-generate.py --model gpt2ja-small --num_generate 1

パラメータは下の通りです。

  • --model:モデル(デフォルト gpt2ja-medium)

  • --num_generate:生成するテキスト数(デフォルト 5)

  • --context:開始する文章(デフォルト <|endoftext|>)

  • --top_k:各ステップでk個の単語からランダム選択(デフォルト 40)

  • --top_p:生成テキストを累積確立に制限(デフォルト 0、制限なし)

  • --temperature : 温度(デフォルト1、推奨0.7〜1.0)

  • --min_length:文章の最小の長さ(デフォルト 0、最大 1024)

  • --max_length:文章の最大の長さ(デフォルト 500)

結果は下のようになりました。

ただ、ここまで書いてきた時点で、その可能性はゼロに等しいと思うのですが・・。

「私、この小説で、お前らに付けられた賞は、何だろう…と、私たちを見て思った」とか「誰だって、お前らの作品があの世で、あるいは、私たちの作品でもない限りは、こんなことなんだろう…と思っている」とか「私たちは、こうすることができる」ということになるのは、普通は考えにくいものですので。

ただ、やはり…

「私たち」ならば、その「あり方」が一番あり得たものです。

「あり方」が、「あり方」が、「あり方」が。

それらが、何らかの理由で、「あり方」の「あり方」が「私たち」にとって「あるべきもの」であってこそ、「無かったことができる」という現象になるかもしれません。

「あり方」の「あり方」は、「あり方」が「あり方」から見た見た、世界観です。

それを前提にしているのであれば、「無かったことができる」という過程も一緒です。

もし、「あり方」が「あり方」との「あり方」を否定する場合であれば、「これはまずい」「これは、「何も見えません」「あることを見えません」となる恐れがあるので、否定することもできるでしょう。

しかし、この

結構支離滅裂な文章ですね

学習させる

データセットの準備

今回は税の作文のホームページからpdfをダウンロードして使いました。

DownThemAll!などを使ってpdfを全部ダウンロードします。

pdfの結合サービスなどを使ってpdfを結合しpdfをtxtに変換するサービスを使ってtxt形式に変換します。

VScodeなどを使って正規表現を使うなどしてタイトルなどいらない部分を消します。

(例).*?\n.*\n.*\n

pdfをtxtに変換したままの形では文章の切れ目にかかわらず改行が入ってしまっているので改行をすべてなくします。

そして、「。」の後に改行コードを入れて改行させます。 これで文章ごとに改行を行うことができます。

学習のために会話の切れ目には<|endoftext|>を入れなければいけないので改行の前に<|endoftext|>を付け足します。

この先の工程が僕のPC上の環境ではうまくいかなかったのでgoogle colab上で行いました。

google colab上に下のコマンドを使って同じ環境を作ります。

!git clone https://github.com/tanreinama/gpt2-japanese
%cd gpt2-japanese
!pip install -r requirements.txt
!wget https://www.nama.ne.jp/models/gpt2ja-small.tar.bz2
!tar xvfj gpt2ja-small.tar.bz2

先ほど作成したファイルのファイル名を「dataset.txt」にして、google colab上の「gpt2-japanese」フォルダ直下に「data」などの適当な名前のフォルダを作り、その下に配置します。

そして下のコマンドで変換用のプログラムをダウンロードし、「finetune.npz」に変換します。

!git clone https://github.com/tanreinama/Japanese-BPEEncoder.git
!python ./Japanese-BPEEncoder/encode_bpe.py --src_dir data --dst_file finetune

そして、出来上がった「finetune.npz」をダウンロードしてPC上の「gpt2-japanese」にコピーします。

これでデータセットは完成です。

ファインチューニング

ファインチューニングは「run_finetune.py」を使います。

「Ctrl + C」で学習を終了するのですが、うまく終了できないので、プログラムでエポック数を指定します。 「run_finetune.py」を開いて217行目あたりにしたのような記述があります。

       try:
            #while True:
            for i in range(500):
                if counter % args.save_every == 0:
                    save()

                (_, v_loss, v_summary) = sess.run(
                    (opt_apply, loss, summaries),
                    feed_dict=sample_feature())
 
                summary_log.add_summary(v_summary, counter)

                avg_loss = (avg_loss[0] * 0.99 + v_loss,
                            avg_loss[1] * 0.99 + 1.0)

上のように「while True」を「for」文に変更します。for文でエポック数を指定します。(コードでは500)

下のコマンドを実行してファインチューニングを行います。

python run_finetune.py --base_model gpt2ja-small --dataset finetune.npz --run_name gpr2ja-finetune_run1-small --save_every 100

パラメータは以下の通りです。

  • --dataset : データセット(npzファイル)

  • --base_model : モデルファイルのパス (デフォルト: gpt2ja-small)

  • --batch_size : バッチサイズ (デフォルト: 1)

  • --optim : オプティマイザ (adam, adagrad, sgd) (デフォルト: adam)

  • --learning_rate : オプティマイザーの学習率 (デフォルト: 5)

  • --warmup_steps : 学習率のウォーミングアップステップ (デフォルト: 0)

  • --run_name : 実行ID。 checkpoint/とsamples/のサブフォルダ名 (デフォルト: gpt2ja_finetune)

  • --save_every : Nステップ毎にチェックポイントを書き込むか (デフォルト: 1000)

  • --gpu : GPU番号 (デフォルト: '0')

これでモデルは完成しました。

動作確認

下のコマンドで動作確認ができます。

python gpt2-generate.py --model checkpoint/gpr2ja-finetune_run1-small --num_generate 1

実行結果は下のようになりました。

これらの要素の中で、「僕は税金によって成り立っている税金使い方に取り組みたい」と思った人は多いはずである。

「--context」などを使って開始の文章を「税金は」などに指定して、応募要項を見ると原稿用紙3枚以内と書いてあるので「--min_length」を1000くらい、「--max_length」を1200にして実行してみます。

python gpt2-generate.py --model checkpoint/gpr2ja-finetune_run1-small --num_generate 1 --context "税金は" --min_length 1000 --max_length 1200

これで実行すると下のようになりました。

税金は制度の都合で不可能になったものであることがわかった。

そして、政府は税金の使い途を定めるためのワイヤを整書し、国の借金を軽減するための政策をとった。

国債発行や現金払いの他にも巨額の徴収があったが、これら税金は国債の発行と同時に民事・地方公共団体の犯罪の防止や犯罪の防止のための仕組みである。

また、行政や社会の仕組みは憲法で定められているが、全て税金を国債に替えさせるためのものである。

いずれの税金も、それぞれの地域や地域の公共サービスに還元され、国民の不満度を高めた。

また、最近ではコロナウイルス感染症の流行や感染拡大による国民の緊張などにより、税金の導入は難しくなったが、国家や地方公共団体の年目滑りとしての使命を果たすだけの働きはした。

一方、税金の使途の確定から支払いまでが主な仕事であり、国民の安全・安心と豊かで幸せな暮らしを保障するために行われている。

また、令和二年度の一般会計予算は十九兆十九すう事業所である。

東京などの大都市に出ており、初めての対面式の税金会議は嬉しくもあり、とても荘厳な運営であった。

令和二年度のこみめらしい税の歳出規模の拡大には、政府は税金の使途の明確化を必要とし、国民の負担を軽減している。

一方、医療、年金、公共サービス等の保障に関わる税は府県や市などの公共サービスを円滑に使わせるために困難な時期を経て建設されている。

また、ごみを収集し回収する等の収集事業は、国に補助を得て維持している。

今後の税の未来は、今後も大きな問題が出てくるのではないだろうか。私は思う。

私の不平不満はつらいが、自分に足りないものだ。

不景気な世の中になり、税金を払うことに対する消極的な自分がいることに気づかされた。

しかし、世の中に目を向けた今、税金の使途に最初から興味がまったくなった。

私は、世の中に関心がなかったがために、税金の使途に興味をもったのではないかと思う。

たとえば、私が払っている給料から税金を支払い、うまくいった食いつき方で世の中に貢献するといった作業が、日々の生活で直接納め、あとで支払う消費税などには関心がない。

しかし、税金は世の中にどのような姿を現しているだろうか。

私は、今まで税金には目もくれず、ぼんやりと見ていたことがあり、興味関心が持てた。

税という形は、日常生活に密着していなくてはならないものであり、その作り方についても日々試行錯誤している。

また、税金は税金の見え方が大きく異なり、ごみを収集することなくちんすこくをまかなえる。

また、ごみを処理する現場を見たことがない人から学ぶことのできるアイディアもいくつか見つかる。

これらは、私が思い描いていたものと大きく変わらない。

なぜなら、税金をしっかり世の中に役立てているからだ。

私の経験した税金とは別に、たくさんの問題が私の中で渦となっている。

まとめ

学習したデータが少なかったせいかあまり高い精度で生成することができませんでした。

これでは学校の先生にバレてしまうので素直に自分で書きましょう。

しかし、この技術を使ってパラメータや学習データを増やすともっと精密な文章を生成することも可能です。

簡単に高い精度の文章を大量に作ることが出来るので、悪用はしないようにしましょう。

リンク集

GitHub - tanreinama/gpt2-japanese: Japanese GPT2 Generation Model

令和2年度 中学生の「税についての作文」各大臣賞・国税庁長官賞受賞者発表 | 税の学習コーナー|国税庁

DownThemAll! - Chrome ウェブストア

【無料】PDFを結合 - Adobe 公式 | Adobe Acrobat(日本)

PDF TXT 変換。オンライン フリー — Convertio

CDデッキとアンプの修理

今回はトレーの開かなくなったCDデッキをもらったので修理しました。

トレーが開かなくなったので、CDは分解して取り出したとのことだったので部品が多少壊れていたり、部品がなくなっていたりしました。

今回修理したCDデッキはONKYOのC-705FXです。

f:id:katatsumuri527:20210410115108j:plain

このような状態で届きました

f:id:katatsumuri527:20210410115234j:plain

ばらばらにするとこんな感じです

f:id:katatsumuri527:20210410115325j:plain

トレーが開かなかったのはギアの噛み合わせが悪かったのでそこを直して、グリスを少し塗ったらよくなりました。

更にもう一つ壊れている箇所があったのでそこも直していきます。

写真の赤丸の部分のケーブルが断線して壊れていたので、部品を交換します。

f:id:katatsumuri527:20210410115641p:plain

 中国のアリエックスプレスで注文しました。

f:id:katatsumuri527:20210410120341j:plain

f:id:katatsumuri527:20210410120655j:plain

左が買ったもので右が付いていたものです。

ほぼ違いはありませんが、よく見ると左の物にはソニーのロゴがありません。

f:id:katatsumuri527:20210410120938j:plainこのように元の位置に入れてネジで絞めれば完成なのです。

しかし、トレーが開閉するときにこの部品が上下するためのバネが取り付けてあるのですが、そのバネのうち2つが無くなっていました。

同じような部品がなかったのでこれは作ることにしました。

針金をバネ型に曲げて作りました。

f:id:katatsumuri527:20210410121435j:plain

これをつけて、ねじを締めて元通り組みなおせば修理完了です。

カバーをつける前に試運転しましたが、しっかりと音が出ました。

f:id:katatsumuri527:20210410121605j:plain

これで終わりかと思ったのですが、アンプが無いとスピーカーに出力することができないと分かったので(試運転の時はテレビにつないでやっていました)、ハードオフでアンプを買ってきました。

買ってきたアンプはOK-17です。

f:id:katatsumuri527:20210410122028j:plain

f:id:katatsumuri527:20210410122158j:plain

症状は片方だけ、音が出ないという症状でした。

スピーカーは左右どちらも動きました。

原因はすぐにわかりました。

完全にコンデンサーの液漏れです。

f:id:katatsumuri527:20210410122455j:plain

これと同じ規格のものを注文します。

またもや中国から来ました。

f:id:katatsumuri527:20210410123115j:plain

これをはんだ付けで交換します。

f:id:katatsumuri527:20210410123309j:plain

これでアンプも修理完了です。

CDデッキと合わせて使うことができました。

f:id:katatsumuri527:20210410123419j:plain

 

栃白玉団子

前の投稿から少し間が空いてしまったのですが、今回はお年玉とおとちだまをもらったので、栃餅を作ってみようと思いました。

栃餅は、栃の実が多く必要らしいので、白玉団子にしました。

もらったおとちだまがこれになります。

f:id:katatsumuri527:20210219194628j:plain

f:id:katatsumuri527:20210219202103j:plain

まず初めに、栃の実のあく抜きからやります。

栃の実のあく抜きはこのページを参考にしてやりました。

recipe.organic-press.com

 まず初めに、栃の実を水に1週間ほどつけます。

f:id:katatsumuri527:20210219202619j:plain

そのあと、カラカラになるまで天日干しにします。

f:id:katatsumuri527:20210219202701j:plain

この時点では、約40gの重さになりました。

f:id:katatsumuri527:20210219202746j:plain

これを保温ポットに入れて、熱湯を入れ一晩おきます。

f:id:katatsumuri527:20210219202852j:plain

次に栃のみの皮をむきます。

今回は栗の皮むききを使いました。

f:id:katatsumuri527:20210219203035j:plain

剥いてみると、黒くなっている部分があったので、その部分は取り除きました。

f:id:katatsumuri527:20210219203236j:plain

皮をむいた栃のみを2週間程度水につけます。

今回は、1日に2回水を変えるようにしました。本当は流水がいいらしいです。

だんだんと泡が出なくなってきます。

f:id:katatsumuri527:20210219203452j:plain

熱湯に1時間以上つけておきます。

結構お湯が濁りました。

f:id:katatsumuri527:20210219203606j:plain

保温ポットに入れて、灰とお湯と栃の実を入れます。

f:id:katatsumuri527:20210219203833j:plain

これで、約3日くらい置いておきます。

いろいろあってこの状況で2週間くらい放置しましたが大丈夫でした。

灰を洗い流すと灰につける前より黄色くなります。

f:id:katatsumuri527:20210219204242j:plain

これをいい感じの柔らかさになるまでゆでます。

f:id:katatsumuri527:20210219204350j:plain

f:id:katatsumuri527:20210219204413j:plain

これをペースト状にします。

f:id:katatsumuri527:20210219204453j:plain

これを白玉粉と混ぜて、白玉団子を作ります。

f:id:katatsumuri527:20210219204615j:plain

f:id:katatsumuri527:20210219204617j:plain

少し黒い皮が入っていますがたぶん大丈夫でしょう。

f:id:katatsumuri527:20210219204619j:plain

f:id:katatsumuri527:20210219204622j:plain

茹でて完成です。

f:id:katatsumuri527:20210219204757j:plain

ちゃんと栃餅の味がしておいしかったです。

きなこをかけてもおいしかったです。

f:id:katatsumuri527:20210219204800j:plain

 

足湯づくり 第三回

今回はやっと木の桶が出来上がったので、紹介していきます。

材料

使ったものは下の通りです。

f:id:katatsumuri527:20201229180150j:plain

f:id:katatsumuri527:20201229180241j:plain

f:id:katatsumuri527:20201229180323j:plain

f:id:katatsumuri527:20201229180610j:plain

  • 19mmx45mmパイン小割材 (1x2材だと思って買ったら違った)
  • 12mm 針葉樹合板
  • 防水スプレー
  • 雨漏れ補修材 (これあんまり意味なかった)
  • コーキング材
  • ネジ

合板はホームセンターでカットしてもらいました。

 

使った道具はインパクトドライバー、指矩、コーキングガンぐらいです。

 

手順

今回作ったときの手順を紹介します。

まず、前々回やった設計の木取り図をもとにホームセンターでカットをしてもらいました。ロイヤルだと、会員は10カットまで無料なので、すべて切ってもらいました。

しかし、もともと1x2材で19x38だと思って買った木材の幅が45mmだったので、家で切りそろえました。

次に、木組みを作ります。

f:id:katatsumuri527:20201229180913j:plain

その木に、合板を貼ります。

f:id:katatsumuri527:20201229181114j:plain

木同士をつなげて、四角い枠を作ります。

f:id:katatsumuri527:20201229181338j:plain

下から合板をネジで止めます。

f:id:katatsumuri527:20201229181527j:plain

雨漏り補修材を溝に塗ります。

f:id:katatsumuri527:20201229181704j:plain

これが失敗につながります。

防水スプレーをかけます。

f:id:katatsumuri527:20201229185114j:plain

水漏れしました。

f:id:katatsumuri527:20201229201349j:plain

雨漏れ補修剤を使って、修正しましたが水漏れします。

これを4回繰り返しました。

そして、再びホームセンターに行って、コーキング材を買ってきました。

シリコンのコーキング材を使ったら、うまくできました。

防水スプレーをかけたので養生テープが付かなくなり、周りにもコーキング材がついて、少し汚い仕上がりになってしまいました。

f:id:katatsumuri527:20201229193112j:plain

コーキング材が床についたのか、床が滑るようになりました。

完成!

水を入れてみます。

水漏れしません。

前回に作ったボイラー部分をストーブに乗せて、灯油のポンプで循環させます。

f:id:katatsumuri527:20201229194001j:plain

なかなか温まりません。

 

約2時間後

 

あったまりました。

f:id:katatsumuri527:20201229190138j:plain

44℃です。

これをやってみて、ふろ用の給湯器ってすごいな~と思いました。

入ってみると結構気持ちいいです。

f:id:katatsumuri527:20201229190335j:plain

一応二人用です。向かい側にもう一人座れます。

 

動画を作りました。

作業中の様子などが映っています。


「足湯」を作ってみた!

足湯づくり 第二回

このシリーズでは、足湯を作っていきたいと思っています。

前回、設計を行ったので、先に足湯づくり 第一回を見ていただくといいかと思います。

今回は、実際にお湯を沸かす部分を作っていきます。

では早速作っていきましょう。

材料

今回使った材料は下の通りです。

f:id:katatsumuri527:20201210181118j:plain

 

  • 9L缶
  • 塩ビ管用接着剤
  • ジョイントみたいな部品 写真右側
  • パッキン
  • 塩ビ管
  • タイルの目地材
  • 灯油用のポンプ

 作り方

ここからは作り方を解説します。

今回作るのは下のようなものです。

f:id:katatsumuri527:20201210181406j:plain

一斗缶に水を入れて、塩ビ管の下に足湯の桶を置き、ポンプで循環させます。 

 

まず初めに、一斗缶の上の部分を切り取ります。

最初は上の面の一部に穴をあけようとしましたが無理でした。

これには、缶切りを使いました。

 

f:id:katatsumuri527:20201210182401p:plain

f:id:katatsumuri527:20201210182353p:plain

f:id:katatsumuri527:20201210182652p:plain

切り終わった後にやすりがけもしました。

 

次に横の面に穴をあけます。

ドリルで穴をあけて穴同士をつなげます。

そして、やすりをかけます。

f:id:katatsumuri527:20201210185755p:plain

f:id:katatsumuri527:20201210185803p:plain

f:id:katatsumuri527:20210101153624p:plain
 

塩ビ管をつなげるためのジョイントみたいなやつをつけます。

パッキンをつけて穴に通し、塩ビ管用の接着剤を塗って、もう一方にもパッキンをつけて、ねじ込みます。

f:id:katatsumuri527:20210101153634p:plain

f:id:katatsumuri527:20210101153614p:plain

塩ビ管を切って、接着剤で、さっきつけたジョイントにつなげます。

f:id:katatsumuri527:20201210191053p:plain

f:id:katatsumuri527:20201210191100p:plain

f:id:katatsumuri527:20201210191110p:plain

 

これで一回やってみたのですが微妙に水漏れしているので、タイル用の目地材で埋めました。

汚いですがこんな感じです。

f:id:katatsumuri527:20201210191303j:plain

 

これで一応お湯を沸かす部分は完成です。

簡易的な感じで動かしてみるとこんな感じです。

ここのサイトに足湯に適した温度は38℃~42℃と書いてあるのでそれくらいになるように暖めます。

f:id:katatsumuri527:20201211052419j:plain

最初は水温が14℃でした。

f:id:katatsumuri527:20201211052429j:plain

f:id:katatsumuri527:20201211052438j:plain

暖めると・・・

f:id:katatsumuri527:20201211052449j:plain

43℃くらいになりました。(42℃を微妙に超えてます。)

 

次回は足湯の桶を木で作っていきたいと思います。

 

足湯づくり 第一回

このシリーズでは、足湯を作っていきたいと思います。

実際に実現するかはわかりませんが、今回は設計をしていきます。

今回使ったソフトはCADIY3Dというソフトです。

このブログでは体験版を使っています。

早速、設計をしていきましょう。

まず初めに、角材を配置します。

f:id:katatsumuri527:20201209072452p:plain

そして、サイズを設定します。

f:id:katatsumuri527:20201209072458p:plain

角材を動かして、いい感じにします。

f:id:katatsumuri527:20201209072505p:plain

骨組みはこんな感じです。

f:id:katatsumuri527:20201209072513p:plain

そこに合板を追加します。

f:id:katatsumuri527:20201209072519p:plain

そして、大きさを調節します。

f:id:katatsumuri527:20201209072527p:plain

内側に貼り付けます。

f:id:katatsumuri527:20201209072533p:plain

これで、完成です。

木取り図の機能を使って合板や角材の配置を考えます。

f:id:katatsumuri527:20201209072540p:plain

配置すると、下のようになりました。

今回使う角材が1820mmのものなので、このソフトの910mmよりはみ出していますが、問題ありません。

これで、木材のみのおおよその値段がわかります。

f:id:katatsumuri527:20201209072547p:plain

Excelを使って値段を計算します。

これで材料のおおよその合計金額がわかります。

(ホームセンターに行ってほかの材料も買い足すかもしれません)

f:id:katatsumuri527:20201209073521p:plain

次回は、足湯を実際に作ってみたいと思っています。

綿あめ機

今回は綿あめ機を作ってたので、紹介したいと思います。

綿あめが食べたかったので作ってみました。

まず初めに、外見を紹介します。

f:id:katatsumuri527:20201130053958j:plain

f:id:katatsumuri527:20201130053947j:plain

f:id:katatsumuri527:20201130054009j:plain

蝋と砂糖がついてすごいことになっています。

 

使い方は、固形燃料をセットして火をつけ、缶にザラメを入れて、溶けたら缶を回転させます。

最初はろうそくを使っていましたが、蝋が垂れるので、固形燃料にしました。

 

仕組みは、溶けたザラメが遠心力によって缶に空いている穴から出るときに糸状になるという仕組みです。

缶には小さな穴がたくさん開いています。

 

使った部品は、DCモーター、タミヤのシャフトセットに入ってる部品、アルミ缶、木、電池ボックス、導線です。

電池は単三4本、6Vで動きます。

 

下の画像がカバーをつける前のものです。

仕組みは、下の画像を見るとわかると思います。

 f:id:katatsumuri527:20201130053107j:plain

f:id:katatsumuri527:20201130052432j:plain

この綿あめ機で出来上がった綿あめが下のものです。

 

f:id:katatsumuri527:20201130054827j:plain

 

なかなか作るが難しく、小さいのしかできませんでした。

大きさは縦が7cmくらいでした。

 

綿あめを作っている様子などが入っている動画を作ったので、よかったら見てください。

 


綿あめ機