如何分析找出知乎的潛在的熱門問題?

我記得有位知友做過類似的正則分析,可惜鏈接找不到了。


手機上就寫個思路吧

爬蟲抓知乎,還有知乎日報

知乎日報用來做分類器的正類,然後再遠一些不熱門的主題做負類,然後剩下的作為未標記樣本,做半監督分類,用訓練好的分類器預測就好了


謝邀,我好像有一點點資格回答這個問題,各位請看我的簽名。

之前學Python時寫了一個爬蟲,爬取知乎的問題數據,分析比較後選出500個最可能火的問題放在那個網站上。

其中的爬蟲已經開源了,傳送門:MorganZhang100/zhihu-spider · GitHub
各位用Github的親路過的時候請給點個Star或Fork,十分感謝!

以下是正文,想看一句話的結論直接翻最後:

分析會火的問題其實挺簡單(粗暴)的,基本上看一個問題的(單位時間內的)曝光量(或曝光量的增長率)即可。
所謂曝光量,指的就是這個問題出現在多少人的時間線上了。而出現在一個人的時間線上的原因無外乎:
1. 我關注的話題的熱門問題
2. 我關注的人關注了這個問題
3. 我關注的人回答了這個問題
4. 我關注的人給這個問題的答案點贊了
5. 其它(比如邀請某人回答該問題等)

前四點,也是最主流的四點,都可以通過知乎公開的信息計算出一個比較具體的數字。

舉例來說,我們計算一下「因為我關注的人關注了這個問題而出現在我的時間線上」的次數。


1. 我們點擊關注者名單,可以看到所有人 知乎 - 與世界分享你的知識、經驗和見解
2. 我們點擊進去某個人的名字,比如我,再點擊關注我的人的名單知乎 - 與世界分享你的知識、經驗和見解,就可以知道因為我關注/回答了這個問題,有多少人以及哪些人的時間線上會看到這個問題。
3. 重複步驟2直到我們獲取了所有關注這個問題的人的名單,去掉其中重複的名字,得到的人數就是「因為我關注的人關注了這個問題而出現在我的時間線上」的曝光量的上限

為什麼是上限?因為我關注的人可能對這個問題做了多種操作,比如關注、回答、點贊等,這些會被知乎合併後出現在我的時間線上,而不是簡單的一次次的重複出現。

類似的我們還可以計算出其它幾種曝光量的次數。

我們除了可以計算出最後的曝光量之外,還可以通過回答者回答問題的時間(這個有公開數據),關注者關注問題的時間(這個沒有公開數據,不過可以通過定時抓取關注者列表來得到這個粗略的數據)來知道這些曝光量的增長曲線(曝光量/時間曲線)。

有了這些數據之後就簡單了:
只要這個問題的曝光量大,它就幾乎一定是火的。
只要這個問題的曝光量的增長速度大,它就幾乎一定是會變火的。

而經過我對知乎數據的抓取和分析,得到的一句話的結論是:
基本上曝光量跟問題關注者人數是正相關的。只要一個問題在短時間內關注者人數上升到一個坎,基本就可以認為這個問題很可能會火。當然,這種預測的准與不準是可以通過調整這個坎的參數來調整的。坎越嚴格這個預測就越准。就是這麼簡cu單bao。

以上均是一家之言,不一定對,歡迎討論。
以後有機會再把「如何分析找出給哪個問題寫答案會得票多」分享給大家。


#前言

#並不是自問自答。

#準備計算大V關注與問題是否為熱點的相關性。待更。


#預實驗腳本寫錯了…滾去修改。
#早上還好使晚上就405了。見鬼……
#對不起剛剛腦殘了,腳本還能用,不過我不打算把它貼出去了,太佔地方。想看的私信吧(其實是因為粗糙到拿不出手…)

#做完了

#開始做@肖智博所提出的方案。十二萬分感謝…(雖然我從沒寫過機器學習的代碼)


提點自己的猜想,期待討論。

1、如果你的伺服器夠強,應該可以掃描所有問題,監測每個問題的關注度。
你會發現關注度超過一個範圍之後,就可能會有一個暴漲的趨勢。它們就是潛在的熱點問題。這個我之前做過一點,不過因為設備不給力,掃描一次的時間太長,導致結果基本上沒什麼用(只用一個筆記本還想怎樣!)
私以為關注數破200就已經算是熱點了。如果有人寫出了能收到200贊的答案,那麼平均來看這個答案就會出現在幾千人的timeline上。更多的人看到,更多的人點贊,往複循環,然後大家就會覺得這真的是個熱門問題。

但是!!!我們沒有伺服器啊!!!

於是就有了2。


2、一般人應該是沒有1中的條件。不過如果你稍微分析一下熱點問題的關注列表,可能會有新的收穫。
根據我刷知乎的經驗,問題成為熱點之前,很可能發生過一件事:被大v關注或點贊。熱點問題在我的timeline里第一次和第二次出現的原因一般正是通過大v的活動,而且彼時這個問題常常看起來並不火爆。
關於這個猜想,我等會去寫個腳本統計一下好了——如果不睡回籠覺的話。

