Matrix
漢語是一種獨特而神奇的語言,我非常熱衷于用計算的方法去分析漢語資料。2012年,我在人人網(wǎng)實習(xí)了一段時間,期間在對漢語資料進(jìn)行自然語言處理時,我遇到了很多其他語言不會有的困難,比如分詞——漢語的詞與詞之間沒有空格,計算機怎么才知道,“已結(jié)婚的和尚未結(jié)婚的青年都要實行計劃生育”究竟說的是“已/結(jié)婚/的/和/尚未/結(jié)婚/的/青年”,還是“已/結(jié)婚/的/和尚/未/結(jié)婚/的/青年”呢?這就是所謂的分詞歧義難題。雖然現(xiàn)在很多語言模型已經(jīng)能比較漂亮地解決這一問題了。但在中文分詞領(lǐng)域里,還有一個比分詞歧義更令人頭疼的東西——中文沒有首字母大寫,專名號也被取消了,這叫計算機如何辨認(rèn)人名地名之類的東西?更慘的是機構(gòu)名、品牌名、專業(yè)名詞、縮略語、網(wǎng)絡(luò)新詞等等,它們的產(chǎn)生機制似乎完全無規(guī)律可尋。最近十年來,中文分詞領(lǐng)域都在集中攻克這一難關(guān),自動發(fā)現(xiàn)新詞則是其中關(guān)鍵的環(huán)節(jié)。
挖掘新詞的傳統(tǒng)方法是,先對文本進(jìn)行分詞,然后猜測未能成功匹配的剩余片段就是新詞。但這似乎又陷入了一個怪圈:分詞的準(zhǔn)確性本身就依賴于詞庫的完整性,如果詞庫中根本沒有新詞,我們又怎么能信任分詞結(jié)果呢?此時,一個大膽的想法浮現(xiàn)了出來:能不能不依賴任何已有的詞庫,僅僅根據(jù)詞的共同特征,將一段大規(guī)模語料中可能成詞的文本片段全部提取出來,然后,再把所有抽出來的詞和已有詞庫進(jìn)行比較,不就能找出新詞了嗎?于是,我隨機找來人人網(wǎng)2011年12月部分用戶的狀態(tài)和相關(guān)語料,準(zhǔn)備自己做一次挖掘?qū)嶒灐?/p>
文本、詞語有算法
要想從一段文本中抽出詞來,我遇到的第一個問題就是,怎樣的文本片段才算一個詞?大家想到的第一個標(biāo)準(zhǔn)或許是,看這個文本片段出現(xiàn)的次數(shù)是否足夠多。不過,光是出現(xiàn)頻數(shù)高還不夠,一個經(jīng)常出現(xiàn)的文本片段有可能還是多個詞構(gòu)成的詞組。在各種用戶狀態(tài)中,“的電影”出現(xiàn)了389次,“電影院”只出現(xiàn)了175次,然而我們卻更傾向于把“電影院”當(dāng)作一個詞,因為從直覺上看,“電影”和“院”銜接得更緊密一些。
為了證明“電影院”一詞的內(nèi)部凝固程度確實很高,我決定計算一下,如果“電影”和“院”真的是各自獨立地在文本中隨機出現(xiàn),它倆正好拼到一起的概率會有多少。在2400萬字的語料數(shù)據(jù)中,“電影”一共出現(xiàn)了2774次,出現(xiàn)的概率約為0.000113,“院”字則出現(xiàn)了4797次,出現(xiàn)的概率約為0.0001969。如果兩者之間真的毫無關(guān)系,它們恰好拼在一起的概率就是0.000113 × 0.0001969,約為2.223×10??次方。但事實上,“電影院”在語料中一共出現(xiàn)了175次,出現(xiàn)概率約為7.183×10??次方,是預(yù)測值的300多倍。而“的”和 “電影”隨機組合到了一起的理論概率值為0.0166×0.000113,約為1.875×10??,這與“的電影”出現(xiàn)的真實概率很接近——真實概率約為1.6×10??次方,是預(yù)測值的8.5倍。這個計算結(jié)果表明,“電影院”更可能是一個有意義的搭配,而“的電影”則更像是“的”和“電影”這兩個成分偶然拼到一起的。
光看文本片段內(nèi)部的凝合程度還不夠,文本片段的自由運用程度也是判斷它是否成詞的重要標(biāo)準(zhǔn)。如果一個文本片段能夠算作一個詞的話,它應(yīng)該能夠靈活地出現(xiàn)在各種不同的環(huán)境中,具有豐富的左鄰字集合和右鄰字集合。我決定用信息熵來衡量一個文本片段的左鄰字集合和右鄰字集合有多隨機?!靶畔㈧亍笔且粋€非常神奇的概念,它能夠反映知道一個事件的結(jié)果后平均會給你帶來多大的信息量。如果某個結(jié)果的發(fā)生概率為p,當(dāng)知道它確實發(fā)生了,得到的信息量就被定義為-log(p) 。p越小,得到的信息量就越大。在人人網(wǎng)用戶狀態(tài)中,出現(xiàn)了956次的“被子”的左鄰字用例非常豐富:用得最多的是“曬被子”,所有左鄰字的信息熵為3.67453,而2330個同樣發(fā)音的“輩子”中所有左鄰字的信息熵僅為1.25963。當(dāng)然,也有一些文本片段的左鄰字沒啥問題,右鄰字用例卻非常貧乏,例如“交響”、“后遺”、“鵝卵”等,把它們看作單獨的詞似乎也不太合適,于是我就把一個文本片段的自由運用程度定義為它的左鄰字信息熵和右鄰字信息熵中的較小值。
最后,我把文本中出現(xiàn)過的所有長度不超過d(即候選詞的長度上限,我設(shè)定的值為5)的子串都當(dāng)作潛在的詞,再為出現(xiàn)頻數(shù)、凝固程度和自由程度各設(shè)定一個閾值,只需要提取出所有滿足閾值要求的候選詞即可。為了提高效率,我又把語料全文視作一整個字符串,并對該字符串的所有后綴按字典序排序。這樣便得到了一個無需任何知識庫的抽詞算法,也就能以大致O(n·logn) 的效率提取出可能的詞來。
不怕狂想,只要有合適的算法
得到了基本算法,我開始對不同的語料進(jìn)行抽詞,發(fā)現(xiàn)2011年12月人人網(wǎng)用戶狀態(tài)中最常出現(xiàn)的詞是:
哈哈、什么、今天、怎么、現(xiàn)在、可以、知道、喜歡、終于、這樣、覺得、因為、如果、感覺、開始、回家、考試、老師、幸福、朋友、睡覺、生活、已經(jīng)、希望……
程序一共從人人網(wǎng)的狀態(tài)數(shù)據(jù)中抽出了大約1200個詞,里面大多數(shù)詞也確實都是標(biāo)準(zhǔn)的現(xiàn)代漢語詞匯。不過別忘了,我這次的目標(biāo)是新詞抽取。所以我又將這些抽出來的詞與已有詞庫作對比,于是得到了人人網(wǎng)特有的新詞:
傷不起、給力、有木有、掛科、坑爹、神馬、淡定、老爸、無語、微博、六級、高數(shù)、選課、悲催、很久、人人網(wǎng)、情何以堪、童鞋、哇咔咔、吐槽……
這時候,我想到了一個更有意思的玩法。為什么不拿每一天狀態(tài)里的詞去和前一天的狀態(tài)作對比,從而提取出這一天里特有的詞呢?這樣一來,我就能提取出每日熱點了!于是我選了10個比較具有代表性的詞,列出了它們在2011年12月13日的用戶狀態(tài)中出現(xiàn)的頻數(shù)(左列的數(shù)),以及2011年12月14日的用戶狀態(tài)中出現(xiàn)的頻數(shù)(右列的數(shù)):
從上圖我們可以從直覺上迅速判斷出,14日除了“下雪”以外,“看見”、“北半球”和“脖子”也應(yīng)該是熱詞。你或許堅信后三個詞異峰突起的背后一定有什么原因,事實上,你的直覺是對的——2011年12月14日發(fā)生了極其壯觀的雙子座流星雨,此乃北半球三大流星雨之一。白天網(wǎng)友們不斷轉(zhuǎn)發(fā)新聞,因而“北半球”一詞熱了起來;晚上網(wǎng)友們不斷發(fā)消息說“看見了”、“又看見了”,“看見”一詞的出現(xiàn)頻數(shù)猛增;最后呢,仰望天空一晚上,脖子終于出毛病了,于是回家路上一個勁兒地發(fā)“脖子難受”。
更有趣的是,我在比較不同文本的用詞特點時,發(fā)現(xiàn)人人網(wǎng)上大多數(shù)發(fā)布者都填寫了性別和年齡的個人信息,那為何不把狀態(tài)重新分成不同組別,挖掘出不同屬性的人都愛說什么?要知道,在過去,這樣的問題需要進(jìn)行大規(guī)模語言統(tǒng)計調(diào)查才能回答,然而,在互聯(lián)網(wǎng)海量用戶生成內(nèi)容的支持下,我能輕而易舉地找出答案。
我真的做了這個工作(基于另一段日期內(nèi)的數(shù)據(jù))。男性愛說的詞有:
兄弟、籃球、男籃、米蘭、曼聯(lián)、足球、皇馬、比賽、國足、超級杯、球迷、中國、老婆、政府、航母、踢球、賽季、股市……
下面則是女性愛說的詞:
一起玩、蛋糕、加好友、老公、嗚嗚、姐姐、嘻嘻、老虎、討厭、媽媽、嗚嗚嗚、啦啦啦、便宜、減肥、男朋友、逛街、無限、帥哥、禮物……
還有90后用戶愛用的詞:
加好友、作業(yè)、各種、乖乖、蛋糕、來訪、聚會、補課、歡樂、刷屏、錄取、無限、互相、速度、一起玩、啦啦啦、晚安、求陪同、查分、上課、果斷、腫么辦……
80后用戶愛用的詞:
加班、培訓(xùn)、周末、工作、公司、各位、值班、砸蛋、上班、任務(wù)、公務(wù)員、工資、領(lǐng)導(dǎo)、包包、辦公室、校內(nèi)、時尚、企業(yè)、招聘、順利、朋友……
不僅如此,不少狀態(tài)還帶有地理位置信息,因而我可以站在空間的維度對信息進(jìn)行觀察。借助這些包含地理位置的簽到信息,我又挖掘出很多有意思的結(jié)果來。對北京用戶的抽詞結(jié)果非常有趣:“考試”一詞集中分布在海淀眾高校區(qū),“天津”一詞集中出現(xiàn)在北京南站,“逛街”一詞則全都在西單附近扎堆。北京首都國際機場也是一個非常特別的地點,“北京”、“登機”、“終于”、“再見”等詞在這里出現(xiàn)的密度極高。
從全國范圍來看,不同區(qū)域的人也有明顯的用詞區(qū)別。例如在節(jié)假日的時候,“滑雪”一詞主要在北方出現(xiàn),“登山”一詞則主要在南方出現(xiàn)。地方特色也是造成詞語分布差異的一大原因,例如“三里屯”一詞幾乎只在北京出現(xiàn),“熱干面”一詞集中出現(xiàn)在武漢地區(qū)。另外,方言也會導(dǎo)致用詞分布差異,例如“咋這么”主要分布在北方地區(qū),“搞不懂”主要分布在南方城市,“伐”則集中地出現(xiàn)在上海地區(qū)。當(dāng)數(shù)據(jù)規(guī)模足夠大時,或許我們能通過計算的方法,自動對中國的方言區(qū)進(jìn)行劃分。
其實,不僅僅是發(fā)布時間、用戶年齡、用戶性別、地理位置這四個維度,按照上述方法,還可以對瀏覽器、用戶職業(yè)、用戶活躍度、用戶行為偏好等各種各樣的維度進(jìn)行分析,在某個特定范圍內(nèi)挖掘熱點事件,或者根據(jù)語言習(xí)慣去尋找出某個特定的人群?;蛟S這聽上去太過理想化,不過我堅信,有了合適的算法,這些想法終究會被一一實現(xiàn)。
責(zé)任編輯:曹曉晨