Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Redditで遊ぼう #TokyoR 106
Search
bob3bob3
June 10, 2023
Technology
0
740
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
580
RでPSM分析
bob3bob3
1
290
Rでコンジョイント分析 2024年版
bob3bob3
0
1.4k
『改訂新版前処理大全』の話と Apache Parquet の話 #TokyoR
bob3bob3
0
1.1k
R言語の環境構築と基礎 Tokyo.R 112
bob3bob3
0
580
『データ可視化学入門』をPythonからRに翻訳した話(増強版)
bob3bob3
0
510
『データ可視化学入門』を PythonからRに翻訳した話
bob3bob3
1
590
qeMLパッケージの紹介
bob3bob3
0
2.1k
「国と音楽」 ~spotifyrを用いて~ #muana
bob3bob3
2
580
Other Decks in Technology
See All in Technology
P2P ではじめる WebRTC のつまづきどころ
tnoho
1
210
Semantic Machine Intelligence for Vision, Language, and Actions
keio_smilab
PRO
2
390
BEYOND THE RAG🚀 ~とりあえずRAG?を超えていけ! 本当に使えるAIエージェント&生成AIプロダクトを目指して~ / BEYOND-THE-RAG-Toward Practical-GenerativeAI-Products-AOAI-DevDay-2025
jnymyk
4
230
2025/07/22_家族アルバム みてねのCRE における生成AI活用事例
masartz
2
110
OpenTelemetry の Log を使いこなそう
biwashi
5
990
低レイヤソフトウェア技術者が YouTuberとして食っていこうとした話
sat
PRO
7
5.8k
AI エンジニアの立場からみた、AI コーディング時代の開発の品質向上の取り組みと妄想
soh9834
6
260
少人数でも回る! DevinとPlaybookで支える運用改善
ishikawa_pro
1
220
CSPヘッダー導入で実現するWebサイトの多層防御:今すぐ試せる設定例と運用知見
llamakko
1
200
Shadow DOMとセキュリティ - 光と影の境界を探る / Shibuya.XSS techtalk #13
masatokinugawa
0
270
Step Functions First - サーバーレスアーキテクチャの新しいパラダイム
taikis
1
280
PHPからはじめるコンピュータアーキテクチャ / From Scripts to Silicon: A Journey Through the Layers of Computing
tomzoh
2
380
Featured
See All Featured
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
8
370
The Language of Interfaces
destraynor
158
25k
Building a Modern Day E-commerce SEO Strategy
aleyda
42
7.4k
For a Future-Friendly Web
brad_frost
179
9.8k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
18
1k
Agile that works and the tools we love
rasmusluckow
329
21k
KATA
mclloyd
30
14k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
161
15k
Optimizing for Happiness
mojombo
379
70k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
30
2.2k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
26k
Practical Orchestrator
shlominoach
189
11k
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!