基于虎撲數(shù)據(jù)的中美籃球運動員熱度統(tǒng)計
1. 前言
在互聯(lián)網這個汪洋大海中,有一個網站叫虎撲,據(jù)稱“可能是最好的籃球網站”。虎撲以“濕乎乎板塊”為核心,集聚了大量的籃球運動愛好者。就像“濕乎乎”的字面意思一樣,虎撲里時不時會因為熱點實現(xiàn)事件、話題掀起海嘯一般的唾沫星子——這都是JRs爭論時噴出來的。以前,這個網站里有很多清涼圖片,年少的我每天逛得樂不思蜀。后來,虎撲好像要做個好人,主要呈現(xiàn)體育運動相關相關信息,沒有啥刺激性內容了。
作為一個老JR,我在開放區(qū)、步行街、濕乎乎潛行十幾年,發(fā)現(xiàn)大家最喜歡的話題,莫過于“誰是最XX的”。假如說,我發(fā)一個帖子問“姚明是當時最厲害的中鋒嗎”,估計58秒內會有4000個JRs提著40米的大刀前來發(fā)言。“最XX”的話題中,最讓人欲罷不能的,當屬“誰是最紅的巨星”、“誰是籃球界的門面”這類討論。由于大家沒有具體的數(shù)據(jù),只能憑感覺比較或者基于簡介數(shù)據(jù)來佐證,這種討論沒辦法得出令所有人性福的結論。
作為一個做NLP算法的JR,我利用手上的技能和工具,對虎撲最近若干個月的所有帖子(各大板塊的3160340個主貼和128162300個跟帖)進行了簡單的統(tǒng)計,試圖給大家伙一個參考。我是這么做的:識別所有帖子中的人名,并統(tǒng)計每個人名的出現(xiàn)次數(shù),然后直接以名字的頻數(shù)作為對應球員的熱度。這里使用的NER和分詞算法都來自阿帕比技術公司開發(fā)的NLP工具包。
本文的主要內容是:首先介紹文本的目的和意義;然后直接給出結論,即誰是最火的籃球運動員;接著介紹從數(shù)據(jù)獲取到得出結論的整個過程,包括必要的軟件系統(tǒng)設計與開發(fā)、數(shù)據(jù)的基本情況和數(shù)據(jù)統(tǒng)計的具體方法,以說明結論的合理性。
2. 目的和意義
我做這個分析的首要目的,是想調查一下,中國男子職業(yè)籃球聯(lián)賽(China Basketball Association, CBA)在國內的受眾廣度。另外,我也想知道CBA的發(fā)展階段,比如相比NBA,其受眾廣度的大小。這是好奇心驅動的一個項目。
其次,在這個過程中,把數(shù)據(jù)采集、目標范圍定義、數(shù)據(jù)清洗、建模、可視化等等環(huán)節(jié)——都玩耍一下。是的,工作一般來說比較枯燥,各種形式的玩??梢哉{劑一下。
再次,我需要一個形式,把目前的思維方式、方法論、技術水平等等記錄下來,以便以后復盤和優(yōu)化。
最后,這種分享行為是學術公益活動的一種,可以幫很多需要入門的人避免踩坑。
3. 誰是虎撲籃球熱度南波萬
在虎撲,誰是最火的籃球運動員?是無極尊嗎?廢話少說,先上結論。
3.1. 中美籃球職業(yè)籃球運動員熱度排行榜
3.1.1. 中美明星球員熱度比較
如表3-1,是中國職業(yè)男子籃球聯(lián)賽和美國職業(yè)男子籃球聯(lián)賽本賽季注冊運動員的熱度排行前20名(可視為中美籃球明星)。中美籃球明星榜被美職籃球員統(tǒng)治了——只有4位CBA球員進入了這個榜單,他們是新疆飛虎隊的周琦、廣東華南虎隊的易建聯(lián)、遼寧飛豹隊的郭艾倫和北京鴨隊的林書豪。
表 3-1中美現(xiàn)役籃球運動員熱度排行top 20

從明星球員的公司情況可以看出,在虎撲網,中職籃明星球員的熱度大幅度地低于美職籃明星球員。按理說,虎撲作為一個中文體育網站,是我們的主場,中職籃應該向朱芳雨一樣,輕輕松松“一拳打開了天”,如圖3-1。實際情況是,美職籃依靠其更高的經濟水平和觀賞性,以及更高的運營和推廣能力,統(tǒng)治了我們的主場。中職籃產生流量的能力水平其實是比較菜的,類似圖3-2。


3.1.2. 中美普通球員熱度比較
籃球是一項集體運動,不只有璀璨的明星,更多的是普通球員。在中美的普通球員之間,有沒有類似明星球員那樣的熱度差距呢?如圖3-3,是中職籃和美職籃球員熱度的箱型圖。由于普通球員的熱度相對明星球員非常低,我的“箱子”被壓得非常扁,肉眼看不出來最廣大人民的情況。

這時候,我們可以用直方圖來分析一下。如圖3-4,有4個子圖,其中左邊一列是中職籃和美職籃全體球員的熱度直方圖。我又截取了兩個聯(lián)盟里熱度值小于等于90分位數(shù)的球員數(shù)據(jù),形成了圖3-4里右邊一列子圖。
圖3-4左邊一列子圖告訴我們,中職籃和美職籃都是明星當?shù)?,少?shù)高水平球員產生了絕大部分的熱度。剩下的都是默默無聞的普通球員。注意右邊一列子圖橫軸的取值范圍,中職籃的普通球員熱度,比美職籃的普通球員熱度低了一個數(shù)量級。
看來我們和人家的差距,是全方位的。