02/13/2015

======================================================

一、預實驗


腳本寫好了。我簡直太勤勞了…

我們先來小小地測試一下。

運行腳本,得到前200位關注者,查找其中的千粉用戶。


#排除了匿名用戶

#list中的順序不能代表關注順序,誤差在20位左右.


測試問題1:不能接受男朋友提出的婚前性行為,怎麼辦? - 戀愛


egin{tabular}[t]{c|c}
hline
    用戶 被關注數\
hline
KonnyYao 9143\
鮑表  2205\
菠菜184410\
hline
end{tabular}

測試問題2:有哪些好的 LaTeX 編輯器? - 文本編輯器


egin{tabular}[t]{c|c|c}
hline
    用戶 被關注數\
hline
7茉茉7583\
8韓祝鵬 2253\
40 張拯寧 1610\
120

前200位關注者中有4位千粉用戶。當然這個問題不算是很熱啦。

測試問題3:在北京,有哪些不是景點但值得一去的地方? - 時尚

egin{tabular}[t]{c|c|c}
hline
    用戶 被關注數\
hline
30 釘妹1459\
101SophieJ1032\
155Agoni2644\
183鮑表 2205\
hline
end{tabular}

還好還好…


測試問題4:Python 常用的標準庫以及第三方庫有哪些? - Python


egin{tabular}[t]{c|c|c}
hline
    用戶 被關注數\
hline
10yegle 2559\
13

嗯,這就叫程序員社區。


測試問題5:如何優化 Python 爬蟲的速度? - 爬蟲(計算機網路)


egin{tabular}[t]{c|c|c}
hline
    用戶 被關注數\
hline
0 陳然 42658\
2 翰藍 1102\
8 趙世奇 289080\
29安江澤 15024\
39 郭麒 18590\
91 raya 1950\
107李遙 1637\
139 鄭梓豪 1615\
192 謝科 6854\
hline
end{tabular}

我都說了它是程序員社區吧…

測試問題6:有沒有什麼自然科學理論瞬間擊中你以至於改變了你的價值觀? - 自然科學


egin{tabular}[t]{c|c|c}
hline
    用戶 被關注數\
hline
8 大臉撐在小胸 10712\
99 張洪濤 1658\
119 肖瑤瑤 2893\
hline
end{tabular}

…這問題火了一點不奇怪。

測試問題7:如何看待蘇格蘭科學家成功降低光速? - 物理學


egin{tabular}[t]{c|c|c}
hline
    用戶 被關注數\
hline
9 Tsui Randy 3228\
27山醒 51140\
71白如冰 23760\
93 唐知Tata 6479\
141 張小平 2873\
158 劉中陽 16988\
160 章彥博 4335\
179袁霖1643\
hline
end{tabular}

果然是因為三體嗎…

測試問題8:找個化學專業的男(女)朋友是一種怎樣的體驗? - 戀人相處
@dream journey

egin{tabular}[t]{c|c|c}
hline
    用戶 被關注數\
hline
14成楚暘 2440\
19無碼餵羊 1007\
33

全是化學狗…

數據如上所示。有興趣的可以用我的代碼自己試一試。以上8個問題的前100位關注者中都有至少一位大V。我覺得這個結果部分地驗證了我的猜想。如果你能把社區里所有1000粉以上的人記錄下來(人數並不很多),然後每天兩次分析他們timeline的重合情況,就可能獲取未來的熱點問題。

當然,也有一些像書記 @孟德爾 一樣每天點贊各種冷僻問題的人。這種事情我也沒辦法…


#第一個長答案竟然是由代碼填充的…

02/13/2015

二、卡方檢驗

皮爾森卡方檢定_維基百科

@dream journey同學指出,我並不能證明大V關注是熱點問題的充分條件。換言之,大V是否關注與問題是否會成為熱點並不一定有明顯的相關性。


於是我所要做的就是取得足夠的樣本,為這個表補充數據。

egin{tabular}[t]{l|c|c}
hline
     大V關注 未被關注\
hline
熱點  ??? ???\
非熱點  ???  ???\
hline
end{tabular}

通過卡方檢驗chi ^{2}=frac{n(ad-bc)^{2}}{(a+c)(b+d)(a+b)(c+d)},我們能夠估計出兩個事件相關的概率。

那麼問題就在於樣本的搜集。我們可以很清楚地發現,知乎問題的url有很明顯的特點。例如:http://www.zhihu.com/question/27507213 ,結尾是八位的數字。那麼我就可以隨機生成八位數字作為問題編號,以此來獲取隨機性足夠的樣本。

獲取的樣本中,可能會有大量毫無營養的問題,所以我要設定一個篩選標準,以避免問題基數被無意義地拉大。我暫且把過濾數設置為10。少於10人關注的問題我將不予計算。

待我繼續寫腳本……

==================過了一段時間==================

腳本寫完了。有效url的密度比我想像中要小得多,20000多個頁面中只有510個沒有404 NOT FOUND。再除去那些10關注以下的,剩下了……呃……96個。

對不起…我真沒想到居然有這麼水…


嗯嗯…繼續說正事。

