2022年9月26日月曜日

Twitter Streaming APIのfilterは日本語に対応していない

Twitter Streaming APIではリアルタイムにツイートを取得できる。sampleとfilterの2種類の機能があるが、filterではキーワードを指定することで、このキーワードを含むツイートを取得することができる。と思っていたのだが、実際にfilterを使ってツイートを収集してみると、期待通りのツイートが取得できていない。

実際にキーワードを指定して収集してみる。以下コードはTwitter Streaming APIで省略されていないツイートテキストを取得するのコードを変更して、filterでキーワード「スイーツ」を指定したもの。これにより、「スイーツ」を含むツイートが取得できることを期待している。

import tweepy

# Twitter APIの認証情報
# Twitterの開発者向けのページで取得したキーとトークンを使う
CONSUMER_KEY = 'Consumer Key'
CONSUMER_SECRET = 'Consumer Secret'
ACCESS_TOKEN = 'Access Token'
ACCESS_TOKEN_SECRET = 'Access Token Secret'

class TwStream(tweepy.Stream):
    def _get_text(self, status):
        # 拡張ツイートの場合
        if hasattr(status, 'extended_tweet'):
            return status.extended_tweet['full_text']
        else:
            return status.text

    def on_status(self, status):
        # status(APIで取得できるデータ)を受け取ったときにon_statusが実行される
        print('-------------------------')
        # リツイートの場合は「RT」+ メンション分だけ文字数オーバーするので省略されることがある
        if hasattr(status, 'retweeted_status'):
            text = self._get_text(status.retweeted_status)
        else:
            text = self._get_text(status)
        # スクリーンネームとツイートを表示
        print(f'@{status.author.screen_name} {text}')

def main():
    twstream = TwStream(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET)

    # キーワード「スイーツ」を指定してツイートを取得
    twstream.filter(track=['スイーツ'], languages=['ja'])

if __name__ == '__main__':
    main()

実際に取得できたツイートすべてに「スイーツ」が含まれるが、よくよくみるとハッシュタグ「#スイーツ」や「スイーツ」のあとに空白があるツイートのみしか取得できていない。Twitterで「スイーツ」で検索した結果と比べてみても、それが確認できる。

Twitter APIの仕様を確認すると、Standard streaming API request parametersには以下の一文がある。

Non-space separated languages, such as CJK are currently unsupported.

つまり、filterでは日本語などの単語がスペースで区切られていない言語は未サポートということ。キーワードとして「スイーツ」を指定した場合、スイーツの直後にスペースがあるハッシュタグは取得できるが、ツイートテキスト内に「スイーツ」があっても取得対象にならない。過去のツイートを取得できるSearch APIでは、キーワード「スイーツ」を指定して「スイーツ」を含むツイートを取得できるが、Streaming APIでは同様のことはできないようだ。

Stream APIのfilterで日本語を使う場合は、特定のハッシュタグを含むツイートを取得する場合など、限定的な使い方になりそう。


0 件のコメント:

コメントを投稿