継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

「Google Colaboratory」でツイートをテキストマイニングする

タダです。

機械学習技術や Python に興味があり、色々と勉強中で技術を手を動かして学びたいと思っていました。

そんな折、からあげさん( id:karaage )の機械学習コンテンツを購入し、テキストマイニングチュートリアルに取り組んだのでその内容をまとめていきます。

note.mu

チュートリアル概要

上記のチュートリアルでは「Google Colaboratory」を使って Twitter の自分のツイートでテキストマイニングを行います。

テキストマイニングとは文章からデータを単語や文節で区切り、それらの出現の頻度や相関、出現傾向、時系列などを解析することで有用な情報を取り出す、テキストデータの分析方法です。

ja.wikipedia.org

例えば、商品評価や顧客サービスの改善に利用される技術です。

Google Colaboratory について

Google Colaboratory」はブラウザの Jupyter Notebook 環境です。

colab.research.google.com

Google Colaboratory」の利用条件は、 Google のアカウントと Google Drive が保管場所になるためこの2つを使える必要があります。

関連記事

Google Colaboratory」については、以前社内勉強会でも触れて発表しました。 sadayoshi-tada.hatenablog.com

Google Colaboratory のメリット

Google Colaboratory」のメリットはなんといっても 環境構築が不要 であることです。起動したらそのまま機械学習の開発ができてしまいます。

そして、利用料は、無料です。GPU を乗せたオプションもありますがこれも無料。さすが、 Google さんと言わざるを言えません。

使い方含めて、下記の記事が参考になります。

www.codexa.net

チュートリアルで学べること

チュートリアルを通じて学べることを以下にまとめていきます。

なお、Python のプログラミングが必要になりますが、以下のものを利用します。

  • Pandas : 数理用ライブラリ
  • matplotlib : グラフなどの描画ライブラリ
  • janome : 言葉の形態素解析エンジン
  • Word Cloud : 単語の可視化ツール

また、予め Twitter および Google アカウントも必要です。

CSV ファイルの読み込み/抽出

全てのツイートをエクスポートするには以下の方法で実施します。

help.twitter.com

ツイートデータは、 CSV ファイルになっているため、 Pandas で読み込みさせます。

import pandas as pd

df = pd.read_csv('tweets.csv', encoding='utf-8')
df.head()

以下の画像のようにデータが読み込まれます。余談ですが、絵文字もちゃんと表示してくれます。

text カラムが今回の処理対象です。 f:id:sadayoshi_tada:20190319100114p:plain

データの前処理

ツイートには、後述する頻出単語を抽出するにあたって、特徴的な単語とは異なる不要な単語(記号や句読点など)、ノイズがいくつも入っています。

そのため、前処理として不要な単語を取り除く処理を、正規表現で行います。

例えば、以下のように処理します。

text = re.sub(r'#', "", text)
text = re.sub(r'\!', "", text)
text = re.sub(r'\(.*', "", text)
text = re.sub(r'.*\)', "", text)
text = re.sub(r'\*', "", text)
text = re.sub(r'\n', "", text)
text = re.sub(r'\$.*', "", text)
text = re.sub(r'`.*`', "", text)
text = re.sub(r'https?://[\w/:%#\$&\?\(\)~\.=\+\-…]+', "", text)
text = re.sub(r'@.* ', "", text)
text = re.sub(r'@さんから', "", text)
text = re.sub(r'【', "", text)
text = re.sub(r'】', "", text)
text = re.sub(r'『', "", text)
text = re.sub(r'』', "", text)
text = re.sub(r'「', "", text)
text = re.sub(r'」', "", text)
text = re.sub(r'(', "", text)
text = re.sub(r')', "", text)
text = re.sub(r'〜', "", text)
text = re.sub(r'〜', "", text)
text = re.sub(r'-', "", text)
text = re.sub(r'>', "", text)
text = re.sub(r'|', "", text)
text = re.sub(r' |', "", text)
text = re.sub(r'[a-zA-Z]', "", text)
text = re.sub(r'\d', "", text)
text = re.sub(r'&', "", text)
text = re.sub(r';', "", text)
text = re.sub(r'/', "", text)
text = re.sub(r'"', "", text)
text = re.sub(r'“', "", text)
text = re.sub(r'”', "", text)
text = re.sub(r'\.', "", text)
text = re.sub('や', "", text)
text = re.sub('などの', "", text)
text = re.sub(r'^・$', "", text)
text = text.strip()

