【BERTopicアプリ01/3】カタールワールドカップのTwitterデータを分析

写真提供: Unsplash レット ・ルイス

1. 説明

        カタールワールドカップは驚きがいっぱい!アルゼンチンを破って世界に衝撃を与えたサウジアラビアから、モロッコの歴史的な準決勝まで、サッカーの熱狂の瞬間を聞いたり目撃したりする必要があります。この投稿では、BERTopic を使用して、2022 年ワールドカップ中に投稿されたツイートを分析します。ワールドカップに関連して最も人気のあるトピックは何か、そしてそれらを理解できるかどうかを見てみましょう。

2. データの準備

        、ソーシャルメディアからデータを取得する必要があります。今回はTwitterから取得したテキストデータを研究対象とします。ツイートをスクレイピングするには、Facebook、Twitter、Reddit などのソーシャル ネットワーキング サービス用のスクレイパーであるsnscrapeを使用します開発バージョンをインストールするには:

pip install git+https://github.com/JustAnotherArchivist/snscrape.git

        このクローラーを使用すると、Twitter ユーザー、ユーザー プロフィール、ハッシュタグ、検索 (ライブ ツイート、トレンド ツイート、ユーザー)、ツイート (単一スレッドまたは周囲のスレッド)、リスト投稿、コミュニティ、トレンドから属性を取得できます。スニッフィングを開始するには:

# Get tweets using SNSCRAPE 
import snscrape.modules.twitter as sntwitter
import pandas as pd

        次に、検索語「ワールドカップ、2022 年 18 月 20 日から 2022 年 12 月まで」を含む英語で書かれたツイートをいくつか取得してみましょう。注: 返信ではなくツイートのみが必要であるため、返信をフィルターで除外します。ここでは、時間枠についてさらに注意する必要があります。期間は次のように設定する必要があります: まで: 19–00–00_00:2022:11_AST から: 20–00–00_00:2022:12_AST。until 句の時刻は除外されるため、19-0-<> <> 時に設定する必要があります。ASTはアラビア標準時の略です。AST で時間を指定しない場合、時間は自動的に UTC に設定されます。

# Get 10,000 tweets containing search term: world cup within a certain period of time
query = "(world cup) lang:en until:2022-12-19_00:00:00_AST since:2022-11-20_00:00:00_AST -filter:replies"
tweets = []
limit = 10000


for tweet in sntwitter.TwitterSearchScraper(query).get_items():
    if len(tweets) == limit:
        break
    else:
        tweets.append([tweet.date, tweet.id, tweet.username, tweet.content])

# Store tweets under a data frame        
df = pd.DataFrame(tweets, columns=['Date', 'Id', 'User', 'Tweet'])

3. データの前処理

        非構造化テキスト データを扱う場合、分析を実行する前に行う必要があることの 1 つは、データの前処理です。ここでは、ツイート内の URL、絵文字、改行をすべて削除します。データ クリーニングの各ラウンドの後にいくつかのサンプルを印刷して、テキストが希望どおりに操作されているかどうかを確認することをお勧めします。また、すべてのデータのクリーニングが完了したら、pickle を使用して最終バージョンを保存することをお勧めします。データセットを使用して別のタスクを実行する必要がある場合は、再び最初からスクレイピングするのではなく、ピクル化されたデータを単にロードするだけで済みます。

# Round1: Remove URL
df['Tweet']=df['Tweet'].str.replace('http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', ' ')
# df.head()

# Round2: Remove emoji
df['Tweet']=df['Tweet'].str.replace('[^\w\s#@/:%.,_-]', '', flags=re.UNICODE)
# df.head()

# Round3: Remove newlines:\n
df['Tweet_processed'] = df['Tweet'].replace('\n','', regex=True)
# df.head()

# Store the filtered tweets in a new data frame
df_new=df.drop('Tweet',axis=1)
# df_new.head()

df_new.to_pickle('world_cup_tweets.pkl')

4. BERTopic を使用する

BERTopic は、トランスフォーマーとカスタム クラスベースの TF-IDF を利用して高密度のクラスターを作成するトピック モデリング手法で、トピックの説明内の重要な単語を保持しながら、トピックを理解しやすくします。BERTopic をインストールするには:

pip install bertopic

        次に、ツイートをリストに保存し、次のコードを使用して BERTopic をインスタンス化します。スクレイピングしているツイートの数と、CPU (低速) または GPU (高速) のどちらを使用しているかによって、このプロセスに時間がかかる場合があるため、しばらくお待ちください。

texts=df_new['Tweet_processed']

# Set the language to English. There is other language models as well. 
from bertopic import BERTopic
topic_model = BERTopic(language="english", calculate_probabilities=True, verbose=True)
topics, probs = topic_model.fit_transform(texts)

5. テーマの抽出

        モデルをフィッティングすると、いくつかの結果が表示されます。まず、最も一般的な 10 個のテーマを調べます。

freq = topic_model.get_topic_info(); freq.head(11)
トップ 10 のテーマ

-1 は、すべての外れ値を無視する必要があることを意味します。次に、生成された共通のテーマを見てみましょう。

topic_model.get_topic(0)  # Select the most frequent topic, which is topic 0
# Result 
[('qatar', 0.03543929861004061),
 ('hosting', 0.01386799885558573),
 ('best', 0.012979749598061752),
 ('qatar2022', 0.011693988492318397),
 ('thank', 0.01145218957158738),
 ('ever', 0.011044699651033682),
 ('tournament', 0.008304478567760317),
 ('hosted', 0.007997848070012806),
 ('you', 0.007665018845225487),
 ('the', 0.007350426929036396)]

        ご覧のとおり、このトピックはサッカーファンが開催国カタールに感謝の意を表していることを指しています。カタールワールドカップは最初から最後まで物議を醸したが、最終的にファンは開催国側の大会への努力を高く評価した。トピック 0 の 3 つの代表的なツイートも確認できます。

topic_model.get_representative_docs(0)
# Result
['Critics sceptical of Qatars carbon neutrality claim at #WorldCup  ',
 'Apart from Messi being the highlight of the WC, this tournament has been a huge success for Qatar itself. From the stunning venues to the welcoming and hospitable atmosphere, the tournament has truly shone, making this World Cup truly one to remember. Congratulations Qatar  ',
 'With the World Cup over, that means no more Tracey Holmes doing Qatar propaganda']

6. 上位 10 個のトピックを視覚化する

        以下を使用すると、最も一般的な 10 個のテーマをより明確に把握できます。

topic_model.visualize_barchart(top_n_topics=10)
ビジュアライゼーションのトップ 10 トピック

7. データのロード

        パート 1 のチュートリアルでは、「world_cup_tweets.pkl」という名前でデータを保存しました。これで、次を使用して unpickle にすることができます。

import pandas as pd
import pickle
with open('world_cup_tweets.pkl', 'rb') as f:
    data = pickle.load(f)

8. 動的なトピックモデリング

「動的トピック モデリング (DTM) は、時間の経過に伴うトピックの変化を分析するために設計された一連の手法です。これらの手法を使用すると、時間の経過とともにトピックがどのように表現されているかを理解できます。」

        さまざまな期間を表すために、ツイートとそれに対応する投稿時間のリストを作成できます。次に、パート 1 で行ったのと同じように、BERTopic モデルを作成してトレーニングする必要があります。

timestamps = data.Date.to_list()
tweets = data.Tweet_processed.to_list()

from bertopic import BERTopic
topic_model = BERTopic(language="english", calculate_probabilities=True, verbose=True)
topics, probs = topic_model.fit_transform(tweets)

        ここで、topics_over_time を呼び出して、ツイートとタイムスタンプを渡す必要があります。ビンは、チャート内の値をグループ化するために使用される連続値の単一範囲を表すことに注意してください。ビンの幅が大きすぎると十分な区別ができなくなり、小さすぎるとデータを適切にグループ化できなくなります。ここではビンの数を 20 に設定します。上位 10 個のトピックを視覚化します。

topics_over_time = topic_model.topics_over_time(tweets, timestamps, nr_bins=20)
topic_model.visualize_topics_over_time(topics_over_time, top_n_topics=10)

9. 結果:

長期にわたるトップ 10 トピック

        このグラフから、時間の経過とともにさまざまなテーマがどのように出現するかを簡単に把握できます。すごく便利じゃないですか!

10. まとめ

        この投稿では、snscrape を使用してツイートをスクレイピングする方法と、BERTopic を使用してカタール ワールド カップのケーススタディからトピックをモデル化する方法を学びました。結果は、ファンが一般にカタールの努力を認め、アルゼンチンとフランスのスリリングな決勝戦に驚いていることを示した。

        BERTopic には、Dynamic Topic Modeling (DTM) などのさらに素晴らしい機能があります。その方法については後ほど説明します。今のところさようなら、乞うご期待!

おすすめ

転載: blog.csdn.net/gongdiwudu/article/details/132287094