2017年07月16日

インデックス投資とアクティブ投資のTwitter検索結果解析(Python + Tweepy + janome)環境・コード編

前回の結果編に対しての環境・コード内容です。

PythonでTwitterの検索結果の解析をやってみたいなーということで、「イ...



使用するモジュールなど

下記を今回使用しています。
  • Tweepy
  • janome
> pip install janome
> pip install tweepy
また、foregoも用いていますダウンロードしたファイルを実行DIR直下に置いています。詳細情報は下記となります。

ソースコードとforego用環境ファイル

ソースコードは下記となります。
# coding='utf-8'

import os
import sys
import types
import json
import tweepy
import codecs
from requests_oauthlib import OAuth1Session
from janome.tokenizer import Tokenizer

# 環境変数から認証情報を取得する。
CONSUMER_KEY = os.environ['CONSUMER_KEY']
CONSUMER_SECRET = os.environ['CONSUMER_SECRET']
ACCESS_TOKEN = os.environ['ACCESS_TOKEN']
ACCESS_TOKEN_SECRET = os.environ['ACCESS_TOKEN_SECRET']

# 引数
searchWord = sys.argv[1] # 検索WORD
maxPage = int(sys.argv[2]) # maxPage * 100のTweetを取得する
outputNum = int(sys.argv[3]) # 上位outputNum個の単語を出力する
outFileName = sys.argv[4] # Debug用出力ファイル(Tweetを保存)

# 初期化
maxId = 999999999999999999 # 検索結果用ID
maxIdOld = 999999999999999999 # 検索結果用ID
words = {} # 単語とその登場回数を格納
searchPage = 0

# 認証情報を使う
auth = tweepy.OAuthHandler(CONSUMER_KEY,CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN,ACCESS_TOKEN_SECRET)
api = tweepy.API(auth)

# 出力ファイルOpen
outFile = open(outFileName,'w',encoding='utf-8')

# 日本語の解析
# Userの辞書を使用するときは前者を使う
# t = Tokenizer("userdic.csv", udic_type="simpledic", udic_enc="utf8")
t = Tokenizer()

while True:
# maxIdは前のid-1を渡すことに注意
searchTweets = api.search(q=searchWord,count=100,result_type='recent',max_id=maxId-1)
for tweet in searchTweets:
# Debug用にTweetをTextに保存しておく
cmdline = str(tweet.user.screen_name) + str(tweet.text) + str(tweet.created_at) + str(tweet.id) +'\n'
outFile.write(cmdline)

# Tweet内容を解析して単語にばらす
tokens = t.tokenize(tweet.text)
for token in tokens:
if token.part_of_speech.split(',')[0] == u'名詞':
# 名詞の取得
# 初めて出てきた名詞なら1.2度目以降はincrして登場回数を保存
if token.surface in words:
words[token.surface] += 1
else:
words[token.surface] = 1
elif token.part_of_speech.split(',')[0] == u'動詞':
# 動詞の取得
# 動詞は原型で保存する
if token.base_form in words:
words[token.base_form] += 1
else:
words[token.base_form] = 1

# idが今までのより小さければ代入
if(tweet.id < maxIdOld):
maxId = tweet.id
if maxIdOld == maxId:
# Tweetが見つからなければmaxIdOldと変わらないので検索結果をすべて受けとったと判断
break
elif searchPage == maxPage:
# もしくは最大で引数で指定したmaxPagex100までのTweetをチェックする
break
else:
maxIdOld = maxId
searchPage += 1

outFile.close()

# 単語の発生回数で降順に並べて出力する
loopNum = 0
for key,value in sorted(words.items(), key=lambda x: -x[1]):
# 特定の文字列は出力結果から除外
if not key in ['@',':','/',')','(','#','.','_', # 1文字記号
'0','1','2','3','4','5','6','7','8','9', # 1文字数字
'RT','co','https','://','t', # 特定文字列[1Byte]
'の']: # 特定文字列[2Bytes]
# Twitter検索で引っかかった単語(key)と登場回数(value)を出力
print(loopNum+1,key,value)
loopNum += 1
# 指定した分だけ単語を出力したら終了
if(loopNum == outputNum):
break

また環境変数をforego経由で渡すために.envという下記のようなファイルも作成しています。(ちなみに正式なファイルにはちゃんとしたKEYやTOKENを記載しています)

CONSUMER_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
CONSUMER_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ACCESS_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ACCESS_TOKEN_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

それにしてもPythonはモジュールをpipでインストールして少しコードを書けば色々なことができるんですね。

スポンサーリンク
posted by くまなべ at 21:02 | Comment(0) | TrackBack(0) | Python
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/180343670
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック