【Python】ドナルド・トランプにおけるTwitter民の感情分析

今世界で最も話題の人、ドナルド・トランプ米大統領は就任から3年目になりました。大統領就任後、相次いで発信されるツイートがさまざまな波紋を引き起こしています。トランプの「迷」言集はいつもニュースやソーシャルメディアで響いて、日本のマスコミでも、彼の失言や暴言を切り取って面白おかしく報じています。トランプは馬鹿か、戦略家かって、市場の評価も両極端です。

この記事では、Webスクレイピングツールを使って、ドナルド・トランプに関するツイートを抽出します。それからPythonを使ってデータマイニングと感情分析を行い、大統領についての公衆の声を見つけます。最後に、Tableau publicを使ってそれらのデータを視覚化します。

それでは、早速スタートです！
 

#Webスクレイピングでデータを収集する

[Octoparse](https://www.octoparse.jp/)を使ってスクレイピングから始めます。公式サイトから[最新バージョン](https://www.octoparse.jp/Download)をダウンロードし、指示に従って登録を完了しました。ログインしたら、組み込みの[Twitterテンプレート](https://www.octoparse.jp/tutorial/template-mode/)を開きます。
![twitterテンプレート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262932/51b68b96-9317-bb3b-62e5-6e3c5d2a6f45.png)

**抽出されるデータ**
投稿者
投稿時間
コンテンツ
画像のURL
ツイートURL
コメント数、リツイート数、いいね数など

Webクローラーにキーワードを伝えるためにパラメータフィールドに「Donald Trump」と入力します。見た目と同じくらい簡単で、私は約1万件のツイートを得ました。もちろんあなたはできるだけ多くのツイートをスクレイピングすることができます。ツイートを取得したら、データをテキストファイルとしてエクスポートし、ファイルに「data.txt」という名前を付けます。
![抽出したデータ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262932/bf8b72f4-a285-02c4-7208-78da7e83e0dd.png)



#Pythonでデータマイニングと感情分析を行う

始める前に、Pythonとテキストエディタがコンピュータにインストールされていることを確認してください。私はPython 2.7とNotepad ++を使います。

それに、2つの意見単語リスト（ダウンロードは[こちら](https://github.com/jeffreybreen/twitter-sentiment-analysis-tutorial-201107/blob/master/data/opinion-lexicon-English/positive-words.txt)）を使用して、抽出されたツイートを分析します。これら2つのリストには、Minqing HuとBing Liuによってソーシャルメディアで出た意見語についての[調査研究](https://www.cs.uic.edu/~liub/FBS/sentiment-analysis.html)からまとめた肯定的な単語と否定的な単語（感情の単語）が含まれています。

ここでは、リストから各意見語を取り出し、ツイートに戻り、ツイートの中の各意見語の頻度を数えたいと思います。その結果、ツイートから対応する意見語とその数を収集します。

まず、ダウンロードした2つの単語リストによって、肯定的なリストと否定的なリストを作成します。それらのリストはテキストファイルから解析されたすべての単語を保存します。

```
import re
import json

# save the positive words into a list called p_list
with open('positive.txt') as f:
    p_txt = f.read()
    p_txt = re.sub('[,\.()":;!@#$%^&*\d]|\'s|\'', '', p_txt)
    p_list = p_txt.replace('\n',' ').replace('  ',' ').lower().split(' ')
    # test if cool is in the list
    print 'cool is in the postive list: ', 'cool' in p_list 

# save the negative words into a list called n_list
with open('negative.txt') as f:
    n_txt = f.read()
    n_txt = re.sub('[,\.()":;!@#$%^&*\d]|\'s|\'', '', n_txt)
    n_list = n_txt.replace('\n',' ').replace('  ',' ').lower().split(' ')
    # test if abrade is in the list
    print 'abrade is in the negative list: ', 'abrade' in n_list 
    # test if cool is in the list
    print 'cool is in the negative list: ', 'cool' in p_list 
```

次に、次のコードを使って句読点、記号、および数字をすべて削除してテキストを前処理し、データをまとめます。

```
# process the tweets
with open('data.txt') as f:
    txt = f.read()
    txt = re.sub('[,\.()":;!@#$%^&*\d]|\'s|\'', '', txt)
    word_list = txt.replace('\n',' ').replace('  ',' ').lower().split(' ')
```

分析を容易するために、データはトークン化された単語のみで構成されます。その後、word_count_dict、word_count_positive、およびword_count_negativeの3つの辞書を作成します。

```
# create empty dictionaries
word_count_dict = {}
word_count_positive = {}
word_count_negative= {}
```


それから、各辞書を定義します。データに意見語がある場合は、word_count_dictの値を1増やして数えます。

```
for word in word_list:
	# count all words frequency
        if word in word_count_dict.keys():
            word_count_dict[word] += 1
        else:
            word_count_dict[word] = 1
```


計算した後、単語が肯定的か否定的かを判断します。それが肯定的な単語である場合、word_count_positiveはその値を「1」増加させます。それ以外の場合、肯定的な辞書は同じ値のままです。同じように、word_count_negativeはその値を増やすか、同じ値のままにします。その単語が肯定的なリストにも否定的なリストにも存在しない場合、それは合格です。

		# count if it is a positive word
        if word in p_list:
            if word in word_count_positive.keys():
                word_count_positive[word] += 1
            else:
                word_count_positive[word] = 1
		# else see if it is a negative word
        elif word in n_list:
            if word in word_count_negative.keys():
                word_count_negative[word] += 1
            else:
                word_count_negative[word] = 1
        else: # do nothing
			pass




コードの完全版については、[ここ](https://gist.github.com/octoparse/fd9e0006794754edfbdaea86de5b1a51)からダウンロードできます。


#感情：肯定的 vs. 否定的

その結果、5352個の否定的な単語と3894個の肯定的な単語を得ました。それらをTableau publicで開き、バブルチャートを作成しました。[Tablau publicでバブルチャートを作成する方法](https://onlinehelp.tableau.com/current/pro/desktop/en-us/buildexamples_bubbles.htm)をご参考ください。
![バブルチャート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262932/fed4257c-dcee-eac7-a64d-26f3fc476554.png)


肯定的な言葉の使用は一面的で、使用されている肯定的な単語は404種類だけです。最も頻繁に使用される単語は「like」、「great」、「right」で、ほとんどの単語の選択は「wow」や「cool」など基本的な口語です。しかし、否定的な単語の使用はより多面的で、809種類の否定的な単語があり、それらのほとんどは正式で高級なものです。最も頻繁に使用されるのは「illegal」、「lies」、「racist」です。「delinquent」、「inflammatory」、「hypocrites」などの他の高級な単語も存在しています。

 

 

#まとめ

今回の分析により、ドナルド・トランプはTwitterユーザーの間ではあまり歓迎されていないことを明らかに示しています。ただし、15000件のツイートをスクレイピングしたが、スクレイピングされたデータの中には、テキストの内容がない、意見がまったく表示されないツイートが5000件ありますので、その結果は適切ではないところがあるかもしれません。また、この記事の分析では、偏りのある意見（否定的または肯定的）にのみ焦点を当てています。きめ細かい感情分析は、さまざまな程度に、より正確であるべきです。