荷物持ちでも構わない

文系大学4年生からデータサイエンティストを目指して頑張りつつ、書きたいことを書きたいときに書きたいだけ書く、ルール無用雑記ブログ。

MENU

RとKHCoderを使ってSHARP公式のツイートをテキストマイニングする

一昨日、昨日と、テキストマイニングについての記事を書いてきたが、

今日は、データ取得→加工→形態素解析→クラスタリング という一連の流れをやってみようと思う。

使うツールはRとKHCoderとMeCab。

一昨日と昨日の記事を読んでいないという人は、先にそっちを読んでもらった方が話がわかりやすいと思う。

www.messyer813.com

www.messyer813.com

今回のテキストマイニングの目的のおさらい

再三言っているように、僕は卒論の研究のために、企業の公式ツイッターからツイートを取得し、それをテキストマイニングしてさらに重回帰モデルに突っ込むという作業をマスターしなければいけない。

そのため、ゴールとしては、ツイートの取得→データの加工→形態素解析→クラスタリング→クラスタリングの結果と他の変数を元にした重回帰モデルの作成、という一連の流れ全てを完璧に扱えるようになること。

今回は、ツイートの取得→データの加工→形態素解析→クラスタリング、までをやってみる。

そして、今回も実験台となるのは、ツイッターのSHARP公式アカウント。

ちなみに卒論本番でもSHARP公式を対象に研究を行う予定である。

RでツイッターのAPIを叩いてSHARP公式のツイートを取得する

まず、RでツイッターのAPIを叩いてSHARP公式のツイートを取得するのだが、そのためには、ツイッターのAPIを叩くためのアプリを作成する必要がある。

アプリ作成の方法は、以下の記事が大変参考になるので読んでほしい。

www.randpy.tokyo

ちなみに、この記事は少し情報が古いので、現在はAPIを叩くためのアプリ作成の際に、ツイッター社に対して、「どういう目的で使うアプリなのか」を英語で説明する文を書かなくてはいけなくなっているはずだ。

僕は仕事で使うためにずいぶん前に既にアプリを作成していたので難を逃れたが、これからツイッターのAPIを使おうとしている人は英作文をがんばってほしい。

RでツイッターのAPIを叩くために必要なパッケージを読み込む

まず、RでツイッターのAPIを叩くための前準備として、必要なパッケージを適当に読み込む。

もしかしたら必要ないパッケージも含まれているかもしれないが、まあ一応全て読み込んでおけば問題ない。

library(twitteR)
library(dplyr)
library(magrittr)
library(stringr)
library(RMeCab)

ちなみに、RでツイッターのAPIを叩くためのパッケージには、「twitteR」と「rtweet」があるが、僕は「twitteR」の方を使う。

理由としては、今年6月に行われたツイッターAPIの仕様変更によって、「rtweet」でツイートを取得しようとするとエラーが返ってくるようになってしまったためである。

解決策はあると思うのだが、「twitteR」を使った方が簡単なので、こちらを使っていく。

6月に行われたツイッターAPIの仕様変更については以下の記事を参照のこと。

www.messyer813.com

RでツイッターのAPIを叩くために必要なConsumerKeyやAccessTokenを読み込む

ツイッターのAPI使用のために作成したアプリから、ConsumerKeyやAccessTokenなどを取得し、コピペしてRに読み込ませておく。

 

consumerKey <- "XXXXXXXXXXXXXXXXXX"
consumerSecret <- "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
accessToken <- "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
accessSecret <- "XXXXXXXXXXXXXXXXXXXXXXXXXXX"

これがないとツイッターのAPIが叩けずツイートが取得できないのと、これらは作成したアプリごとに異なるので、先述した参考記事に従ってがんばってアプリを作成してほしい。

恐らく、今回の記事で一番の難関はAPIを叩くためのアプリ作成の工程だと思う。

一番の難関ポイントをすっ飛ばしていて申し訳ないが、僕は既に自分のアプリを持っているので仕方ない。許してほしい。

「twitteR」パッケージの関数を使ってツイッターのアプリを認証する

上の工程で読み込ませておいたConsumerKeyやAccessTokenを使って、以下のように関数を実行して、R上でツイッターのアプリを認証する。

options(httr_oauth_cache = TRUE)
setup_twitter_oauth(consumerKey, consumerSecret, accessToken, accessSecret)

この関数を実行したあと、Rのコンソールに、

[1] "Using direct authentication" 

と表示されたら認証成功。これでRからツイッターのAPIを叩けるようになる。

RでツイッターのAPIを叩いてSHARP公式のツイートを取得する

さて、ここまで前準備が長かったが、ようやくこれでSHARP公式のツイートを取得できるようになった。

