義理チョコ文化、やめませんか?Pythonでバレンタインに関するツイートを分析〜動機から技術スタック紹介編〜

Kazuki Imamura
Jan 21, 2019 · 7 min read

Happy Valentine!
https://happy-valentine.kaizumaki.net/

「バレンタインをやめたい」

私の職場では毎年バレンタインデーに「女性社員から男性社員へチョコレートを配る」という習慣があります。もちろん義理チョコです。そして、ホワイトデーに男性陣は「お返し」をしてくれます。

私はふと思いました。この習慣は、心理的負担しか生んでいないんじゃないかと。「あげなきゃいけない」「お返ししなくちゃいけない」という心理的負担。「数を間違っちゃいけない」という購入担当者にかかるプレッシャー。義理なのに、お礼を言ってまわるのもなんだか滑稽に思えてきます。

4つの部署を合わせて、女性陣5人に対して男性陣20人ですので、金銭的負担も当然です(まあ、その分ホワイトデーのお返しは豪華なものですが)。

そもそも、そんなにチョコレート食いたいか!?

今から半年くらい前に、私はうちの部署内の男性陣に「バレンタインをやめたい」と宣言しました。彼らの反応は好意的でした。ただし、「自分たちはいいけど、部長以上には渡しておいたほうがいいんじゃない?」という意見がついてきました。

隣の部署の人に言ってみても同じような反応でした。「私は大賛成ですけど、隣の部署はどうでしょうね?」

私は思いました。みんな、「自分自身はバレンタインをやめることには賛成だけど、他人のことまではわからない。だったら渡しておいたほうが無難なんじゃないの?」と考えているんだと。

うちの部署で「やめる」と宣言した以上、4つの部署全部でやめないと、ややこしいことになります。誰々は参加してる・してない、とか考慮しなくてはいけなくなりますからね。

しかし、私は周囲への根回しを続けることをやめました。エンジニアはエンジニアらしく表現しようと気持ちを切り替えました。
昨年末には「年賀状じまい」が話題になったように、今度は「義理チョコじまい」がじわじわ広がっていくに違いない(昨年はゴディバの「義理チョコをやめよう」の広告が印象的でした)、そう願って作ったのがこちら。

Happy Valentine!
https://happy-valentine.kaizumaki.net/

バレンタインに関するツイートを拾ってきて、形態素解析し、単語を数えてバブルチャートにしたものです。
バレンタインの“雰囲気”を可視化したいと思って作りました。

年の瀬に思いついて年明けから作り始め、とにかく2月14日に十分に間に合うようにと、かなり突貫で作業しました。まだまだアップデートしていきたいので、アドバイスありましたらよろしくお願いします!

技術スタックの紹介

【主な登場人物】

  • Twitter API
    昨年の夏にAPIの使用条件が変更されたようで、私が開発者アカウントを登録した際には、フォームにいろいろと書き込む必要がありました(2019年1月時点)。フォームにヒントが表示されるので、それに沿って丁寧に埋めていくと、一発で開発者アカウントが取得できます。
  • Python 3.7
    【主なライブラリ】
    ・tweepy
    ・mecab-python3
    ・scikit-learn(後述)
  • MeCab
    オープンソースの形態素解析エンジンです。今回、名詞・動詞・形容詞・副詞をDBに保存しています。
  • mecab-ipadic-NEologd
    MeCab用のシステム辞書です。新語に対応しています。Twitterといった新しい単語が使われるような文章の解析には必要だと思います。
    標準インストールするのに、少なくとも2GBのメモリが必要です。
  • MySQL 8.0
    私がMySQLしかわからないので使っています。mongoDBと迷いましたが、学習コストを考えて、使い慣れたMySQLにしました。バージョン8になって、パフォーマンスも良くなったらしいです。
  • D3.js v4
    チャートをビジュアライズするのに、かねてから使ってみたかったライブラリです。最新バージョンはv5ですが、これも学習コストを考えてサンプルが豊富なv4にしました。開発速度を優先したので、ほぼサンプルのコピペです。書き方もes5で、webpackなどでバンドルや圧縮などしていないので、古くさい感じは否めません(手を抜いた私のせいですが)。
  • Docker
    最近Dockerでの開発に慣れてきたので使っています。
  • さくらのVPS
    1GBプランでmecab-ipadic-NEologdのインストールを試みましたが、コケました。なので、2GBのメモリを積んでいるプランを今回のために契約しなおしました。


Happy Valentine!では、scikit-learnというPythonの機械学習ライブラリのTfidfVectorizerを使っています。
これは、TF-IDFを計算するための手段ですが、正直、私のサイトでここをどう処理するかは悩みました。
TF-IDFは、複数の文書の中のある一つの文書がどのような特徴を持っているかを導き出すものです。でも、私はツイートひとつひとつの特徴を導きたいわけではありませんでした。ある時間間隔の中でのツイートから得られる“空気感”みたいなものを表現できればいいと考えました。
そうすると、CountVectorizerを使って単語をカウントすれば事足りることになります。しかし、最終的にバブルチャートにするためには、出現率をうまいこと計算してくれる手段が必要でした。
なので、本来の使い方ではないですが、ある時間間隔のツイートをひとまとめにして、一つの文書としてTfidfVectorizerに処理させています。

ちなみに、記事執筆時点では、4時間間隔でツイートを処理させています。この間隔が適切かどうか、まだわかりません。もっと長いほうがいいかもしれません。
バブルチャートのカラーリングはランダムです。
もろもろアドバイスありましたらぜひお願いしたく思います。


現時点ではスパムツイート除外してませんし、感情のネガポジ判定もしていません。ツイートそのものの感情を見るには、Twitterで検索かけたほうが読み取れるでしょう。
ただ、私のサイトではバレンタインの“雰囲気”が感じとれればいいかなと思っています。

それにしても、この記事を書いている時点でサイトを見てみると、やはり企業やお店の宣伝ツイートが多いのか、バレンタイン反対派の私でも購買意欲をそそられる単語が並びますね。これが2月14日に近づくにつれ、どのように変化するのか楽しみです。

ちなみに、本命チョコまで否定はしないですよ。本当にあげたい気持ちがあれば大賛成です!

次回は、ソースコード編を書きたいと思います。

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store