取前200名關注者中過千粉用戶數不小於3的問題為大V關注問題,關注數200以上的為熱點問題:

egin{tabular}[t]{l|c|c}
hline
     大V關注 未被關注\
hline
熱點  15 1\
非熱點  11  69\
hline
end{tabular}
chi^{2}=43.21

我覺得我沒算錯…這麼大的結果在常用卡方表裡已經查不到了。

所以從理論上講我現在有了99.99%以上的把握,要是相關性不大的話你們可以打死我。


02/14/2015


增補70條數據。現有數據為:

egin{tabular}[t]{l|c|c}
hline
     大V關注 未被關注\
hline
熱點  25 2\
非熱點  33  106\
hline
end{tabular}
chi^{2}=47.15

越來越大了…


接下來我們來加強一下條件。

使用之前收集的數據,去除關注數不大於10的問題。定義前100名關注者中過千粉用戶數不小於3的問題為大V關注問題,關注數300以上問題為熱點問題。重新整理得:

egin{tabular}[t]{l|c|c}
hline
     大V關注 未被關注\
hline
熱點  18 3\
非熱點  38  98\
hline
end{tabular}

chi^{2}=1.48 , 對應的alpha>0.1,說明二者有相關性的概率低於90%。換言之,加強條件後相關性大大減弱。

不過這麼強的條件真的用的上嗎?

#我突然醒覺自己本來是在寫multidimentional scaling的……

02/14/2015


時事/娛樂類問題:
從新浪微博的熱門博文d_{sina}中估計出一個語言模型	heta_{sina},然後對所有被提問者打上時事/娛樂相關標籤的問題d in D,使用最大邊際相關(MMR)的方法遞進選出k個問題,S是已被選出的問題的集合。
mathrm{arg,max}_{d 
otin S} left( lambda cdot mathrm{sim} (d_{sina},d) - (1-lambda) cdot max_{d

或者最小化以下度量:
mathrm{value}_R(	heta_i;	heta_{sina}) (1- 
ho - mathrm{value}_N (	heta_i;	heta_1, ldots, 	heta_{i-1}))

可調參數lambda, 
ho用來在相關性和結果集的多樣性之間作權衡。
結果即為k個熱門問題。

技術類問題
根據每個人在相關技術領域回答的質量(贊同、感謝)等計算大家對各個技術話題的「推薦權重」(比如輪子哥對 Windows 話題的推薦權重就很高)。
各話題截取全知乎 top 5000,這些人對相關技術問題的關注、回答等行為會為問題增加分數。
然後就是實時排序,將熱門問題推送到粉絲的時間線上以及進入「發現」欄目。

其他問題:
看關注者增長的加速度就好。

參考:

  1. Carbonell, Jaime, and Jade Goldstein. "The use of MMR, diversity-based reranking for reordering documents and producing summaries." Proceedings of the 21st annual international ACM SIGIR conference on Research and development in information retrieval. ACM, 1998.
  2. Zhai, Cheng Xiang, William W. Cohen, and John Lafferty. "Beyond independent relevance: methods and evaluation metrics for subtopic retrieval." Proceedings of the 26th annual international ACM SIGIR conference on Research and development in informaion retrieval. ACM, 2003.

樓上的方法很好,寫代碼的確是很有效的方法。像我這種不會寫代碼的,只好腦補了。但是我敢保證,這個腦補很靠譜!
1.這個問題要有價值,最好針對一個空白。
也就是說知乎上有很多人會對這個問題感興趣,之前卻沒有這樣的問題。
例如我之前提的問題:如何評價TFBoys?
用了不到一周,瀏覽量突破50萬。
2.能被推送到很多人的timeline上
一個問題能推送到你的timeline上,只有兩種可能。一是你關注了的人(大多是大V或者我這種小V)關注,回答,點贊,二是XX話題下很多人贊同了回答XXX。
想讓大V關注,還要看第一點,問題要足夠吸引人。另外適當邀請小V也是很好的辦法。
二就是要把話題選好,有些知友提了個問題,就選了兩個話題,而且兩個話題的關注者加一起不到1000。這樣的問題怎麼可能火起來?
稍後個人將說一點如何讓一個問題火起來的心得,大家可以先點贊,24小時內填坑。
最後預測一下,這個問題最後關注人數必破1000。


1)找到粉絲排名前500的大V

2)抓取他們六個小時以內的動態

3)他們每提出一個問題,回答一個問題,關注一個問題,給一個問題下的答案點贊,相應的問題權重加一

4)把所有問題按權重排序

5)把即時關注人數少於300的問題標記為潛在熱門

效果可以參考:知乎封神榜 - 您的知乎之旅從此開始

歡迎提改進意見


推薦閱讀:

使用爬蟲抓投資數據是否是一個高效的方式?
如何用爬蟲抓取股市數據並生成分析報表 ?
一個人一生要在紅燈前停留多久?
演算法之路該如何學習?
你壓力最大的時候是什麼時候,怎麼度過的?

TAG:知乎 | 知乎社區 | 數據挖掘 | 數據分析 | 爬蟲計算機網路 |