如何對文章下面的評論做排序(2019年版)
Reddit被騰訊收購之後貌似這個問題又重新被拿出來討論。Reddit在2009年公開過自己如何用威爾遜區間(wilson interval)對評論排序的[1],程式碼也開源過。阮一峰在2012年也對最早的演算法文章做過翻譯[2]。為了接來下的討論我稍微做下介紹。
Wilson演算法要點有兩個:
- 把“所有正負反饋中正反饋的比例”作為對評論質量的考核指標。在Reddit的情況中,正負反饋分別為點贊和反對。
- 對在冷啟動過程中的評論(即正負反饋總數很少)做降權處理。
具體演算法就是:假設觀測到的正反饋率符合真實正反饋率的正態分佈,求當前觀測得到的正反饋率恰好位於95%置信上區間時的真實反饋率。
鑑於Reddit特意官宣了這個改動(文章作者還是xkcd的作者),他們應該是對這個演算法的結果比較滿意的。
但這已經是十年前的事情了。在人工智慧滿天飛的今天,我們有沒有更好的方法來解決這個問題?
- 首先,Wilson區間作為一個統計學變數,有一個核心缺點:完全依賴當前觀測到的反饋,在冷啟動過程中無能為力。而事實上我們是有很多資訊的:評論本身的文字,評論者的歷史質量等等。(統計學上的表述就是:在有更多訊號的情況下,依然假設觀測到的正反饋率符合真實正反饋率的正態分佈是錯誤的)。因此,對Wilson區間的第一個改進是可以把靜態訊號納入到正負反饋中去。例如,把評論者的歷史點贊做加權算入正反饋訊號中。這樣即使評論是在冷啟動中,你還是可以生成一個相對可靠的質量分數。我把它稱之為威爾遜區間擴充套件版。
- 隨著靜態訊號加入的越來越多,反饋總數很少的情況變得越來越少。這時候依然使用Wilson區間的意義已經不大了,可以直接用擴充套件版的正反饋比例本身作為質量分。數學表達上基本可以等價於多訊號下的人工規則線形求和。
- 到這裡事情就開始變得套路了。因為“多訊號下的人工規則線形求和”就是我們在社交網路時代內容排序演算法的初級階段經常採取的做法。因此再往後評論排序就和feed排序的技術發展路徑很相似了。隨著想要囊括的訊號再度增加,人們發現人工規則的表達上限很低,你很難平衡好一個超過一百個決策因素的排序規則(根本原因是訊號間並不是相互獨立的),這時候基於機器學習的模型出現了。比如說,P(點贊|閱讀),P(回覆|閱讀),和P(舉報|閱讀)的線形組合[3]。
不過評論排序和feed排序還是有些許不同的:
- 首先,從評論裡能抽取出來的有用訊號要比post少得多(因為評論是公共內容,訊號相對稀疏)
- 其次,對於feed排序我們往往都希望是個性化的,每個人看到的結果都不同。但對於評論就未必希望這麼激進。有的產品會希望大家看到的評論排序都大致相同。反映到演算法上就是要不要排除掉基於閱讀者的訊號。(當然如果活做得夠細的話應該是訓練模型的時候計入,而應用模型的時候排除掉)
這可能也是為什麼直到今天,美國各家產品在做評論排序時的技術方案都各不相同,威爾遜區間/威爾遜區間擴充套件版/人工規則線形求和/機器學習什麼的都有。本質原因是選取的訊號總量各不相同,因此不像feed排序統一邁入了神經網路。
參考連結:
[1]: https:// redditblog.com/2009/10/ 15/reddits-new-comment-sorting-system/
[2]: http://www. ruanyifeng.com/blog/201 2/03/ranking_algorithm_wilson_score_interval.html