總的來說,我國運動員的熱度,在一個國內網友為主的論壇里,是低于美職籃運動員的。
3.2. CBA人物熱度榜
如表3-2,是中職籃球員的熱度排行。我已經多年不看球了,這個榜單中的一小部分名字不熟、大部分球員不熟,只挑幾個熟悉的說說。周琦在CBA球員中的領先優(yōu)勢,比“美國周琦”在NBA球員中的領先優(yōu)勢要大得多。易建聯(lián)、孫悅、周鵬這幾個老家伙,依然具有明星級別的熱度。其中易建聯(lián)依靠不懈的努力,依然具有頂尖的競技水平。 林書豪作為當年在NBA的“黃人之光”,受到了極高的關注。到了CBA,他直接成為聯(lián)盟里最火熱的球星。從這里也能看出我們的聯(lián)賽,在推廣方面,可以提升的空間還是很大的。小霸王斯塔德邁爾依靠在美職籃的野獸派+技術流打法,有著不錯的人氣,也進入了前20。
有個現(xiàn)象還是挺好的。這里絕大部分是我們的本土球員,說明大家關注的,主要還是自己人。不論水平如何,咱們對國內球員的支持還是一如既往,希望依靠自己人來提升我國籃球的競技水平。
中職籃和美職籃這兩個商業(yè)體育賽事的熱度,主要還是靠明星球員來產生。人們圍繞這些明星球員創(chuàng)作了各種各樣的概念和梗,讓體育比賽更有故事性、從而進入球迷的茶余飯后。作為一個產品,體育賽事的用戶粘性也就得到了提升。中職籃要加油了,我們的比賽、球員水平需要提升,讓球迷們感覺這是個具有美感的體育賽事;也需要用球隊文化、故事之類的東西包裝一下我們的球員,讓他們可以成為球迷們口頭禪的一部分。
表 3-2 中職籃球員熱度排行top20

3.3. NBA人物熱度榜
如表3-3,是美職籃球員熱度排行榜。老詹球場上實力超群,場下也是“流量皇帝”,熱度值大幅領先于他的同事。據(jù)我所知,在濕乎乎里隨便發(fā)一個關于老詹的帖子,就可以收割曝光量了。雷霆三兄弟不光都成為了了最有價值球員,還都成了最具熱度球員。三弟的排行超過了大哥,看來好平臺的作用還是非常大的。萊昂納德依靠高超的技藝,和最近幾年的爭議性事件,也積累了極高的人氣,竟然能排在威少的前面,把雷霆仨兄弟給分開。
這里有一個比較明顯的問題,就是金州勇士隊的庫里沒有進入top20。他的熱度竟然排在了第76位,不尋常。主要原因是我的球員名字數(shù)據(jù)庫構建的不完整,沒有收錄類似“庫日天”“庫昊”“小學生”“金州拉文”“萌庫”這樣的別稱。眾所周知,庫里的球迷特別喜歡為庫里其各種各樣的綽號,比如用“庫日天”來表達對庫里精湛的投籃技術的贊美。漏掉了這些別稱的后果,就是這位球員的熱度被大大低估了。由于任務架構設計失誤,沒有保存人名抽取的中間結果,再算一遍的成本抬高,我這里就不重算啦。
表 3-3 美職籃球員熱度排行top20

3.4. 特色球員簡介
我發(fā)現(xiàn)了虎撲里流量最高的籃球運動員,是時候蹭一波熱度了。這時候,我需要發(fā)揮比大師那種鉆研精神,好好地研究一下他們。
說什么最吸引流量呢?當然是有爭議性的話題。這里就選最具爭議性的話題:球星的梗。
3.4.1. 流量皇帝勒布朗-詹姆斯
果然,詹姆斯在現(xiàn)役籃球運動員中,是熱度最高的。
由于沒有統(tǒng)計退役球員的數(shù)據(jù),沒有考慮喬丹、科比這樣的流量達人,這里只能說“現(xiàn)役”。
如果這是篇學術論文,我會把詹姆斯的幾十個綽號全都收錄并展示出來。然而這是個“技術討論貼”,不利于大家團結的內容就不展示了(一些極端球迷使用了不和諧的措辭,給詹姆斯起了大量涉及人身攻擊的綽號),這里只展示圍繞生活和籃球的部分綽號。
表3-4 詹姆斯的外號與梗



如圖,我統(tǒng)計了老詹今年(實際是從2018年末開始,但是這個階段的數(shù)據(jù)缺失太多)3月份以來,每一個周的熱度情況。由于代碼的bug,我的聚合操作,是按照“周五-下周四”這樣的時間范圍來做的。為了避免這幾臺機器的運轉,造成我家氣溫繼續(xù)上升,我決定不重算啦。統(tǒng)計的bug不影響曲線所要表達的內容。
今年湖人隊沒有進入季后賽,所以老詹的熱度在相應時間段里比較低,和“長草期”差不多。七月份時,老詹的熱度突然升高了一下。當時濃眉哥快要轉會到湖人隊,大家都在關注這支球隊、討論濃眉能否成功轉會。十月中下旬開始,由于新賽季馬上就要開始,老詹的熱度一下就上來了。
可以說,球員的熱度主要依靠比賽帶來的曝光量來維持。

3.4.2. 男籃旗幟易建聯(lián)
易建聯(lián)是中國男籃歷史上難得的一號人物,不論是國內比賽,還是國際比賽,都能火力全開。當然他從早期的一個身體素質男,一步步成長為后姚明時代的帶頭大哥,也是有一個過程的。
表 3-5易建聯(lián)的外號和梗

