質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

3459閲覧

Twitterハッシュタグ収集についてのプログラム

Dentaku346

総合スコア9

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/09/01 13:11

編集2018/09/01 13:57

前提・実現したいこと

Colabratory上でpython3を使い、Twitterのハッシュタグについての収集を行っており、またツイートに含まれるハッシュタグの組み合わせを抜き出して重複度を求めるような収集をしています。
当初はTweepyを用いて収集を行っていたのですが、TwitterAPIを用いた方法では1週間以上の過去のツイートに遡って収集が行えないのでGetOldTweetsというパッケージを使用しツイートの収集を行うことにしました。
しかし、Tweepyを用いて作っているプログラムをGetOldTweetsを利用したプログラムに変えて実行したところ以下のエラーメッセージが発生しました。

追記:回答いただいたものを実行した結果、再びエラーが生じてしまったので当該エラーに変更しました。また、該当ソースコードも変更いたしました。

発生している問題・エラーメッセージ

AttributeError Traceback (most recent call last) <ipython-input-35-d2284eea22e6> in <module>() 15 for v in tweet: 16 print(v.text) ---> 17 for tag0, tag1 in itertools.combinations(v.entities['hashtags'], 2): 18 tag0 = tag0['text'] 19 tag1 = tag1['text'] AttributeError: 'Tweet' object has no attribute 'entities'

該当のソースコード

python3

1!git clone https://github.com/Jefferson-Henrique/GetOldTweets-python 2!pip install lxml pyquery 3import os 4os.chdir('GetOldTweets-python') 5import got3 as got 6import json 7import itertools 8import networkx as nx 9 10G = nx.Graph() 11 12tweetCriteria = got.manager.TweetCriteria().setQuerySearch('#熱中症').setSince("2018-07-10").setUntil( 13 "2018-08-30").setMaxTweets(10000) 14tweet = got.manager.TweetManager.getTweets(tweetCriteria) 15print(tweet) 16for v in tweet: 17 print(v.text) 18 for tag0, tag1 in itertools.combinations(v.entities['hashtags'], 2): 19 tag0 = tag0['text'] 20 tag1 = tag1['text'] 21 if G.has_edge(tag0, tag1): 22 G[tag0][tag1]["weight"] += 1 23 else: 24 G.add_edge(tag0, tag1, weight=1)

試したこと

Tweepyを利用して作っているプログラムをGetOldTweetsで置き換えて利用できるであろうと目星をつけて実行したこと。
ただどうプログラムを組めばいいか目星になるものがなく、方法を試すにも何をすればいいかわからなくなってしまっています。

補足情報(FW/ツールのバージョンなど)

python3

1from tweepy.streaming 2import StreamListener 3import json 4import networkx as nx 5 6G = nx.Graph() 7 8class MyStreamListener(StreamListener): 9 def __init__(self, api, **kw): 10 self.api = api 11 super(tweepy.StreamListener, self).__init__() 12 self.twcnt = 0 13 14 def on_status(self, tweet): 15 self.twcnt += 1 16 for tag0, tag1 in itertools.combinations(tweet.entities['hashtags'], 2): 17 tag0 = tag0['text'] 18 tag1 = tag1['text'] 19 if G.has_edge(tag0, tag1): 20 G[tag0][tag1]["weight"] += 1 21 else: 22 G.add_edge(tag0, tag1, weight=1) 23 24 if self.twcnt > 10000: 25 return False 26 27 def on_error(self, status): 28 return True 29 30auth = tweepy.OAuthHandler(consumer_key, consumer_secret) 31auth.set_access_token(access_token, access_token_secret) 32api = tweepy.API(auth) 33stream = tweepy.Stream(auth, MyStreamListener(api)) 34stream.filter(track=['#RTした人をフォローする'])

上記のプログラムを用いてリアルタイムで収集していた時の結果の一部が下記の画像です。
イメージ説明

GetOldTweetsを利用して上記の画像のように抜き出していきたいと考えています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