userTimeline()関数で@SHARP_JPのツイートを取得するように指示する。

また、僕調べによると、一度に取得できるツイートは過去2000件までらしいので、最大限に取得するためn=2000と指定する。

tweets <- userTimeline("SHARP_JP", n = 2000)
tweets <- twListToDF(tweets)

"SHARP_JP"の部分を他のアカウントのIDに置き換えることで、好きなアカウントのツイートを取得することができる。

環境にもよるが、2000ツイートも取得するとなると数秒~数十秒程度かかるので、少し待とう。

ツイートが取得出来たら、twListToDF()関数で、取得したツイートをデータフレームにする。

 

完成したデータフレームがこんな感じ。

f:id:messyer813:20180901130512p:plain

ツイート本文以外にもいろいろな情報が一緒に詰め込まれていることがわかる。

今回はRが必要になる工程はここまで。

最後に、write.csv()関数を使って、完成したデータフレームをcsvにして出力してやる。

write.csv(tweets,"SHARP_JP.csv")

 

出力されたcsvファイルがこんな感じ。

f:id:messyer813:20180901130847p:plain

実を言えば、テキストマイニングをするだけならツイート本文以外の部分は保存しておく必要はないのだが、僕の場合は卒論の研究のためにふぁぼやリツイートの数も記録しておく必要があるので、全部まとめて保存した。

まあいらないデータはエクセルで列ごと消してやればいい話なので、大した問題ではない。

Rで取得したSHARP公式のツイートをKHCoderでテキストマイニングできるように加工する

ここからはエクセルでの操作になるので、Rは閉じてしまってOK。

そして、先ほどRで出力したCSVを開き、これから、このCSVをKHCoderでテキストマイニングできるような形に加工してやる。

この工程では、エクセルで正規表現による検索ができるようになるアドインを使うので、あらかじめ導入しておく必要がある。

KHCoderとエクセルの正規表現検索アドインの導入方法や使い方については、冒頭の過去記事を参照のこと。

エクセル用正規表現検索アドインを使ってKHCoderが読み込みやすいようにCSVを加工する

出力されたCSVファイルのうち、テキストマイニングに使うのはツイート本文の部分だけなのだが、これからKHCoderでテキストマイニングするにあたって邪魔になるものが大きく3つ存在する。

  1. ツイッターのユーザーID
  2. リンクURL
  3. 絵文字が変換されたと思われる英数字

この3つを、正規表現検索を使って全て削除していく。

 

ちなみに加工前のCSVがこれで、上述の邪魔なもの3つの例を赤く囲んで示してある。

これらを、これから正規表現検索で一気に削除していく。

f:id:messyer813:20180901132357p:plain

 

正規表現についても冒頭の過去記事で既に説明しているので詳しい説明は省くけども、任意の文字列を表す正規表現の「.*」を使うことで、これらの邪魔なものを消していくことができる。

例えば、ユーザーID(@〇〇〇〇)を消したい場合は、「@.*_(半角スペース)」という表記で空白に置換してやることで全て削除できる。

そうやって、上で示した3つの邪魔なものたちを全て削除した結果がこれ。

f:id:messyer813:20180901132832p:plain

邪魔なものたちがすべて綺麗に消えて、ほぼ日本語だけを残して加工することができた。

顔文字も本来は消すべきなのかもしれないが、顔文字は正規表現を使っても少々消すのが面倒なのでここでは放置しておく。

 

最後に、KHCoderはCSVファイルをテキストファイルとして読み込むことができるのだが、どの列をテキストとして扱うかはこちらで示してやる必要がある。

具体的には、テキストとして扱う列の1行目のセルに「テキスト」と入力してやる必要があるので、これを忘れずにやっておく。

f:id:messyer813:20180901133230p:plain

ここまで出来たら、エクセルによる前処理は完了。

最後に上書き保存して、ここからはKHCoderによるテキストマイニング作業に入る。

KHCoderでSHARP公式のツイートをテキストマイニングする

いよいよ本番のテキストマイニング。

ちなみに、僕が使っているKHCoderはバージョン2(安定版)の方なので、バージョン3(α版)を使っている人は多少操作が違うところがあるかもしれないので注意。

KHCoderでテキストマイニングする対象のCSVファイルを読み込む

まずはKHCoderを起動し、ツールバーの「プロジェクト」→「ツール」→「新規」から、先ほど加工したCSVファイルを開く。

そして、「分析対象とする列」を「テキスト」と選択するのを忘れないようにする。

選択出来たら、「OK」をクリック。

f:id:messyer813:20180901134042p:plain

KHCoderでテキストマイニングするための前処理を行う

対象のCSVファイルを読み込めたら、ツールバーの「前処理」→「分析対象ファイルのチェック」から、ファイルに問題が無いかのチェックを行う。

