ptt的初步網路分析(network analysis)

近期天下的專題輿論戰爭,點出在八卦或政黑有些操作的跡象,其中有些網路分析的技術,這裡嘗試重現相關分析。

Kevin Tseng
Jun 1 · 5 min read

1. import 網路分析常用的package networkx

資料取樣自ptt八卦版2018–07–15,可直接用jwliny在github的ptt-web-crawler,不用自己寫爬蟲,安裝完後直接下指令(超佛!

2. 整理資料:

推文作為source,發文作為target,主要是覺得推文作為主動方,觀察是否有大量互相推文的現象。

rs_df = pd.DataFrame()

for x in ptt_df.itertuples():

##資料有點大,先取70篇文章
if x.Index > 70:
continue

##先把文章資料轉為DataFrame
art = pd.DataFrame([x.articles])

##如果發文沒有人推,直接濾除
if art.messages[0] == []:
continue

#作者 id 有中文,但推文 id只有英文,統一用 英文id 作為Key
author_id = art.author.replace(r'\([^)]*\)', '', regex=True).values[0].replace(' ', '')

reply = pd.DataFrame(art.messages.values[0])

temp_df = reply[['push_userid']].copy()
temp_df['target'] = author_id

##以發文日期作為推文的估計值,因為push_ipdatetime的ip 跟 datetime放在一起,有些只有datetime 沒有ip,好像跟RE 有關....
temp_df['date'] = art.date[0]
##欄位重新命名,push_userid 改為 source
temp_df.rename_axis({'push_userid':'source'}, axis=1, inplace=True)

if rs_df.empty:
rs_df = temp_df
else:
rs_df = rs_df.append(temp_df)

3. 文章資料

4. 把DataFrame轉為有向圖

G = nx.from_pandas_edgelist(rs_df, source='source', target='target', create_using=nx.DiGraph())

5–1. 看一下degree(in_degree + out_degree)前10名吧!

out-degree 外度數: 某個id留言的數量

in-degree 輸入度: 某個id「被」留言的數量

翻譯名稱參考:http://terms.naer.edu.tw/detail/2378473/

#設定top幾
rnk = 20

deg_g = dict(G.degree)
top_deg_node = [ x[0] for x in sorted(deg_g.items(), key=operator.itemgetter(1), reverse=True)[:rnk]]
sorted(deg_g.items(), key=operator.itemgetter(1), reverse=True)[:rnk]

5–2. 看一下pagerank前10名吧!

pg_rnk_g = nx.pagerank(G)
top_pg_rnk_node = [ x[0] for x in sorted(pg_rnk_g.items(), key=operator.itemgetter(1), reverse=True)[:rnk]]
sorted(pg_rnk_g.items(), key=operator.itemgetter(1), reverse=True)[:rnk]

5–3. 畫個有向圖~

plt.figure(figsize=(12, 12))#nodelist
nx.draw_networkx(G, with_labels=True, nodelist=top_pg_rnk_node, labels={x:x for x in top_pg_rnk_node})
plt.show(
非常亂XD 所以還是需要GUI的軟體協助探索資料

6. 因為資料很大,所以輸出csv,給開源軟體Gephi試試,或是有好的方式進行圖的EDA( Exploratory Data Analysis)

完整的程式碼在github(ipynb):

TODO:

由於資料量滿大的,會先擴充資料,以及其他的分析手段~

Kevin Tseng

Written by

熱衷Data Science,希望透過紀錄加強自己的學理,也記錄生活的夢囈