さいとー・ま

さいとー・ま

さいとう・まの。おしごとは manoestasmanoあっとgmail.com (あっとを いれかえてください)まで。

テキストマイニングへの道01

テキストマイニングができるようになるまでの努力の成果を残したい。
詳しいわけではないので、記述は信用しないこと。しかし、間違っていたら教えてください。

2022/9/9
テキストマイニングをしたいと思った。ツイッターの文章を調べたい。
2022/9/10
テキストマイニングを行っている論文を知人から入手。そこにはやり方が結構細かく書いてあった。
2022/9/11

パイソン

プログラミングに慣れておくといいと書いてあったので、その忠告に従い、Python(パイソン)を使うことに決定。
Python(パイソン)というのはプログラミング言語の一つ。これのルールにそって仕様書を書いて送ると、いろいろしてくれる。Python(パイソン)を選んだ理由は、論文で勧められていたから。機械学習とかに強いとかも聞いたことがあったことも理由の一つかもしれない。
まず、プログラミング言語を使うには、「環境」を構築して、それを使えるような準備をする必要があるそうだ。しかし、Python(パイソン)を使うのに、パソコンにいろいろダウンロードする必要はなかった。天下のGoogle先生Google Colaboratoryというブラウザ(つまり、ネットとかを見るやつ)で、プログラミングを動かすことができる。
Google Colaboratoryは、https://colab.research.google.com/でアクセスできる(ちなみに、自分はhttps://www.python.jp/train/experience/colab.htmlというサイトを見たが、見なくてもできる可能性は高い)。

ツイッターAPI

次に、ツイッターの文章をダウンロードするために、APIを獲得する。APIとは、アプリケーション・プログラミング・インターフェイスの略。ツイッターというアプリケーションを、Python(パイソン)というプログラミングで扱うための仲介役ということ。これを所得しないと、ツイッターの情報を取ることができないらしい。ここでも一連の作業は解説するが、https://di-acc2.com/system/rpa/9688/を参照した。

申請