問題があった場合、以下のような画面が表示されるので、「分析対象ファイルの自動修正:実行」というところをクリックして自動修正してもらう。

自動修正が問題なくできたら、「閉じる」をクリックしてチェックを終了する。

f:id:messyer813:20180901134504p:plain

 

次に、ツールバーの「前処理」→「前処理の実行」から、KHCoderでテキストマイニングを行うための前処理を実行する。

これには少し時間がかかる(数分程度)場合があるため、気長に待つ。

前処理がうまくいけば、こんな感じで抽出された語の数などが表示される。

これで、KHCoderでテキストマイニングをするための前処理は完了。

f:id:messyer813:20180901135130p:plain

KHCoderでSHARP公式のツイートをクラスタリングしてみよう

今度こそ本当にこれで最後。

前処理が完了したファイルを使って、KHCoderでツイート内容をクラスター分析にかける。

ツールバーより、「ツール」→「文書」→「クラスター分析」を選択。

f:id:messyer813:20180901135415p:plain

集計単位はH5、最小出現数は2、「品詞による語の取捨選択」は「否定助動詞」と「形容詞(非自立)」以外にすべてチェックを入れ、クラスタリングの方法はWard法、距離はEuclid(ユークリッド)、標準化は文書ごと、値はTF-IDFを選択し、クラスター数は2に設定する。

このあたりの設定は研究の目的や対象とするテキストの内容にもよるので、絶対にこれ、というものではないのだが、僕が参考にしている『Text Mining Maniax』という本がこの設定を推奨しているのでこれに従っている。

設定ができたら、「OK」をクリックしてクラスタリング開始。

Text Mining Maniax: フリーソフトで始める日本語計量テキスト分析

Text Mining Maniax: フリーソフトで始める日本語計量テキスト分析

 

 

f:id:messyer813:20180901135907p:plain

するとこんな感じで結果が出力された。

これだけ見てもクラスターの中身がどうなっているかがよくわからないので、とりあえず「分類結果の保存」をクリックする。

 

f:id:messyer813:20180901140151p:plain

保存する名前を決めたら、保存された外部変数を選択し、「出力」をクリック。

これでクラスタリングの結果がCSVで保存できる。

 

f:id:messyer813:20180901140336p:plain

ちなみに中身はこんな感じになっている。

これだけではよくわからないので、出力されたCSVの2列目をコピーし、テキストマイニングの元になったCSVのテキスト列の横に貼り付ける。

 

f:id:messyer813:20180901140551p:plain

するとこんな感じになる。

さらにわかりやすくするため、クラスター番号で並び替えを行う。

f:id:messyer813:20180901140757p:plain
f:id:messyer813:20180901140808p:plain

最終的にこうなった。

どうやら、SHARP公式のツイートをクラスター数2つでクラスタリングすると、顧客への感謝のリプライ(クラスター1)と、それ以外の雑多なツイート(クラスター2)に分かれるようである。

SHARP公式ツイッターの半分は顧客への感謝でできているらしい。

より厳密に言うと、クラスター1に分類されたのが77文、クラスター2に分類されたのが328文だったので、SHARP公式ツイッターの19%は顧客への感謝、あとの81%はそれ以外の雑多なツイートでできているようだ。

このツイッターアカウントが売り上げに貢献しているのかどうかは甚だ疑問だが、とりあえずこんな感じの結果が得られた。

これで、今回のテキストマイニングの一連の流れは終了。

まとめ

RでツイッターのAPIを叩いてツイートを取得し、エクセルに出力してツイート本文を加工し、KHCoderで形態素解析してクラスタリングするという、テキストマイニングの簡単な流れを実際にやってみた。

本当に簡単なことしかやっていないので、ここからワードクラウドを作るとか、共起語ネットワークを視覚化してみるとか、クラスタリングの結果をさらに分析してみるとか、いろいろ応用が利くと思う。

僕はまだまだテキストマイニングを勉強し始めて日が浅いので、今回はこれが精いっぱい。

しかし、卒論のテーマの関係上、この程度では研究として認められないので、これからもテキストマイニングの勉強を続けていく所存である。

また知識をアップデートできたら記事にまとめていきたいと思う。

今回はこれでおしまい。

Text Mining Maniax: フリーソフトで始める日本語計量テキスト分析

Text Mining Maniax: フリーソフトで始める日本語計量テキスト分析

 
Rによるスクレイピング入門

Rによるスクレイピング入門

  • 作者: 石田基広,市川太祐,瓜生真也,湯谷啓明
  • 出版社/メーカー: シーアンドアール研究所
  • 発売日: 2017/03/27
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログ (2件) を見る
 
退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング