Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Redditで遊ぼう #TokyoR 106

Redditで遊ぼう #TokyoR 106

Redditの Web API をRから操作していろいろなデータを抽出して遊ぶ。

bob3bob3

June 10, 2023
Tweet

More Decks by bob3bob3

Other Decks in Technology

Transcript

  1. Redditで遊ぼう
    Tokyo.R #106
    2023/06/10
    @bob3bob3

    View Slide

  2. Redditとは
    Wikipediaによると……
    ● Reddit(レディット)はアメリカ合衆国の掲示
    板型ソーシャルニュースサイト。
    ● 主に英語圏のユーザーを対象とする。
    ● ニュース記事、画像のリンクやテキストを投
    稿し、コメントをつけることが可能。
    ● 2021年1月時点の月間利用者数は 4億3000
    万人。欧米ではTwitterユーザー数並び利用
    時間を超える。

    View Slide

  3. ブッコ抜く!
    RedditExtractoRパッケージを使うとRedditの公式APIからいろいろなデータが取得でき
    ます。
    自然言語処理やネットワーク分析の勉強など、いろいろ遊べるリアルなデータが手に入
    る。
    Twitterのデータが取れなくなってガッカリしている方々もぜひ。
    主な関数は以下。
    ● find_subreddits(): キーワードでsubreddit(板)を検索する。
    ● find_thread_urls(): 特定のsubredditからthread(スレ)のURLを抽出する。
    ● get_thread_content(): threadの詳細情報を抽出する。
    ● get_user_content(): ユーザーの詳細情報を抽出する。

    View Slide

  4. Rのスレを抽出する find_thread_urls()
    library(conflicted)
    library(tidyverse)
    library(RedditExtractoR)
    thread_URLs <- find_thread_urls(
    sort_by = "top",
    subreddit = "rstats",
    period = "month"
    ) |>
    drop_na() |>
    as_tibble()
    RのsubredditのURLは
    https://www.reddit.com/r/rstats/ 。
    ● find_thread_urls()を使って指定した板
    (subreddit)から各スレのURLを抽出します。
    ● URLの赤文字の部分でsubredditを指定す
    る。
    ● ソート方法はhot、new、top、rising。
    ● periodは期間の指定でhour、day、week、
    month、year、all。
    ● キーワードの設定もできます。
    ● なぜか空行が1行入るので最後にdrop_na()
    する。
    ● 最後は個人的な好みで tibbleにしてます。
    ● 取得の上限は1,000件です。

    View Slide

  5. Rのスレを抽出する find_thread_urls()

    View Slide

  6. 各スレの詳細情報を取得する get_thread_contets()
    先ほど取得したスレッドのリストの URLの情報を
    使って、各スレの詳細情報を取得する。
    1件あたり2秒ぐらいかかるので 100件ぐらいだと3
    分ちょっとかかる。
    取得した情報にはスレそのものの詳細情報と、ス
    レについたコメントの情報が含まれるのでそれぞ
    れを取り出しておく。
    thread_contents <- thread_URLs |>
    pull(url) |>
    get_thread_content()
    # 各スレの詳細情報
    threads_info <- thread_contents |>
    pluck("threads")
    # 各スレについたコメントの情報
    comments_info <- thread_contents |>
    pluck("comments")

    View Slide

  7. スレッドの詳細情報

    View Slide

  8. スレのコメント

    View Slide

  9. スコアの高いスレ
    #scoreの高いスレ
    threads_top10 <- threads_info |>
    slice_max(score, n=10) |>
    select(author, title, score, url)
    "マイクロソフトはCRAN Time Machineの保守を終了し
    ました"

    View Slide

  10. スコアの高いコメント
    #scoreの高いコメント
    comments_top10 <- comments_info |>
    slice_max(score, n=10) |>
    select(author, score, comment, url)
    "人々がつまづくのを見るので、これについての重要な注
    意:!!はtidyverseの関数呼び出しで*だけ*動作します。そ
    れは*全体的なR言語の機能ではありません *。"

    View Slide

  11. ネットワークにしてみる
    「誰が立てたスレッドに誰がコメントしたか?」という
    視点でネットワークにしてみる。
    ● URLをキーにスレの情報とコメントの情報を
    join。
    ● 削除されたアカウントは取り除く
    ● スレを立てた場合とコメントした場合でノード
    を分けたいので、スレを立てた場合はアカウ
    ント名の後に「_poster」を付ける。
    edges_raw <- threads_info |>
    select(url, author) |>
    left_join(
    comments_info |> select(url, author),
    by = "url",
    suffix = c(".thread", ".comment"),
    ) |>
    select(!url) |>
    drop_na() |>
    dplyr::filter(
    author.thread != "[deleted]"
    | author.comment != "[deleted]"
    ) |>
    mutate(
    author.thread = paste0(
    author.thread, "_poster"
    ))

    View Slide

  12. ノードのリストを作る
    ノードのリストを作る
    ● せっかくなので各ノードの次数も igraphで計
    算しておく。
    # ノードごとの次数を計算
    library(igraph)
    dgr <- edges_raw |>
    graph_from_data_frame() |>
    degree()
    # ノードのリストを作る
    nodes <- edges_raw |>
    select(author.thread) |>
    distinct() |>
    mutate(type = "poster") |>
    rename(id = author.thread) |>
    bind_rows(
    bi_graph |>
    select(author.comment) |>
    distinct() |>
    mutate(type = "commenter") |>
    rename(id = author.comment)
    ) |>
    left_join(
    tibble(
    id = dgr |> names(),
    dgr = dgr
    ),
    by = "id")

    View Slide

  13. エッジのリストを作る
    スレ主とコメント主でグループ化し件数をカウント。
    後でCytoscapeに読み込ませたいので、列名をス
    レ主はtarget、コメント主はsourceに変更。
    # あとでCytoscapeに読ませる関係で
    # 列名をsourceとtargetに変更
    edges <- edges_raw |>
    summarise(
    freq = n(),
    .by = c(author.thread, author.comment)
    ) |>
    rename(
    source = author.comment,
    target = author.thread
    )

    View Slide

  14. Cytoscapeで描画
    ネットワーク図の描画は Cytoscapeが圧倒的に優
    れている。
    ● Rcy3パッケージでRからCytoscapeを操作で
    きる。Rcy3はCRANではなくBioconductorか
    らインストールする。
    ● 事前にCytoscapeをインストールし、
    Cytoscape内でCyRESTをインストールして
    おく。
    ● また、createNetworkFromDataFrames()を
    実行する前にCytoscapeを立ち上げておく。
    # install.packages("BiocManager")
    # BiocManager::install("RCy3")
    library(RCy3)
    createNetworkFromDataFrames(
    nodes,
    edges,
    title="rstats network",
    collection="Reddit Network"
    )

    View Slide

  15. Cytoscapeで描画
    見栄えはCytoscapeでいじってます。
    赤がスレ主。

    View Slide

  16. Enjoy!

    View Slide