単語ごとに分かち書きを行う

前処理後の単語を、分かち書きして別ファイルに保存します。

分かち書きとは、文章において語の区切りに空白を挟んで記述することです。

note.nkmk.me

コードでは、以下のように表現します。

from janome.tokenizer import Tokenizer
from collections import Counter, defaultdict
def counter(texts):
  t = Tokenizer()
  words_count = defaultdict(int)
  words = []
  for text in texts:
      tokens = t.tokenize(text)
      for token in tokens:
          pos = token.part_of_speech.split(',')[0]
          if pos == '名詞':
              words_count[token.base_form] += 1
              words.append(token.base_form)
  return words_count, words
words_count, words = counter(text_list)
text = ' '.join(words)
with open('ツイートを読み込ませるファイル', 'w', encoding='utf-8') as f:
  f.write(text)

Word Cloud でツイートの可視化

いよいよ、ツイートを可視化してみます。

Word Cloud でツイートを可視化してみると、以下のように表示されます。

f:id:sadayoshi_tada:20190319043751p:plain

コードで表すと、約10行ほどで可視化できてしまいます。

from wordcloud import WordCloud
import matplotlib.pyplot as plt
with open('ツイートを読み込ませるファイル') as f:
  text = f.read()
fpath = '/usr/share/fonts/opentype/ipafont-gothic/ipagp.ttf'
wordcloud = WordCloud(background_color="white", font_path=fpath, width=900, height=500).generate(text)
plt.figure(figsize=(15,12))
plt.imshow(wordcloud)
plt.axis("off")
plt.show()

参考情報

github.com

ツイートから頻出単語の抽出

また、ツイートからの頻出単語の抽出行います。テキストマイニングで必要な処理ですね。 d[:100]: で表示させる単語の最大の順位を示している為もっと表示させたい場合、この値を大きくします。

words = {}
for word in text.split(" "):
   words[word] = words.get(word, 0) + 1
d = [(v,k) for k,v in words.items()]
d.sort()
d.reverse()
for count, word in d[:100]:
   print(count, word)

そんなわけで、僕のツイート頻出単語を TOP 30位を出してみました。まだノイズが入っているので前処理で絞る必要がありますね。

328 –
49 :
46 今
40 勉強
37 技術
35 肉
34 会
34 ブログ
34 こ
33 自分
33 –,
31 的
30 方
30 |
24 本
23 –,,
22 間
22 発表
21 記事
21 参加
20 好き
20 一
19 株式会社
19 今夜
19 タディ
19 エンジニア
18 登録
18 明
18 学習
18 サビス

作成したコード

作ったコードですが、以下のリンク先にあります。 colab.research.google.com

ノイズを取り除いてみた結果の可視化の画像もはっておきます。ブログがでかい! ただ、ノイズがあるため継続してやってみます。 f:id:sadayoshi_tada:20190320095243p:plain

まとめ

自分のツイートを Word Cloud で可視化するのはとても簡単なコードで実現できるんだなという感想を持ちました。

よくデータ分析の分野で「前処理」が大切だというのが今回ノイズを消去したりして、実感できました。

前処理」として「ストップワード」というのもあります。今回触れてないですが、次にトライしてみます。

qiita.com

最後に、今回紹介したものに加え、からあげさん( id:karaage ) のチュートリアルは複数あり、コードを分からなくてもコピペで進められて良心的です。

また、「Google Colaboratory」は簡単かつ無料で始められるので、興味ある分野があれば購入されてみてはいかがでしょうか? note.mu

関連記事

僕同様このチュートリアルに関するブログを以下に記載します。 note.mu

あと、Slack の可視化を行なっています。 www.tokyo-ict.com