IT

【ソースコード付き】Twitterのつぶやきを感情分析してみる その1

 

Advertisements

はじめに

日本語のテキストマイニングを、Facebook FastTextで実際にやってみる。
Facebook FastTextのsouce codeはすべてここから取得できます。
build方法なども書いてある。

今回は、Twitterのつぶやきの感情分析を行い、
そのつぶやきが ポジティブ なのか ネガティブ なのか、それを判定してみようと思う。

 

前提

すでに前の記事で以下について投稿済みなので、そちらを事前に見ておくと、スムーズかと思います。

  1. 環境構築
    • Mecabやfasttextなどの導入手順
  2. 日本語の前処理
    • 形態素解析
    • テキストマイニングの精度向上させるコツ
    • それを実現するためのライブラリとその使い方
  3. 本記事で使用するコードは、全てここから取得可能

 

手順

以下のような順で実施する。

  1. twitterからデータを入手する
  2. 入手したデータの前処理
  3. 教師データの学習と学習モデル作成
  4. 評価対象データの分類
  5. 結果の可視化
  6. 結果の解釈

長くなるので、今回は 入手したデータの前処理 までを述べる。

 

1. twitterからデータを入手する

基本的に、以下のようにgetTweet.pyに引数を与えて実行すれば取得できる。

対象アカウントとして、引数に複数指定できる。
1.1節で、一気に複数アカウントを取得するshell scriptを紹介する。

 

ただし、Twitter APIの制限で、最大およそ3,000件 しか取得できない。
そのため、たくさんつぶやくアカウントのデータ期間は短くなることに注意。
そしてその逆に、あまり呟かないアカウントデータ期間は、長くなる。

 

1.1 教師データの入手

教師データの準備として、twitterでポジティブ名言とネガティブ名言を取得する。
ポジティブ名言として取得したアカウント、ネガティブ明言として取得したアカウントの一覧は以下の通り。

分類アカウントアカウント数
ポジティブpositive_bot3 posi_tive_sp_ kami_positive positivekk_bot maemukikotoba1 Plus_bot heart_meign bot105863218
ネガティブn_siko nega_bot Mostnegative cynicalbot UnluckyBot Antinatalismbot6

 
教師データとする、ネガティブ発言を集めるのが悩ましかった。そりゃそうか。
みんな、ネガティブなことなんて、聞きたいくないし。

以下のように、shellからpython codeを呼び出して、twitterデータを収集する。

 
この後も使うため、ポジティブなアカウントとネガィテブなアカウントを、
それぞれ P_ARRAYN_ARRAY という配列に入れておく。

どんな処理をしているのか気になる場合は、getTweet.pyの中身を見て欲しい。
positive_bot3.n_siko.txt、。。。といった、アカウント名.txt というテキストファイルが作成される。

ファイルの中身は、こんな感じになっているはず。
これは、「positive_bot3.txt」 の中身の一部です。

 

1.2 評価対象データの入手

分析対象データもtwitterのつぶやきなので、合わせて取得しておく。
方法は、教師データとまったく同様。

分類アカウントアカウント数
個人的フォロワーboomin614 shimasho yutokiku karen529mm iwasaki_p toosee_spidy6
アニメのキャラセリフ他matsuoka_shuzo shinji0606_bot ayano05153
日経関連アカウントnikkei nikkeilive nikkeivdata nikkeistyle nikkeiDUAL nikkei_WOL nikkei_ent Nikkei_TRENDY9

 
以下のようにすることで、boomin614.txt、shimasho.txt、。。。といった、アカウント名.txt というテキストファイルが作成される。

ファイルの中身は、こんな感じになっているはず。
これは、「nikkei.txt」 の中身の一部。

 

Advertisements

2. 入手したデータの前処理

ここでは、twitterとして得られた教師データと評価対象データの前処理について述べる。

 

2.1 教師データの前処理

前処理としてやらないといけないことは、だいたい以下の通り。

  1. 不要データの削除
  2. 規格化、分かち書き、品詞フィルタ
    • 教師データとして、ノイズ低減のために、規格化と品詞やストップワードによるフィルタリングが必要
    • さらに、日本語の場合、単語で分かち書きする必要あり
  3. 学習対象データの抽出と連結
  4. 学習対象データのラベル付け
  5. 重複データの削除

不要データの削除は、形態素解析する前のほうが都合がいいこともあるし、
あとのほうが都合がよいこともあるでしょう。
処理順や処理内容は、ここで述べる内容をもとに、各自でデータごとに、そこは適当に処理をしてください。

 

2.1.1 不要データの削除(お好み)

分析において、その他削除したい単語などがある場合は、その処理を行う。

例えば、今回の場合、twitterのデータを分析対象としている。
そのため、内容によっては、以下のような文字列(とその正規表現)は、削除したくなるかもしれない。

  • Hashtagの削除
    • hashtagそのものは、文章の流れとは関係ないと判断して削除
  • 引用元を削除
    • (人名)となっているような部分は、文章の流れではないと仮定して削除
    • アカウントによって表現は異なるが、例えば以下のようなケースがある。
    • (\w*)や、 \(\w*\)
    • ~\w*~とか
  • リプライを削除
    • botのアカウントを使って、管理者が呟いているようなものは、名言じゃないと判断して削除する
    • @\.* とか

