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

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

ただいまの
回答率

90.36%

  • Python

    13380questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 893

Dentaku346

score 7

 前提・実現したいこと

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'

 該当のソースコード

!git clone https://github.com/Jefferson-Henrique/GetOldTweets-python
!pip install lxml pyquery
import os
os.chdir('GetOldTweets-python')
import got3 as got
import json
import itertools
import networkx as nx

G = nx.Graph()

tweetCriteria = got.manager.TweetCriteria().setQuerySearch('#熱中症').setSince("2018-07-10").setUntil(
    "2018-08-30").setMaxTweets(10000)
tweet = got.manager.TweetManager.getTweets(tweetCriteria)
print(tweet)
for v in tweet:
  print(v.text)
  for tag0, tag1 in itertools.combinations(v.entities['hashtags'], 2):
    tag0 = tag0['text']
    tag1 = tag1['text']
    if G.has_edge(tag0, tag1):
      G[tag0][tag1]["weight"] += 1
    else:
      G.add_edge(tag0, tag1, weight=1)

 試したこと

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

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

from tweepy.streaming 
import StreamListener
import json
import networkx as nx

G = nx.Graph()

class MyStreamListener(StreamListener):
  def __init__(self, api, **kw):
    self.api = api
    super(tweepy.StreamListener, self).__init__()
    self.twcnt = 0

  def on_status(self, tweet):
    self.twcnt += 1
    for tag0, tag1 in itertools.combinations(tweet.entities['hashtags'], 2):
      tag0 = tag0['text']
      tag1 = tag1['text']
      if G.has_edge(tag0, tag1):
        G[tag0][tag1]["weight"] += 1
      else:
        G.add_edge(tag0, tag1, weight=1)

    if self.twcnt > 10000:
      return False

  def on_error(self, status):
    return True

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth)
stream = tweepy.Stream(auth, MyStreamListener(api))
stream.filter(track=['#RTした人をフォローする'])


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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

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

import itertools

追記

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

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

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

# txt = re.sub(r"\s+", " ", tweetPQ("p.js-tweet-text").text().replace('# ', '#').replace('@ ', '@'))

txt = tweetPQ("p.js-tweet-text").text()
txt = re.sub(r"#\s?", '#', txt)
txt = re.sub(r"@\s?", '@', txt)
txt = re.sub(r"\s+", ' ', txt)
 実行コード
import got3 as got

tweet_criteria = got.manager.TweetCriteria()    \
    .setQuerySearch('#熱中症')                   \
    .setSince("2018-07-10")                     \
    .setUntil("2018-08-30")                     \
    .setMaxTweets(10)

tweets = got.manager.TweetManager.getTweets(tweet_criteria)

for tweet in tweets:
    hash_tags = [
        tag.lstrip('#') for tag in tweet.hashtags.split()
        if tag != '#'
    ]

    print(hash_tags)

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

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

これの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 23:45 編集

    ご回答ありがとうございました。参考にさせていただきます。
    また別の方法を検討することをお勧めするとのことでしたので、平行して別の方法も模索していきたいと思います。

    最後にまた質問して申し訳ないのですが、GetOldTweetsを改造するというのはどうやって行うのでしょうか…?

    キャンセル

  • 2018/09/01 23:59

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

    キャンセル

  • 2018/09/02 00:07

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

    キャンセル

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

  • ただいまの回答率 90.36%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Python

    13380questions

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