GetOldTweetsは疎かTweepyすらまともに使ったことは無いのですが、分かる点だけ。
とりあえず現状のエラーはitertoolsをインポートすれば解消します。

Python

1import itertools

追記

乗り掛かった舟なので、ちょっと手元で試してみました。
次の手段でハッシュタグを取得できます。

手元の環境
  • Microsoft Windows [Version 10.0.17134.228]
  • Python 3.6.6 :: Anaconda, Inc.
GetOldTweetsを改造

Twitterの仕様が変わったのか分かりませんが、現状まともにハッシュタグを取得できていません。
次のようにgot3.manager.TweetManager.pyの39行目のコードを置き換えます。

Python

1# txt = re.sub(r"\s+", " ", tweetPQ("p.js-tweet-text").text().replace('# ', '#').replace('@ ', '@')) 2 3txt = tweetPQ("p.js-tweet-text").text() 4txt = re.sub(r"#\s?", '#', txt) 5txt = re.sub(r"@\s?", '@', txt) 6txt = re.sub(r"\s+", ' ', txt)
実行コード

Python

1import got3 as got 2 3tweet_criteria = got.manager.TweetCriteria() \ 4 .setQuerySearch('#熱中症') \ 5 .setSince("2018-07-10") \ 6 .setUntil("2018-08-30") \ 7 .setMaxTweets(10) 8 9tweets = got.manager.TweetManager.getTweets(tweet_criteria) 10 11for tweet in tweets: 12 hash_tags = [ 13 tag.lstrip('#') for tag in tweet.hashtags.split() 14 if tag != '#' 15 ] 16 17 print(hash_tags)

上記のコードを実行したところ、次の結果が得られました。

plain

1['熱中症', '熱中症対策', '暑い', 'ブログ更新http'] 2['介護', '熱中症'] 3['関東', '天気', '熱中症'] 4['熱中症'] 5['熱中症'] 6['めまい', '嘔吐', '熱中症', '痙攣', '筋肉痛'] 7['熱中症'] 8['牛丼', '吉野家', '冷凍', '送料無料', '楽天', '夏', '暑い', '熱中症'] 9['熱中症注意', '熱中症予防', '熱中症対策', '猛暑', '熱中症'] 10['薬', '薬剤師', '熱中症', '調剤薬局', '脱水', '経口補水液', '脱水症状']

これのcombinationを取れば、上手くいくはず。

ただし

GetOldTweetsは、Python3.x向けにはろくにメンテナンスされていないようです。
(エラーの内容を見るに、2系でも正常に動くか疑問です。)

This package assumes using Python 2.x. The Python3 "got3" folder is maintained as experimental and is not officially supported.

引用元: GetOldTweets-python/README.md 太字は引用者

代替策が特に提示できなく申し訳ないのですが、別の方法を検討されることをお勧めします。

投稿2018/09/01 13:18

編集2018/09/01 14:40
LouiS0616

総合スコア35658

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Dentaku346

2018/09/01 13:47

回答ありがとうございます。import itertoolsをした結果、また違ったエラーが発生してしまいました‥‥。
LouiS0616

2018/09/01 13:51

質問本文を編集し、当該エラーを追記しておいてください。
Dentaku346

2018/09/01 13:58

申し訳ありません、言葉足らずでした。編集を行い追記いたしました。
Dentaku346

2018/09/01 14:55 編集

ご回答ありがとうございました。参考にさせていただきます。 また別の方法を検討することをお勧めするとのことでしたので、平行して別の方法も模索していきたいと思います。 最後にまた質問して申し訳ないのですが、GetOldTweetsを改造するというのはどうやって行うのでしょうか…?
LouiS0616

2018/09/01 14:59

日頃利用していないので断言できないのですが、Colabratory上だけだとできないかもしれません。 PCに落として編集したのち再アップロードするか、リポジトリをフォークして改造するか... どちらにせよ面倒になりそうです。
Dentaku346

2018/09/01 15:07

そうですか・・・・。ご返答ありがとうございました。 もう少しやってみてダメそうでしたら別の方法試していきたいと思います…。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問