RND.log

Rnd.log is Not a Developer's webLOG

【19日目】ツイートの「ぱちお度」を判別する!ぱちお診断 2020 エディション【ぱちお Advent Calendar 2020】

ぱちお診断v2.0

https://ぱちお.comxn--t8j2b5b.com


おはおはの民!
RNDです!今年も(今年しかない)参加させてもらいました!
ぱちおアドベントカレンダー

この記事はぱちおアドベントカレンダーの19日目の記事です。
18日目は、ぱちお(@patioglass)さんの【18日目】生まれた日!!!!!!!!!【ぱちお Advent Calendar 2020】 - ぱちおのいろいろ。でした!

20日目は、ぱちお(@patioglass)さんの記事です。

adventar.org


RND.png (@RND_png) / Twitter

  • RNDです
  • ぱちお君の大学生時代からの友達
  • お仕事はエンジニアで主にRailsを書く仕事をしている
  • 趣味はお絵かきとぱちお

ぱちおくんお誕生日おめでとう

昨日はぱちおくんの誕生日でした。
今年のプレゼントはこちらです!

やったこと
  • ぱちお.comドメインを取得しました
  • ツイートの「ぱちお度」を判別する「ぱちお診断」ぱちお.comで公開しました。
    • 昔作って公開していた「ぱちお診断」のコードを改修
    • ぱちお君のツイートデータを元にデータを更新
    • AWSに環境構築

ぱちお.com

取得した

ぱちお.com
https://ぱちお.com/xn--t8j2b5b.com

ぱちお診断ってなに?

  • 2015年くらいにぱちお君のツイートを元に文の「ぱちお度」を判定するアプリを作った

ぱちお度とは...

ぱちお診断はナイーブベイズフィルタによって、
入力された文章の「ぱちおくんのツイートらしさ」を判定します。

ぱちお度は
「文章が与えられた時の、その文章がぱちおツイートである(条件付き)確率」
を表します

単純ベイズ分類器 - Wikipedia

もっと詳しく言うと、
文章を単語の集まりとして見做して、
それらの単語が
「ぱちおくんのツイート(の単語の集まり)」
「ぱちおくん以外のツイート(の単語の集まり)」
のどちらに含まれるかを確率的に判定します

2017年以降のぱちお(@patioglass)くんのツイートと
ぱちおくん以外の人のツイートを形態素解析(単語に分解すること)して
それぞれの単語の数をカウントしておく

それを元に任意の文章d(単語の集合)が与えられた時に
それがぱちおである確率らしきものを計算する

ナイーブベイズ分類器の仕組み | データサイエンス情報局

うろ覚えなので間違ってるかもしれない
(6)がぱちお度、計算精度の都合上logに直してから計算する(7)

今時ならDoc2Vec使うともうちょっといい感じになるかも
(でもぱちお度の精度を求めてる人間おる??)

ぱちお診断の作り直し

かなり昔に作ったもので、最近のぱちお君のツイートが反映されていません
どうせなので好きなように直します

旧ぱちお診断の仕様

Rubyで書かれてます

動作にMeCab(+ neologd)が必要で、これがだるい

Dockerに載せた

ぱちお診断 on Docker
MeCab + nattoにgRPCでアクセスできるimageを作った

github.com

MeCabとneologdを入れるのが楽になった
gRPC、ライブラリが整っていて結構簡単に実装できました

SQLiteからMySQL + ActiveRecord

旧版はSQLを生書きしてた、久しぶりに見たら全然意味わからんかったので
ActiveRecordを入れて処理を追いやすくした

ActiveRecordを単体で使うの、地味に面倒臭い
↓の記事が参考になりました
qiita.com

generate migrationコマンドとかはついてこないので自前で実装

フロントエンド

Webpackを突っ込む
TypeScriptで書く
Reactを突っ込む

ぱちお度のバーの動きをCSS トランジション

旧版はJSで動かしてた

ぱちおバー

バックエンドをAWSに変えました

旧ぱちお診断があったサーバは放置してて動いてなかったので
新しくどこかにサーバ立てたりする必要がありました

ぱちお.com

AWSほぼ触ったことない赤ちゃんだったので大変だった

経緯

AWSを触りたいなぁという気持ちがあったのと、
ECSっていうやつでdocker-composeがそのまま使えるようになったらしいというのを聞いて
それならデプロイ楽なんじゃない???

と思っていた時期が僕にもありました...

実際は

  • ecsのdocker composeではbuildができない
  • 事前にECRにimageをpushしておく必要がある
  • ので、docker-compose.ymlでbuildしたりvolumeでソースコードを突っ込んだりしてるとそれと別でdocker-compose.ymlを書く必要がありそう
  • スケールアウトさせるのを前提としているので複雑な設定を書かないといけない

で、今回みたくスケールアウトとかいらないならEC2にECRからpullしてきて
docker-composeで立ち上げた方が楽そうという結論に
(docker saveとかを使ってうまくデプロイするスクリプトを書けばECRもいらないかも)

VPCと闘う

aws.amazon.com

VPCわかんないよ〜〜〜〜〜〜〜

登場人物が多すぎる

でも訳わからん概念みたいなのは出てこなくて
描像は掴みやすい

RDS

aws.amazon.com

データベース
マルチAZじゃなくても
二つ以上のAZに跨ったサブネットグループが必要
というところで少しハマった

NLBとACM

aws.amazon.com

ACMで証明書を取得して
お名前.comのDNS設定にCNAMEレコードを書く
NLBにElastic IP(固定IP)を突っ込んで、証明書を追加すると勝手にhttpsになって嬉しい
ALBだとElastic IP追加できなかったのでNLBに

owani.net

感想

IAM周りだけ事前に予習しててある程度設定してたので助かった、
初見だったら間に合わなかったと思います

複雑なMMORPGは、ただ複雑であるというだけで
ある種の面白さがあります。
AWSもそんな感じ

今後の展望

frontのnginxいらんくない?

現状default.confにproxy_passが設定されてるだけで何の設定もないので多分いらない
NLBから直接APに飛ばせば良さそう

Lambdaにできそう

フロントエンドをs3とかで配信して
APとmecabあたりをLambdaにできないか考えてみる

テストないしLinterも入れてない

あとで入れる

おわりに

『前回の記事から3年も経ってて怖くて泣いちゃった』のぱちお度は100%でした。

それではみなさん 良いお年を!!

過去のぱちお記事

rndlog.hateblo.jp
www.rcc.ritsumei.ac.jp