3.4.3. 奇男子克里斯-保羅
這位奇男子,如圖3-6,在傳奇的職業(yè)生涯里,積累了無數(shù)名號,如表3-6。如此之多的梗,足以體現(xiàn)廣大球迷對保羅的關注程度之高。
表 3-6保羅的常見稱號
4. 數(shù)據(jù)處理系統(tǒng)的設計和開發(fā)
知乎和虎撲都有點類似草榴社區(qū)的“技術討論區(qū)”,沒有干貨的人是混不開的。接下來是方法和技術方面的干貨。
4.1. 任務需求分析
為了知道誰是虎撲籃球熱度第一人,我需要一份虎撲數(shù)據(jù),需要從數(shù)據(jù)中識別出命名實體并做簡單的計數(shù)。為此,我需要3個工具:(1)一個用來獲取虎撲帖子數(shù)據(jù)的爬蟲;(2)一個用于從文本中抽取人的名字的工具;(3)一個用來對人名進行個數(shù)統(tǒng)計和可視化的工具。如圖2-1,是用于完成任務的系統(tǒng)結構。
為了確保這個任務在可接受的時間內結束,我需要估計一下各個環(huán)節(jié)的耗時:
(1) 數(shù)據(jù)獲取大概需要10天。這段時間里我可以開發(fā)調試命名實體識別環(huán)節(jié)和數(shù)據(jù)統(tǒng)計分析環(huán)節(jié)的代碼,并完成報告的大綱和部分內容的撰寫。
(2) 之后,就需要盡快完成命名實體識別任務。數(shù)據(jù)是2019年3月11日21點41分開始至XXXX的所有帖子,包括大約300萬篇主貼加1.2億回帖(平均每個帖子里的回帖數(shù)量大約是40),總共約1.23億條數(shù)據(jù)。假設每條數(shù)據(jù)的處理速度是50毫秒,就需要兩個月。這怎么行,都跨年了。必須想辦法提升任務的并行度,降低耗時。
(3) 剩下的就是一個頻率統(tǒng)計任務,也許3秒就夠了。
4.2. 爬蟲及獲取虎撲數(shù)據(jù)概況
4.2.1. 爬蟲
我是個野生的爬蟲選手,無力開發(fā)一套高水平的爬蟲,因此選擇依靠開源框架。這里選擇的是python的爬蟲類第三方庫中,最受歡迎的scrapy。
還在學校的時候,我花了超過一個月的時間開發(fā)了一個用來下載虎撲數(shù)據(jù)的爬蟲。后來又對爬蟲做了幾次升級。然而2018年下半年,虎撲的頁面數(shù)據(jù)結構發(fā)生了變動,我需要對爬蟲進行大改。然而我是個打工仔,沒有那么多的時間搞這個,只能作罷。后來聽同事軍偉大哥說,他基于scrapy開發(fā)爬蟲可順手了,于是我也調研了一下。果然是真香——過年的時候,我一邊陪孩子玩,一邊從零開始重寫,不到一個禮拜就完工了。當然了,這里還需要感謝lxml這個庫,它通過支持xpath語法,極大地減少了我們解析html的工作量。
爬蟲的結構非常簡單:獲取數(shù)據(jù),然后存到mongo中。由于不清楚分享爬蟲代碼算不算違法,代碼就不分享了。
獲取的數(shù)據(jù)包括兩部分:帖子的主貼和對應的回帖。
4.2.2. 虎撲帖子文本數(shù)據(jù)基本情況
如表4-1,是爬蟲獲取到的數(shù)據(jù)概況。可能虎撲數(shù)據(jù)庫的content字段類型為varchar,最大長度為19999,因此主貼和跟帖的最大長度接近或等于這個數(shù)。
主貼字數(shù)的中位數(shù)是66,說明大家發(fā)帖的時候,還是比較勤快的,為了闡述自己的想法或者疑問,愿意費一點口舌。
跟帖的字數(shù)中位數(shù)是19,說明JRs喜歡一句話解決戰(zhàn)斗。據(jù)我目測,濕乎乎的網友說話很少能到這個字數(shù)。
表 4-1 數(shù)據(jù)獲取結果概況
4.3. 命名實體識別工具
4.3.1. 選擇一個合適的人名識別方法
文本中的人名識別,是命名實體識別任務的一種具體情形,可以使用NER的方法來實現(xiàn)。這是一個典型的計算密集型任務,最好使用Spark這樣 分布式框架來處理數(shù)據(jù)量較大的情況。不過呢,我的Hadoop集群已經被自己弄壞了,恢復起來需要一段時間,修完也就跨年了。因此,這里使用了一個搭建
NER方案的制定過程說來話長,放在第5部分。
4.3.2. 用HTTP服務封裝NER模型
前面提到,NER環(huán)節(jié)的耗時會非常長,需要想辦法提升并行度。由于模型加載到內存里需要占大約500兆的內存,24G內存里最多放48個進程,也就是最快24小時可以完成計算——不過CPU核心數(shù)只有8,進程再多也沒用。因此,我這個估算是極度樂觀的,實際操作中的耗時肯定遠遠超過24小時,而且不可控。
為了保證任務耗時可控,我決定用一個簡單的分布式架構來處理這些數(shù)據(jù):在僅有的3臺機器上部署NER服務,然后并發(fā)地、以一個設計好的概率分布調用集群?,F(xiàn)在的資源是:24G+16G+8G=48G,8+12+24=44個CPU核心。這樣,一秒鐘可以處理約4500篇個文檔,一天就是”2億”,應該是夠了。樂觀情況下,半天計算完畢。如果實際情況不樂觀,那就把家里的筆記本也加到集群里。分布式架構的可擴展性還是挺有幫助。
經過仔細優(yōu)化的集群,實際用了8個小時就處理完全部數(shù)據(jù)。當時我家室內氣溫明顯上升。
5. 人名識別方案
用來識別文本中的人名方法非常多,可以參考
統(tǒng)計人名頻數(shù)任務看起來是最簡單的任務,實際上是我花時間最多的一個環(huán)節(jié)。
我需要回答一個問題:如何判斷文本中的一個字符串是否為人名。我的“答案”經過多次修改,終于成熟了。
當然,“真理”是值得追求的。在這個任務中,我只能在成本允許的情況下盡量接近他啦。
5.1. 初步的人名統(tǒng)計方法
一開始的時候,我選擇的是一個基于神經網路的NER模型。使用神經網絡的原因主要是兩個:首先是我已經有一個成熟的NER模型了;其次,神經網絡高級啊,說起來倍兒有面子。
這個模型是阿帕比技術公司自己開發(fā)NLP工具集中的一個模塊,如果想體驗這個模型,可以到這里看一下:
。這個模型對中文人名、音譯人名的識別能力非常強,F(xiàn)1-score超過了0.9。由于訓練語料里沒有外文人名,我的模型無法識別“Yao Ming”這樣的外文人名。這里選擇忽略所有沒有以中文表達的人名。這樣做的損失是比較小的——虎撲里活躍的絕大部分人是中國人,極少使用外文來稱呼一個人,比如我們很少稱呼邁克爾-喬丹為“Jordan”(一般是喬丹、幫主、籃球之神、GOAT等)。
我用一份比較小的數(shù)據(jù)進行了人名統(tǒng)計。在看統(tǒng)計結果的時候,我發(fā)現(xiàn)機器找出來的人名中,絕大部分不是籃球運動員——難不成還要把這幾百個人的頻數(shù)挑出來?
這樣做的成本有點高,而且萬一數(shù)據(jù)處理流程有Bug、需要重新計算一遍,成本會更高。另外,基于神經網絡的模型計算效率太低了,處理完整的數(shù)據(jù)集需要十幾天。成本要爆炸了,不可行。
我得仔細琢磨一下這個場景,看看還有沒有更好的選擇。
5.2. 更好一點的統(tǒng)計方法
實際上,這個任務是一個典型的詞語集合受控的場景:我只需要統(tǒng)計籃球運動員的名字,其他的可以采取類似多諾萬教練的態(tài)度(可參考“我跟他不熟”)。這種場景非常適合使用基于詞典的NER方法。
這樣的話,我這個方案就簡單了,需要解決兩個問題:(1)人名詞庫的設計和建設;(2)找到文本與人名詞庫的匹配方法。
5.2.1. 籃球人物姓名數(shù)據(jù)庫設計和構建
籃球運動員的個人資料非常好找:
CBA運動員信息的數(shù)據(jù)源為
NBA運動員信息的數(shù)據(jù)源是
如圖5-1,是虎撲網的球隊信息中,球員部分。對中國球員,所有球員的姓名全稱(比如“易建聯(lián)”)收錄到詞庫中,其中一部分我個人比較熟悉的球員配備了別稱(比如“阿聯(lián)”、“太空易”)。對外國球員,所有球員的姓名全稱(例如”索尼-威姆斯”,“索尼威姆斯”)收錄到詞庫,部分稀少、或不存在歧義的姓(比如“詹姆斯”通常指勒布朗-詹姆斯)作為對應球員的別稱收錄到詞典,部分我個人比較熟悉的球員配備了盡量齊全的別稱。
這個詞典里實際上存在幾種偏見:
(1) 首先,類似勒布朗-詹姆斯獨占“詹姆斯”這個姓氏作為別稱的做法,是對其他小眾、姓氏同為“詹姆斯”的球員的不公平。這樣做會把這些小眾球員的一點數(shù)據(jù)轉移到勒布朗-詹姆斯的身上,導致一種強者更強的結果。
(2) 我個人越熟悉的球員,具有越詳盡的別稱,可以以更高的查全率統(tǒng)計得到更精準的熱度。其他球員的熱度則或多或少地被低估了。
(3) 由于我個人的喜好,一些別稱沒有被收錄到詞庫中,導致相關球員的熱度值被低估了。黑粉也是粉嘛,帶來的也是流量。
這兩份數(shù)據(jù)已經整理為結構化數(shù)據(jù),存儲在excel文件中:
人名庫構建的主要工作是球員別稱的收集整理。在任務的過程中,首先基于領域知識,即對籃球運動員的了解,構建了人名數(shù)據(jù)庫的字段,并添加了一部分別稱;其次,基于那個用神經網絡做的NER模型,找了一大堆人名,然后從中找了一些別稱;另外,我又從論壇、搜索引擎里收集了一部分別稱。
5.2.2. 人名匹配方法
按照直覺,我們可以使用子字符串匹配算法來統(tǒng)計人名,這樣做起來簡單。
不過呢,這樣做會遇到嚴重的歧義問題。比方說,“我想叫姚明天過來給大家展示一下投籃”這句話中,“姚”這個字指的是姚明,“明天”是一個時間。如果使用自字符串匹配,我們就稀里糊涂的把“明天”拆開了。這個例子里只是碰巧對了。如何避免歧義的干擾呢?
我選擇使用分詞的方式,基于語言模型將文本切分為一個個小單元,然后與人名詞庫比對、找人名。語言模型可以基于對語法、語義的了解,把類似“姚明天”這樣的字詞精準切分開。這里使用了一個基于最短路徑求解的馬爾科夫模型分詞工具(也是阿帕比技術公司的)。算法原理可以參考
6. 結束語
至此,這個由好奇心驅動的項目就告一段落。
馬上就要過春節(jié)了,這里提前送上對所有人的祝福,如圖6-1。
注意:本文為李鵬宇(知乎個人主頁https://www.zhihu.com/people/py-li-34)原創(chuàng)作品,受到著作權相關法規(guī)的保護。如需引用、轉載,請注明來源信息:(1)作者名,即“李鵬宇”;(2)原始網頁鏈接,即當前頁面地址。如有疑問,可發(fā)郵件至我的郵箱:lipengyuer@126.com。
掃描二維碼推送至手機訪問。
版權聲明:本文由財神資訊-領先的體育資訊互動媒體轉載發(fā)布,如需刪除請聯(lián)系。