こうした上記のような文字列は、教師データとしてふさわしくないとして、削除する。
実際には、アカウントというか、対象データの中身を見て、しかるべき文字列を削除する。

ここでは、いちいちアカウントごとに一つずつやるのも面倒なので、正規表現で一括処理することにする。

 
どんな処理をしているのかは、regexp.shの中身を見てほしい。
sed使って正規表現で一気に該当部分を削除しているだけ。
これを実行すると、元ファイルが書き換えられる。
それが嫌なら、元のtweetデータはバックアップを取っておくこと。

 

2.1.2 教師データの規格化、分かち書き、品詞フィルタ

こんな感じで、createLearningData.pyに引数を指定して実行する。

 
-nオプションで、対象のカラム番号を指定する。
最初のカラム番号が、0から始まることに注意する。
すなわち、ここで2をしているということは、3番目のカラムとなる。

以下のような2つのファイルが出力される。

  • w_positive_bot3.tsv
  • w_positive_bot3.pkl

教師データの前処理としては、以降、拡張子が「tsv」のものを使用する。

このコマンドの結果、以下のような内容のファイルが得られる。
これは、w_positive_bot3.tsv の内容となる。

 
ちゃんと、形態素解析され、基本形に変換され、そしてストップワード(記号などの除外)や
品詞フィルタ(ここでは名詞、形容詞、副詞、動詞、助動詞のみ)が効いている。
ここの処理の詳しい中身は、日本語の前処理を読んでください。

 
一般的には、助動詞は除外することが多い。
しかし、今回はネガポジの感情判定することが目的。
否定を検知するために、意図的に助動詞を分析対象として選択している。
ただ、これが良かったのか悪かったのかはわからない

 

2.1.3 対象データの抽出と連結、そしてラベル付け

まず、tweetデータ以外は不要なので、それだけを取り出す。
そしてポジティブなアカウントのつぶやきだけ、ネガティブなアカウントのつぶやきだけでまとめる。
ついでに、正解ラベルも付けておく。

以下のスクリプトで処理している内容:

  1. 対象ファイルの3列目が空じゃないものだけを対象とする
  2. 3列目だけを抽出
  3. 抽出された文章の先頭に、ラベルを付ける。

ここでは、

  • positiveな文章の先頭に __label__1,
  • negativeな文章の先頭に __label__2,

を付ける。
これは、FastTextの仕様というかルール。
デフォルトでは、ラベルには__label__を付けておく必要がある。

これを、 awksed で処理する。
shell scriptなら、パイプでつなげれば1行で書ける。超便利。

各ファイルの先頭行には、「date user tweet」というヘッダがついている。
そこで、awkで1行読み飛ばすオプションを付けて、ヘッダをスキップさせる必要があることに注意。

上記のawkを使ったscriptで以下のような中身の 「label_negaposi.tsv」 が得られるはず。

ネガティブ発言も同様。
ただし、ネガティブ名言の場合は、ラベルを **__label__2** としていることに留意。
また、教師データとして1つのファイルにまとめたいので、ポジティブ発言で出力したファイル
label_negaposi.tsv に、追記していることに留意。

2.1.4 重複データの削除

元ネタがbotなので、同じセリフを繰り返しつぶやいている。そのため、この重複を排除しないと、
** 特定の繰り返し回数が多い** 発言が、よりポジティブ(ネガティブ)なもの、として学習されてしまう。
そこで、重複したセリフを排除する。

ただ、これも物は考えようで、繰り返しが多いものは、
よりポジティブだったりネガィテブだったりと考えることもできる。
ここをどう考えて教師データを作るか、データのクレンジングはいつも悩ましい。

2.2 評価対象データの前処理

教師データと同様、評価対象データも同様に、前処理を行う。
具体的な内容は、基本的に一緒だが、ラベル付は不要。
教師データより、することは少ない。

  1. 規格化、分かち書き、品詞フィルタ
  2. 不要データの削除

-nの引数で、対象カラム番号を指定する。複数指定可。
アカウント数だけファイルがあるはずなので、とにかく処理する。

上記のようなコマンドを打鍵した場合、以下のような2つの結果ファイルが作られる。

  • w_boomin614.tsv
  • w_boomin614.pkl

拡張子が「pkl」のものを、後続の処理で使用する。

2.3 これまでの処理結果の確認

ここまで、教示データと評価対象データに対して、前処理を行ってきた。
その結果、以下のような内容のファイルが得られているか、確認しておきましょう。

  • 教師データ [traindata.tsv]

  • 評価対象データ [w_nikkei.tsv]

  • 評価対象データ [w_boomin614.tsv]

 

まとめ

今回の作業で、教師データ評価対象データの準備ができた。
次回は、教師データを使って機械学習を行い、学習モデルを作る。
さらに、その学習モデルを使って、評価対象データのネガポジ判定を行うことにする。

Advertisements

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

seventeen + seventeen =