Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Redditで遊ぼう #TokyoR 106
Search
bob3bob3
June 10, 2023
Technology
0
760
Redditで遊ぼう #TokyoR 106
Redditの Web API をRから操作していろいろなデータを抽出して遊ぶ。
bob3bob3
June 10, 2023
Tweet
Share
More Decks by bob3bob3
See All by bob3bob3
RとLLMで自然言語処理
bob3bob3
3
740
RでPSM分析
bob3bob3
1
340
Rでコンジョイント分析 2024年版
bob3bob3
0
1.9k
『改訂新版前処理大全』の話と Apache Parquet の話 #TokyoR
bob3bob3
0
1.3k
R言語の環境構築と基礎 Tokyo.R 112
bob3bob3
0
620
『データ可視化学入門』をPythonからRに翻訳した話(増強版)
bob3bob3
0
550
『データ可視化学入門』を PythonからRに翻訳した話
bob3bob3
1
620
qeMLパッケージの紹介
bob3bob3
0
2.3k
「国と音楽」 ~spotifyrを用いて~ #muana
bob3bob3
2
610
Other Decks in Technology
See All in Technology
AI-DLCを現場にインストールしてみた:プロトタイプ開発で分かったこと・やめたこと
recruitengineers
PRO
2
120
Lessons from Migrating to OpenSearch: Shard Design, Log Ingestion, and UI Decisions
sansantech
PRO
1
130
ChatGPTで論⽂は読めるのか
spatial_ai_network
9
28k
エンジニアリングをやめたくないので問い続ける
estie
2
1.2k
ログ管理の新たな可能性?CloudWatchの新機能をご紹介
ikumi_ono
1
720
Database イノベーショントークを振り返る/reinvent-2025-database-innovation-talk-recap
emiki
0
170
re:Invent 2025 ふりかえり 生成AI版
takaakikakei
1
210
CARTAのAI CoE が挑む「事業を進化させる AI エンジニアリング」 / carta ai coe evolution business ai engineering
carta_engineering
0
1.4k
生成AIでテスト設計はどこまでできる? 「テスト粒度」を操るテーラリング術
shota_kusaba
0
760
Kiro Autonomous AgentとKiro Powers の紹介 / kiro-autonomous-agent-and-powers
tomoki10
0
480
Power of Kiro : あなたの㌔はパワステ搭載ですか?
r3_yamauchi
PRO
0
140
学習データって増やせばいいんですか?
ftakahashi
2
330
Featured
See All Featured
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3k
KATA
mclloyd
PRO
32
15k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
48
9.8k
How To Stay Up To Date on Web Technology
chriscoyier
791
250k
YesSQL, Process and Tooling at Scale
rocio
174
15k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.1k
Git: the NoSQL Database
bkeepers
PRO
432
66k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.3k
Automating Front-end Workflow
addyosmani
1371
200k
Learning to Love Humans: Emotional Interface Design
aarron
274
41k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
970
How STYLIGHT went responsive
nonsquared
100
6k
Transcript
Redditで遊ぼう Tokyo.R #106 2023/06/10 @bob3bob3
Redditとは Wikipediaによると…… • Reddit(レディット)はアメリカ合衆国の掲示 板型ソーシャルニュースサイト。 • 主に英語圏のユーザーを対象とする。 • ニュース記事、画像のリンクやテキストを投 稿し、コメントをつけることが可能。
• 2021年1月時点の月間利用者数は 4億3000 万人。欧米ではTwitterユーザー数並び利用 時間を超える。
ブッコ抜く! RedditExtractoRパッケージを使うとRedditの公式APIからいろいろなデータが取得でき ます。 自然言語処理やネットワーク分析の勉強など、いろいろ遊べるリアルなデータが手に入 る。 Twitterのデータが取れなくなってガッカリしている方々もぜひ。 主な関数は以下。 • find_subreddits(): キーワードでsubreddit(板)を検索する。
• find_thread_urls(): 特定のsubredditからthread(スレ)のURLを抽出する。 • get_thread_content(): threadの詳細情報を抽出する。 • get_user_content(): ユーザーの詳細情報を抽出する。
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件です。
Rのスレを抽出する find_thread_urls()
各スレの詳細情報を取得する 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")
スレッドの詳細情報
スレのコメント
スコアの高いスレ #scoreの高いスレ threads_top10 <- threads_info |> slice_max(score, n=10) |> select(author,
title, score, url) "マイクロソフトはCRAN Time Machineの保守を終了し ました"
スコアの高いコメント #scoreの高いコメント comments_top10 <- comments_info |> slice_max(score, n=10) |> select(author,
score, comment, url) "人々がつまづくのを見るので、これについての重要な注 意:!!はtidyverseの関数呼び出しで*だけ*動作します。そ れは*全体的なR言語の機能ではありません *。"
ネットワークにしてみる 「誰が立てたスレッドに誰がコメントしたか?」という 視点でネットワークにしてみる。 • 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" ))
ノードのリストを作る ノードのリストを作る • せっかくなので各ノードの次数も 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")
エッジのリストを作る スレ主とコメント主でグループ化し件数をカウント。 後で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 )
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" )
Cytoscapeで描画 見栄えはCytoscapeでいじってます。 赤がスレ主。
Enjoy!