まず、ツイッターデベロッパーのサイト(?)(https://developer.twitter.com/en/portal/projects-and-apps)にアクセスする(もともと持っていたツイッターアカウントで入った。もし持っていなかったらツイッターアカウント自体を作る必要がある。その時、電話番号も登録しておくと、後の申請がスムーズになる。しかし、困ったときに電話番号を登録すればいいので、別に登録しなくてもよし。)。
英語と戦って、必要事項を埋める(国はJapanを選び、使用目的はたしかツイッターのデータの分析みたいな選択肢を選び、政府にデータを渡すかどうかはNoを選んだ。それぞれの選択肢を変えたら申請がどう変わるかはよくわからない)。そして、一番下のLet do thisを押す。
規約を読んだにチェックなどを入れて進めていく。
アプリの名前をなんでもいいからテキトーな名前をいれてすすめる→次の手順でそれを選ぶことになる。
すると、
Bearer Token
APIキー
APIシークレットキー
という三つの情報がでてくる。これをメモ帳などにコピペする。今後APIキーとAPIシークレットキーは何回も使う(申請で時間がかかる人もいるらしいが、自分は一瞬だった)。

しなくてもいいかも?

本当はユーザー認証設定(User Authentication Settings)をするために、

左部Project & Appsを開き、先ほど命名した「アプリ名」を選択
中央下部「User Authentication settings」のSetup(またはEdit)をクリック
https://di-acc2.com/system/rpa/9688/

をするらしいが、やっていないので、パス。

アクセストークンの発行

さっきいれたアプリの名前をデベロッパーのサイト(?)(https://developer.twitter.com/en/portal/projects-and-apps)の左段からクリックする。または、左段のProjectのAppsの鍵のマーク(🔑)を選ぶ。
Access Token&Secretの段のGenerateを押す。すると、アクセストークンと、アクセストークンシークレットが手に入る。これをさっきのメモ帳にもコピペ。

(2022/9/17追記)APIをV1.1でも使えるようにする

tweepyの昔からの道具を使うのに、APIをV1.1という昔のヴァージョンでも使えるようにする必要がある。2022年9月17日現在では、V2という最新ヴァージョンでは使える道具が最新のものだけで、昔のコマンドが使えない。V2ではtweepy.Cursorというものを使う必要があるらしいが、以下では使っていないので、V1.1のAPIを使えるようにする必要がある。そのためにAPIをEssentialからElevated(高度なアクセス)に変える必要がある。
くわしくはhttps://zero-cheese.com/8436/を参考にした。
ちなみに、この作業のためにツイッターに電話番号を登録する必要がある。
Elevatedに変える方法は、https://tensei-shinai.com/2022/04/27/twitter-api-elevated/を参考にした。申請内容を英語で書く必要がある。データを分析したいということを書いた。最低限の文字数を書かなくてはいけないが、そこまで多くないので入力すること。

左メニューのProductsの「Twitter API v2」を開き、「Elevated」タブをクリックします。
「Apply for Elevated」をクリックします。
https://tensei-shinai.com/2022/04/27/twitter-api-elevated/

この作業から英語の指示通りに進める必要がある。

パイソンでツイッター認証

以上の手順で、APIキー、APIシークレットキー、アクセストークン、アクセストークンシークレットが手に入った。
続いて、Python(パイソン)でツイッターの情報を操る時に必要になる、ツイッター認証のコード(つまり仕様書みたいなもの)を作る。
自分は以下のコードを使っている(メモ帳に保存してある)が、色んなサイトのものがまざったものなので、あまりおすすめはしない(プログラミング初心者へ。#以下はいわゆるメモで、コードではない。引用符は一重でも二重でもオッケーで、囲ったものを文字列として認識してくれる。「何々=ほにゃらら」とすると、後に「何々」と書いたところにはその情報を入れてくれる。たとえば、consumer_keyは、auth = tweepy.OAuthHandler(consumer_key, consumer_secret)にもあるので、=のあとのAPIキーの情報をそこに代入してくれるということ。)
ただし、'APIキー'、 'APIシークレットキー'、'アクセストークン'、'アクセストークンシークレット'の中身は自分の取得したものを記入している。流用する場合は、自分で取得したものをここにコピペすること。

import tweepy #tweepyを準備する。
consumer_key = 'APIキー'
consumer_secret = 'APIシークレットキー'
access_token = 'アクセストークン'
access_token_secret = 'アクセストークンシークレット'
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth)

こういう認証は何回も使うので、どこかに保存しておくといい。

正直ここは、いろんな書き方があるようである。たとえば、https://web-lh.fromation.co.jp/archives/10000051001(最終的にこのサイトを参考にしたら動いた)では、

import tweepy
CK="コンシューマキーを入力"
CS="コンシューマシークレットを入力"
AT="アクセストークンを入力"
AS="アクセスシークレットを入力"
auth = tweepy.OAuthHandler(CK, CS)
auth.set_access_token(AT, AS)
api = tweepy.API(auth)

と書いている。

また、https://heybro21.com/tweepy/(自分はこれでは動かなかった)によれば、

import tweepy
def get_api():
API_KEY = 'APIキー(Consumerキー)'
API_KEY_SECRET = 'APIシークレットキー(Consumerシークレットキー)'
BEARER_TOKEN = 'Bearerトークン'
ACCESS_TOKEN = 'アクセストークン'
ACCESS_TOKEN_SECRET = 'アクセスシークレットトークン'
auth = tweepy.OAuthHandler(API_KEY, API_KEY_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
api = tweepy.API(auth)
return api

と最初に書いて、後に

api = get_api()
tweet_data = search(api)

とかくことでもできるらしい。しかし、自分はこのタイプの仕方を使っていないので、よく分からない。

テストのためのタイムライン取得

ツイッター認証が働いているか確認するために、まずタイムラインの取得ができるかを確認した。

public_tweets = api.home_timeline()
for tweet in public_tweets:
print(tweet.text)

という部分を足して、

import tweepy
import csv
def get_api():
api_key = "APIキー"
api_secret = "APIキーシークレット"
access_key = "アクセストークン"
access_secret = "アクセストークンシークレット"
auth = tweepy.OAuthHandler(api_key, api_secret)
auth.set_access_token(access_key, access_secret)
api = tweepy.API(auth)
return api

public_tweets = api.home_timeline()
for tweet in public_tweets:
print(tweet.text)

というものを動かした。これをグーグルコラボのコードを新しく作って打ち込んだ。数秒後、タイムラインが並んで表示された。

2022/9/12~2022/9/15

検索

ツイートの検索がうまくできなかった。試行錯誤してたどりついたサイトがhttps://web-lh.fromation.co.jp/archives/10000051001というサイトであった(2022/9/16現在)*1。どうやら、tweepyというプログラミングの道具が更新されて、道具が変わったりしていたみたいだ。結局、api.search()というコマンド(?)を使っている。どうやら、普通のAPIでは一週間しかさかのぼれないらしい。アカデミックのAPIを取得できればもっとさかのぼれるらしい。
ともかく、最終的に使っている検索は次のような形になった。

import tweepy
import csv
consumer_key = 'APIキー'
consumer_secret = 'APIキーシークレット'
access_token = 'アクセストークン'
access_token_secret = 'アクセストークンシークレット'


auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)

api = tweepy.API(auth)
for status in api.search(q='検索したい単語 exclude:retweets',tweet_mode='extended',result_type="mixed", count=100,):
print(status.full_text)
print("é")
print(status.created_at)
print("é")
print(status.user.screen_name)
print("é")

これをすると、

ツイート本文
é
投稿日時
é
ツイッターのID
é

というのがたくさん並んででてくる。éを使っているのは、単に区切りをはっきりさせるために、日本語では基本的に使用されない文字をいれただけ。要らない人は、「 print("é")」を三つ削除すること。

2022/9/16
KH Coderを使おうとし始める。

*1:自分ではそのまま使うことができなかったサイトを記録しておく。そのまま使えなかった理由はわからず、単に自分が打ち間違いをしたりした可能性もある。いろいろと勉強になったので載せておく。 https://python-man.club/python_twitter_textmining/ https://qiita.com/soma_sekimoto/items/6b9f32552f4ab50be452 https://toxublog.com/blog/get_tweet_tweepy/ https://note.com/note_stb/n/nee426a75f207 https://di-acc2.com/system/rpa/9690/ https://qiita.com/FukuharaYohei/items/d6491e0ddbdcfd081f8e https://heybro21.com/tweepy/