狠狠撸

狠狠撸Share a Scribd company logo
コピペでうひーマンが人外になった話
2020/4/17
1 )自己紹介
2 )なにをしたのか
3 )当初の構想
4 )とりあえずコピペ
5 )課題と今後の拡張プラン
本日おはなしさせてもらうこと
1)自己紹介
Otazoman
twitter:うひーマン(@norikoni) ←実体
うひーまん(@uhiiman) ←分身
●現在の職業:
某金融系会社のマーケティング部所属、システムともマーケとも言えない
中途半端な立ち位置でゆるゆる勤務中、現在は絶賛色々と厄介毎に巻き込まれ中
●経歴:
新卒でSIerに入社し退職後はずっと社内のシステム担当してます。7社を渡り歩いて
2018年から現職です。システムもプログラムもナニモワカラナイ。(?;ω;`)
非エンジニアです。北斗の拳のヒャッハー達にやられる様な存在です。
●社会人約20年でやってきたこと(ナニモワカラナイ):
?MS-OFFICE →ググればマクロは何とか読み書きできます。
?JavaScript →ググれば何とか読み書きできます。モダンは分かりません。
?python →ググる力を備えているところ。最近一番触っているかも、、
?Linux →ググれば何とかサーバ触れます。
?AWS,GCP,Azure→AWSは初心者レベル。GCPは最近知った。Azureは名を知った
全然関係ないですが
初級ながらAWSの認定資格
取りました!!
(2019年12月w
これでようやくAWS初心者
名乗れます。
2 )なにをしたのか
以下のようなものを作りコピペしました。
RSSFeed ②定時でRSSフィードを取得する。
取得対象フィード一覧
①RSSフィードURL取得
③APIを使ってはてなブックマークに自動追加
⑤取得したRSSフィードを1時間単位でサマリーしてBloggerへ自動投稿
④APIを使ってtwitterに自動投稿
⑥IFTTT使ってBloggerのサマリー情報をtwitter連携
現物
https://twitter.com/uhiiman
https://gugutasuujimasa.blogspot.com/
普段やること皆無になりましたw
●検証期間:5ヶ月(以前のテキストマイニング系作業もコミ)
●製作期間:3ヶ月(現在未だ不具合対応中www
(仕事しろww
作る前のオペレーション
はてブからtwitterは同時投稿
自宅とかでInoReaderチェックし
て、手動でラベル付けして
InoReaderからはてブに同期
TwitterからIFTTT経由でBloggerへ
1日中記事チェックに追い立てられている状況でした
(仕事しろww
なんか情报に追い立てられててツライ。。。
心の平穏を取り戻すためには
全てをボットにするほかない。
3 )当初の構想
getfeed
pers
RSSFeed
②定時でRSSフィードを取得する。
取得対象サイト一覧
①RSSフィードURL取得
③取得したRSSフィード一覧を解析
④title(件名)とdiscription(概要)と更新日時を取得
※前回更新分以後の分のデータのみ処理する。
insertTable
⑤件名と概要から形態素解析しカテゴリー分類
⑥出現頻度の多い名詞をキーワードテーブルに格納
⑦キーワードのランクを件名+概要+更新日時に付加
⑧テーブルにデータをインサートする。
publish
DB
⑨Bloggerにカテゴリを付与して投稿する。(API経由)
⑩はてブにカテゴリを付与して自動投稿する。(API経由)
?Twitterにカテゴリを付与して投稿する。(API経由)
?Facebookにカテゴリを付与して投稿する。(ヘッドレスブラウザ経由)
※投稿速度は50件/1時間程度で制限する。
2019年11月当時のスキル
python力→オレ氏:2
(MAXな人は53万)
ゴミ以下
今も大して変わらないですw
コピペしかないな飞飞飞
4 )とりあえず作るコピペ
基盤関連は当然モダーンにサーバレスでAWSかGCPか?
AWS LambdaAmazon CloudWatch Amazon DynamoDB
App Engine Cloud DatastoreCloud Scheduler
CloudWatchイベントで1時間に1回、処理用の
Lambda(python)を呼び出して実行。RSSを取得し
て、一旦DynamoDBに格納して、データ加工後に
はてなブックマークに投稿、記事をまとめて
Bloggerに投稿させる。
データはDynamoDBに蓄積しっぱなし
GAEにpythonスクリプトを仕込んでCloudScheduler
で1時間に1回バッチ実行。RSSを取得して、一旦
DataStoreに格納して、データ加工後にはてなブ
ックマークに投稿、記事をまとめてBloggerに投
稿させる。DataStore(FireStoreモード)からはデー
タ削除
この時点では自由度の高いGCPかなぁと漠然と思ってた。
利用するライブラリとかZipで固めてS3に上げて
とか色々と面倒なことをしないといけない。
最大処理時間15分という制限あり
DataStoreについては無料枠では1日50,000回までの
書込み制限があるもののGAEのスクリプトには特に
処理時間制限もなくライブラリも自由度が高い。
が、今回の要件!!
getfeed
pers
RSSFeed
②定時でRSSフィードを取得する。
取得対象サイト一覧
①RSSフィードURL取得
③取得したRSSフィード一覧を解析
④title(件名)とdiscription(概要)と更新日時を取得
※前回更新分以後の分のデータのみ処理する。
insertTable
⑤件名と概要から形態素解析しカテゴリー分類
⑥出現頻度の多い名詞をキーワードテーブルに格納
⑦キーワードのランクを件名+概要+更新日時に付加
⑧テーブルにデータをインサートする。
publish
DB
⑨Bloggerにカテゴリを付与して投稿する。(API経由)
⑩はてブにカテゴリを付与して自動投稿する。(API経由)
?Twitterにカテゴリを付与して投稿する。(API経由)
?Facebookにカテゴリを付与して投稿する。(ヘッドレスブラウザ経由)
※投稿速度は50件/1時間程度で制限する。
※投稿速度は50件/1時間程度で制限す
る。
AWS LambdaAmazon CloudWatch Amazon DynamoDB
App Engine Cloud DatastoreCloud Scheduler
CloudWatchイベントで1時間に1回、処理用の
Lambda(python)を呼び出して実行。RSSを取得し
て、一旦DynamoDBに格納して、データ加工後に
はてなブックマークに投稿、記事をまとめて
Bloggerに投稿させる。
データはDynamoDBに蓄積しっぱなし
GAEにpythonスクリプトを仕込んでCloudScheduler
で1時間に1回バッチ実行。RSSを取得して、一旦
DataStoreに格納して、データ加工後にはてなブ
ックマークに投稿、記事をまとめてBloggerに投
稿させる。DataStore(FireStoreモード)からはデー
タ削除
利用するライブラリとかZipで固めてS3に上げて
とか色々と面倒なことをしないといけない。
最大処理時間15分という制限あり
DataStoreについては無料枠では1日50,000回までの
書込み制限があるもののGAEのスクリプトには特に
処理時間制限もなくライブラリも自由度が高い。
1回の処理時間が50分だとコスト面では仮想マシンの方が優位性高い
サーバレスムリィィ(?;ω;`)
さぁどうしよう。
なぜか、、ちょうど都合よくサーバが1台ありました。w
GMOの株主優待特典を利用すれば低価格で運用することが可能ですww
で、取った構成
SSD:50GB
ハード
(ConoHa) OS
Ubuntu18.04LTS
当然ながら
そしてライブラリが
対応していないため
お約束で3.8ではなく
3.7.5
DB
mongoDB4.0.15
環境構築、当然速攻コピペw
https://websiteforstudents.com/install-mongodb-on-ubuntu-18-04-lts-beta-server/
http://ujimasayuruyuru.blogspot.com/2019/11/mongodbcrud.html
https://qiita.com/koooooo/items/b21d87ffe2b56d0c589b
1.Pyenvインストール
2.Mongoインストール
3.Git設定
一応、申し訳なさげ程度に構築手順はまとめました。コピペですがwww
https://qiita.com/wnoguchi/items/f7358a227dfe2640cce3
docker-composeなり作って自動化すればコピペすらいらなくなるのに
やれてません。へぼっちなのですいませんm(__)m
はてなブックマークのAPIキー取得
NO 説明 コピペ元
1 はてなOauthキー取得(当時はなかった
w
http://msiz.hatenablog.jp/entry/2019/11/10/150934
2 はてブAPI投稿 https://syncer.jp/hatebu-api-matome
3 はてブ情報取得API https://so-zou.jp/web-app/tech/web-api/hatena/entry/
当然ながらコピペ!!
Bloggerの記事まとめ用テーブルテンプレートもコピペ!!
https://ohmyenter.com/how-to-implement-fixed-header-table-with-adjusting-width/
プログラム構築、当然コピペww
NO スクリプト 説明 コピペ元
1 main.py シェルから呼び出される用、No.2~4とりま
とめ
https://qiita.com/himenoglyph/items/77f2534bc32eaad494dc
2 get_rss_feed.py RSSフィード取得してくる https://hack-le.com/python-rss/
3 add_labels.py ラベル付けする https://blog.amedama.jp/entry/tf-idf
4 sns_post.py SNS(はてなブックマーク、Bloggerに投稿す
る)
https://note.com/virtual_surfer/n/n025f07e5b3c7
https://qiita.com/hassiweb/items/79eedd11e1ecc6e0818d
5 outlog.py ログ出力用共通モジュール https://qiita.com/yopya/items/63155923602bf97dec53
6 data_crud.py スクリプトから当該DBを操作する用途
7 mongo_crud.py mongoのCRUD制御用 https://qiita.com/bc_yuuuuuki/items/42fb4e328304e59b0eec
8 mecab_operate.py mecabを制御する用途 https://qiita.com/yonedaco/items/27e1ad19132c9f1c9180
9 str_normaraizer.py mecabで処理する際に日本語をキレイにする https://ohke.hateblo.jp/entry/2019/02/09/141500
https://github.com/Otazoman/testtextmining/tree/master/src
コピペの集大成www(現在、サーバで稼働しているコードはDB名さらすのがあれなのでプライベートリポジトリに入っております。以下はサーバ稼働前に実験的に使用していたコピペコード達です。)
コピペばかりなのもあれなので一部説明
main.py
はやくもコピペw
取りあえず各スクリプト
呼び出しているだけです。
これをcronで1時間に1回
呼出し
あクラスという、いかした構成などありません。なんせコピペなのでw
そしてシロートなのでテストも書けてないですし、例外処理などありません(爆
get_rss_feed.py
?CSVファイルからカテゴリ、フィードURLとタイトル一覧を取得する。
?1時間前のRSSフィードの内容を取得する
?取得したRSSの内容をmongoDBに出力する。
デバッグ用にファイル出力するモードも準備
結構、長いのでmainのみ抜粋
コピペのくせにくそ生意気にマルチスレッドで並列処理しています。
add_labels.py
?説明文(description)等をTF-IDF解析して追加ラベルの項目を返す。
?説明文(description)をLexRankライブラリを使用して要約する。
結構、長いのでmainのみ抜粋
コピペのくせにくそ生意気に言語解析系のライブラリ使っています。
?追加ラベルと要約した内容をmongoDBに書き込みする。
sns_post.py
?次の投稿までの待ち時間を求める
投稿時点の時間から次の00分までの秒数を求める
指定された秒数を越えていた場合のみ秒数を残り投稿件数で除算
上記で算出された時間を乱数にかけて秒数を算出
?外部に保存されているYAMLファイルからAPIキーなどを取得
結構、長いのでmainのみ抜粋
コピペのくせに生意気にスレッド処理しています。シーケンシャルに修正。
?Bloggerに投稿する
?はてなブックマークにブックマークする
?間隔をあけて投稿する。(はてなブックマーク、twitter用)
テーブルで未投稿分を抽出する
はてなブックマーク追加済み分データを抽出(重複分除外)
ランダムに待ってから投稿する
投稿済フラグをmongoDBに追加
?一括投稿する。(Blogger用)
テンプレートファイルを読込
はてなブックマーク追加済み分データを抽出(重複分除外)
上記データをテンプレートに出力
テンプレートの内容をBloggerに投稿
?投稿済データをmongoDBから削除する
?twitterにPOSTする
5 )課題と今後の拡張プラン
今回の自動化結果
●記事は片っ端からブックマークしてくれるので、
「はてブ」しなくても安心という心理的な余裕ができた。
●24時間ランダムにツイートしているのでツイ廃っぽい
感じが醸し出されてより「うひーマン」色が強化されて
個人的にいい感じになった。(自己満足)
●はてなブックマーク垢BANされた(?;ω;`)→復活させた。
●少しだけ会社で仕事するようになったw(オイ
課題
①Word2Vecが動いてくれないため細かな言語解析ができない。
ConohaのVPSではWord2Vecが重すぎて動かせない。
ローカルで作成したモデルを上げて解析させようとしただけでmemory
が足りず、エラーになってしまった。CPU2コア、最低メモリ4GB程度は
必要だが、それをまかなえる収益源がないww
②テストがない
テストがないので、ちょっとした修正の時に、関数単位で切り出して
手動で確認取ってから本体にがっちゃんこしないといけない。まぁ個人利
用なのでいいといえばいいけど。かなり面倒くさい。これもテストに関す
るスキルが不足しすぎているのでガンガレ俺!!
それにテスト環境もない。こっちは早めにローカルにテスト環境作ろう。
③mongoDBのチューニングとかメンテ方法が分からない。
おそらく大丈夫とは思う。DBの追加?更新が頻繁なので。何らかの最適化
とかいるんだろうけどできていない。今のところ曖昧検索とかかけていな
いから大丈夫と思うけどパフォーマンス関連のチューニングも
押さえる必要あるよなぁと。これも日々勉強です。
RSSFeed
②定時でRSSフィードを取得する。
*3:加えて*2で設定したキーワードを含
む
サイトをクローリングする
取得対象フィード一覧①RSSフィードURL取得
③APIを使ってはてなブックマークに自動追加
④twitterAPI経由で自動投稿
⑥FTTT使ってBloggerのサマリー情報をtwitter連携
⑦Googleトレンド
twitterトレンド情報等取得
※この前完成
WebSite
⑤取得したRSSフィードを1時間単位でサマリー
してBloggerへ自動投稿
*7:DBの内容を元に要約記事を作成し自動投稿
DB
*5:DBに頻出ワードを蓄積、カテゴリーを
ラベリングする。
*6:頻出ワードやラベリング情報をもとに
ランキング項目を設定する。
*2:データベースに蓄積されている内容と
Googleトレンドの情報を比較し近しい
キーワードを抽出する
*4:キーワード抽出したサイトのRSSフィードを追加する。
今後、拡張できたらなぁプラン
*8:Facebookに自動投稿
ハードル
①解析器、モデルの自動メンテナンス
②要約
加工?前処理
形態素
解析
追加学習
解析器辞書追加
追加学習データ
生成
自動評価 自動置換
追加情報
収集
以下の流れを自動でできないと正直、実用レベルにはならない。人間の手動メンテでは正直厳しい。
自動で流そうとすると大きなリソースが必要となるため、正直現実的ではない。
今回は素RexLankで要約したが、ノーマル状態だと不自然となってしまう。精度を高めていかないと、日本語
要約文の意味が全く通じない。なるべく元URLに当たらなくても端的にその内容を要約できるようにチュー
ニングしていく必要がある。これもコストがかかる。
/recruitcojp/ss-56150629
Doc2Vec勉強しないとなぁ。(ここでもコピペww)
https://hazm.at/mox/machine-learning/natural-language-processing/summarization/index.html
そしてコピペで
うひーマンは
人間性を失い、人外のモノとなりました。
ご清聴ありがとうございました尘(冲冲)尘

More Related Content

20200417冲尝罢资料