strelka_dogのブログ

徒然なるままに心に移り行くよしなしごとをそこはかとなく書き尽くるブログ

PythonでWikipediaから575を見つけてくるSlackBotを作った話

久しぶりに記事を書きます。

何年ぶりでしょうか、とりあえず三日以上の期間を開けての記事なので三日坊主の誹りを受けるいわれは無いでしょう。(某ジャンプマンガ、●UNTER×H●NTERが長期連載組扱いされるのだからそれと同じやり口であるこのブログにも文句は言わせない)

 

ということで祝ブログ開設から数か月、いるかいないかも分からない読者の皆様と共にこのブログも長い月日を歩んできました。

そこで今回の記事の内容は「Wikipediaから575を見つけてくるSlackBotを作った話」

 

 

まず作成の経緯について、

何故か突然一回生の中でSlackBotを開発する波が起きました。自分もその流行に乗っかって何か作ってみようということで、

 

 

 

はじめに

とりあえず常駐させるためにどっかのサーバー上で動かすことを考えると言語は限られてきます。その時はGASを使ってる人もいましたがサークルの講座でPyCharmを入れていたしPythonならどこのサーバーでも置かせてくれるかなと思いPythonで書くことにしました。またカッコ良さそうなので見つけた川柳を関連深い画像と合成た画像で投稿するようにしました。ただしPythonについてはほとんど素人だったので基本575の判定部分以外はコピペで仕上がっています。

逆にいえばプログラミングが分からなくてもほとんどコピペでSlackBotが作れるということです!

ということでBotの作り方というより参考になるサイト紹介ばかりとなりますがご容赦ください。

 

 

APIの取得

qiita.comAPIトークンの取得方法から丁寧に説明されているのでBotに必要な権限にだけ注意すればこれ通りに進めるだけでいつのまにかBotが登録できてます。(なお、読者の皆さんはそこまでおつむは弱くないと思いますがこの記事ではBotの権限をAdminにしてます。自分は脳死でこれの手順通りに進めていたのでうっかりサークルのSlackに対しAdmin権限を要求してしまいました。すぐに取り消しましたが注意してください……)

 

 

 

Botの基礎部分

適当にググって出てきたこのサイトがPython3を使用してたので今回の言語がPython2ではなくPython3に決まったといっても過言ではありません。

qiita.com 自分みたいなのでもこれを参考にしてやりたいことが出来ましたし、これを完コピするだけでメンションに対する反応やチャンネル内の特定の言葉に対する反応など基本的なBotならもうこれだけで充分です。

 それに後で機能の追加か変更がやりやすい構造で作ってあり親切でした。

これをコピペしてBotの基板部分は完璧ですね

 

 

 

Wikipediaの本文取得部分

まずWikipediaのランダムなページに飛ぶ方法として

http://ja.wikipedia.org/wiki/Special:Randompage

というURLがあるんですね、今回初めて知りました。

次にwebページの本文を抽出する所ですがC#では書いたことがありますがPythonでは初めてですそこでググると、

qiita.comおぉありました。これをコピペですね。するとあら不思議ランダムなWikipediaのページの本文をGet出来ます。これとその前のを組み合わせるだけでランダムなWikipediaの記事の本文を垂れ流せます。(ほんとうQiita様々です)

というかwikipediaのURL自体単語をURLの最後につけてるだけなので聞かれた内容についてWikipediaの説明を返すどっかのOKGoogleみたいなBotはこれで充分完成です。

 

 

 

575の判定部分

まず575の判定に必要なのが本文を読んだ時の文字数と単語単位での分解です。高校の時に作った人工無能では形態素解析のライブラリはMeCabを使ったのですが今回は導入しやすい(らしい)Janomeを使いました。

この辺はさすがにコピペでは無いです。

方法としてはまず行ごとに見ていきます。スクレイピングして本文だけを取ってくる方法では本文を各行でリストにしているのでそれを使います。

次にそれら行を単語(一応形態素解析なので単語では無く形態素だが面倒なので単語とする)で分けて、それぞれの品詞と読みを調べるその部分のコードがこちら

t = Tokenizer()
words = [token.surface for token in t.tokenize(s)]
hinsi = [token.part_of_speech.split(',')[0] for token in t.tokenize(s)]
yomi = [token.reading for token in t.tokenize(s)]

変数名適当だなとかいうツッコミはよして下さい。公開する気の無いコードなので……sが本文です。

まずまともな575になるようにスタートは名詞からに限定しました。まず文字数についてですがJanomeでは読みは基本全角カタカナですが記号は基本読みも記号で返されますし算用数字は*で返されるのでカタカナであるかどうかの確認をする必要があります。そこで参考になるのがこちらのサイト

qiita.comこれを参考にカタカナ以外の文字を除外したりカタカナだけの文字数を数えたり出来ます。

より自然な575を取得するために上五、中七、下五を跨ぐ単語が無いようにします。また句点を跨ぐことが無いようにもしました。この辺はほぼ初めてPythonを触る自分のような人間でも書けるので割愛します。

ちなみにカッコとかが入るとぐちゃぐちゃした物になるのでカッコが入らないようにしてもいいかもしれません。今回自分は一句の中で完結するカッコ以外を含む場合は別の所から575を探しなおすようにしました。

 

 

 

575に関連深い画像の自動取得

はじめは575の中の名詞からランダムに選んだ名詞をキーワードとしてそのキーワードに関係ある画像を取ってくるとしようかと思ってました。

しかしわざわざランダムで選ばなくても575のはじめの単語は名詞と決めていたので始めの単語をキーワードとすることにしました。キーワードは決まったので後はそのキーワードに関連する画像の取得、

そうGoogle画像検索です。

はい、API制限がいやなので当然スクレイピングです。

はいpythonスクレイピングをする経験はあまりなかったのでコピペです。

はい、これです

qiita.comすごい、本当にコピペだけで出来るんですね……

 

 

 

画像に文字列を合成と自動生成

これは完全にコピペですね

www.crz33.comここまでコピペ祭りでこれを自分の作品と言っていいのかとても心配だったりしますがまぁいいでしょう

 

 

完成図

完成したBotです

f:id:strelka_dog:20190910020743p:plain

不穏な句をいきなり出してくるBot

いきなり不穏な句を発表してきました。

f:id:strelka_dog:20190910021143p:plain

結構面白い物を出してくる時は出してきますね。ですがJanomeもあくまで形態素解析用であり単語分解では無いので結構変なところで切ってきたりというのもあるのですがそれもまた一興です。