跨專業(yè)自學(xué)NLP,這個(gè)90后擼出了開源類庫HanLP,已在GitHub收獲1.5W星
截止 2019 年 10 月底,一款名為 HanLP 的自然語言處理類庫在 GitHub Star 數(shù)達(dá)到了 15.5 K,超過了賓夕法尼亞大學(xué)的 NLTK、斯坦福大學(xué)的 CoreNLP、哈爾濱工業(yè)大學(xué)的 LTP。這是一款由一系列模型與算法組成的自然語言處理(NLP)開發(fā)工具包。
你或許想象不到,這款 NLP 工具包被開發(fā)出來時(shí),它的作者何晗,還是一位日語專業(yè)的大二學(xué)生。如今,在攻讀博士期間,何晗又創(chuàng)作了一本《自然語言處理入門》,希望解決小白們的 NLP 入門難題。該書得到了周明、劉群、王斌等業(yè)內(nèi)頂級(jí) NLP 專家的推薦。
“理論是根,項(xiàng)目是樹“,如果說 HanLP 是樹,那么這本《自然語言處理入門》便是樹的根基。在該書問世之際,AI 前線與何晗展開對(duì)話,了解這位極具天賦的學(xué)生“種植樹”,“培育根”的故事。
癡迷游戲走上編程之路
和很多90后一樣,何晗愛好動(dòng)漫和游戲。這兩個(gè)愛好后來也深深影響了他最為關(guān)鍵的兩次重大人生抉擇。
高中時(shí),何晗就讀于黃岡中學(xué)理科“狀元班”,班上學(xué)霸云集,但何晗覺得自己和那些學(xué)霸同學(xué)比差遠(yuǎn)了。“我肯定不是學(xué)霸,我屬于那種均值 80 分,方差特別大的類型”。
他笑稱自小不喜歡聽講,要不就自己看書做題,要不就坐在座位上神游。有幾次考試,他超常發(fā)揮進(jìn)入了“狀元班”。不過,最為關(guān)鍵的高考,他卻考得并不理想。
這次高考失利讓何晗決定“放飛自我”,選一個(gè)自己喜歡的專業(yè)。因?yàn)橄矚g動(dòng)漫,在志愿填報(bào)時(shí)他選了日語專業(yè)。2011 年,何晗成為上海外國語大學(xué)日語系的一名學(xué)生。他的業(yè)余時(shí)間也幾乎都被追新番、背單詞、宅著打游戲填滿。
打游戲是何晗走上編程之路的原始動(dòng)力,他挺想自己做一個(gè)游戲出來。曾經(jīng)有一段時(shí)間,何晗癡迷打“仙劍四”,他想把劍四的“mod”給做出來。
也是從那時(shí)候起,何晗開始嘗試學(xué)習(xí)各種編程知識(shí):C++、Windows 編程、3D 編程、匯編逆向、PHP、JavaScript、Linux。對(duì)于一個(gè)非科班出身的人來說,自學(xué)之路免不了遇到困難。何晗坦言,最大的困難是沒有機(jī)會(huì)系統(tǒng)性學(xué)習(xí)操作系統(tǒng)、編譯原理等專業(yè)課程。他倒是有一個(gè)很實(shí)用的學(xué)習(xí)方法 — debug。
何晗的 debug 能力很強(qiáng),“不管是什么算法誰的代碼,我都能一行行 debug 下來。每次我寫的算法不對(duì)的時(shí)候,我都會(huì)創(chuàng)造相同的輸入數(shù)據(jù),開兩個(gè) debugger 窗口,一個(gè)跑我的,一個(gè)跑別人的。我的知識(shí)大部分來源于調(diào)試別人的代碼,可以說是‘偷師’自所有人”。
最令何晗印象深刻的是,他自學(xué)編程途中達(dá)成的一個(gè)小成就。當(dāng)時(shí)上外的校園網(wǎng)僅支持網(wǎng)頁版登錄,打開較慢、登錄時(shí)也無法記住密碼,很不方便。為了解決這個(gè)問題,何晗花了一個(gè)勞動(dòng)節(jié)假期做出了一個(gè)自動(dòng)登錄軟件?,F(xiàn)在回想起來,何晗坦言這個(gè)軟件還有很多不足,但同學(xué)們用的很開心。
這個(gè)小成就還讓何晗收獲了一個(gè)意外之喜。學(xué)校網(wǎng)絡(luò)技術(shù)中心的張老師聽說了這事后對(duì)他很是贊賞,便贈(zèng)送給他一個(gè)校園網(wǎng) VIP,還給他介紹了一家外包公司——林原科技的兼職。
大二開發(fā)出 NLP 類庫
也正是這份兼職工作,讓何晗與自然語言處理(NLP)結(jié)下了不解之緣,后者也是他目前攻讀博士期間的研究方向。
一日,林原科技立項(xiàng)做一個(gè) “智能檢索系統(tǒng)”。中文搜索引擎的第一步是分詞,老板分配給何晗一個(gè)任務(wù)——做一個(gè)分詞器,并給了他幾本厚厚的學(xué)習(xí)資料。
老實(shí)說,這是何晗第一次接觸 NLP,顯然做出這個(gè)分詞器得需要“現(xiàn)學(xué)現(xiàn)賣”了。他倒頗有幾分自信,“我應(yīng)該能拿下”,“要么不做,要做就要做最好的“。
經(jīng)過調(diào)研,何晗發(fā)現(xiàn),市面上的開源工具 Jieba、Ansj、IK 等分詞效果都不太理想,很多人名、機(jī)構(gòu)名別稱分不出來,新詞隔三差五就更新卻收錄不進(jìn)去,分詞速度也很慢.... 他當(dāng)即決定,一定要做出一個(gè)體驗(yàn)效果好的分詞器。
緊接著,何晗開始了一邊“泡”在專業(yè)書和論文里自學(xué)一邊開發(fā)的過程。張華平、劉群等 NLP 領(lǐng)域?qū)<业恼撐膸缀醵急凰藗€(gè)遍,被一些深?yuàn)W概念繞的云里霧里那自是家常便飯。對(duì)何晗影響最大的是呂震宇開源的 C# 版的 ICTCLAS 分詞系統(tǒng),他邊學(xué) C# 邊對(duì)照著呂震宇的博文研讀這才搞懂了 ICTCLAS 分詞原理。何晗嘗試著在 ICTCLAS 的基礎(chǔ)上做了一些改進(jìn),并且實(shí)現(xiàn)了 Java 版,這個(gè)版本運(yùn)行速度很慢,好在輸出的結(jié)果跟 ICTCLAS 是一致的。
弄懂了 ICTCLAS 之后,何晗又開始學(xué)習(xí)單步 Ansj,Ansj 的數(shù)據(jù)結(jié)構(gòu)——雙數(shù)組字典樹速度之快對(duì)他來說像打開了新世界的大門。于是他便饒有興趣地開始研究數(shù)據(jù)結(jié)構(gòu),最后他自己創(chuàng)造出了一個(gè)“基于雙數(shù)組字典樹的 AC 自動(dòng)機(jī)”的數(shù)據(jù)結(jié)構(gòu)。
功夫不負(fù)有心人,花了半年時(shí)間,何晗最終還是將這個(gè)分詞器做了出來,并取名“HanLP”。這對(duì)于一個(gè)大二日語專業(yè)學(xué)生來說,是極為難得的。何晗用上了自研的基于雙數(shù)組字典樹的 AC 自動(dòng)機(jī),這大大提升了 HanLP 的運(yùn)行速度。
第一版本的 HanLP 功能比較簡單,后續(xù)經(jīng)過幾年的迭代,其功能越來越完善,性能更高效。HanLP 能提供詞法分析、句法分析、文本分類、情感分析等功能。此外,HanLP 還具有精度高、速度快、內(nèi)存省的特點(diǎn)。
截止目前,HanLP 的 GitHub Star 數(shù)已達(dá) 15.5 K,超過了賓夕法尼亞大學(xué)的 NLTK、斯坦福大學(xué)的 CoreNLP、哈爾濱工業(yè)大學(xué)的 LTP。
對(duì)于這個(gè)成績,何晗很開心,他感激廣大用戶的認(rèn)可。“從開發(fā)者的角度講,我肯定是不及教授們的萬分之一,無論是水平上還是人數(shù)上”,何晗表示,相對(duì)于上述面向教學(xué)和學(xué)術(shù)用途的項(xiàng)目,HanLP 是個(gè)人項(xiàng)目,主要面向生產(chǎn)環(huán)境開發(fā),由于目的用途不同,HanLP 取勝的“法寶”在于良好的用戶體驗(yàn),在接口設(shè)計(jì)、代碼風(fēng)格等“軟實(shí)力”方面比較人性化。
博士出書
HanLP 的意外成功讓何晗對(duì) NLP 有了更深入的了解,在開發(fā)這個(gè)項(xiàng)目的過程中,通過對(duì)領(lǐng)域內(nèi)專業(yè)知識(shí)的學(xué)習(xí),他領(lǐng)略到了 NLP 這門學(xué)科的魅力,在隨后的學(xué)習(xí)生涯中,他便鎖定 NLP 為主要的研究方向。目前何晗在埃默里大學(xué)讀計(jì)算機(jī)博士,主要的研究方向是句法分析、語義分析與問答系統(tǒng)。
從 v1.3 版本起,HanLP 由大快搜索主導(dǎo)開發(fā),并完全開源(GitHub 開源地址:https://github.com/hankcs/HanLP)。2018 年 11 月,HanLP 更新到了 1.7 版本,新增文本聚類,流水線分詞等功能,這時(shí) HanLP 的中文詞法分析已比較成熟,達(dá)到了工業(yè)使用的水準(zhǔn)。
現(xiàn)在,何晗仍在負(fù)責(zé) GitHub 上 HanLP 的維護(hù)工作。HanLP 令何晗收獲了一眾粉絲,他們常常來找何晗咨詢一些 NLP 專業(yè)相關(guān)的問題,時(shí)間長了,問題越積越多,何晗試圖幫助一些初級(jí)用戶找一些入門資料,卻遺憾找不到特別對(duì)口的。適逢出版社的編輯找他約稿,何晗索性決定,干脆自己寫一本入門資料。
在這樣的背景下,這本《自然語言處理入門》的定位很快明確下來:普通人入門時(shí)看的第一本 NLP 書,小白也能看懂的工具書。何晗還希望該書能為讀者指明下一步的方向,因此在入門內(nèi)容的基礎(chǔ)上,他加上了一些挑戰(zhàn)章節(jié)。
2019 年 10 月,歷時(shí) 1 年創(chuàng)作、十幾遍校對(duì),《自然語言處理入門》正式出版,該書還得到了周明、劉群、王斌等業(yè)內(nèi)頂級(jí) NLP 專家的推薦。
“理論是根,項(xiàng)目是樹“,如果說 HanLP 是樹,那么這本《自然語言處理入門》便是樹的根基。
與創(chuàng)作 HanLP 時(shí)期相比,何晗已經(jīng)從小白蛻變成了領(lǐng)域?qū)<?,不變的地方在于,何晗仍?ldquo;工程與理論相結(jié)合”作為創(chuàng)作的核心理念,他試圖在目前市面上艱深晦澀的教科書和簡單的入門書之間作出平衡。何晗以自己的開源項(xiàng)目為案例,代碼對(duì)照公式講解每一個(gè)算法每一個(gè)模型,希望讓讀者知其然并且知其所以。
NLP 現(xiàn)在最大的問題是難以表示世界知識(shí)
采訪中,何晗對(duì)于 NLP 及句法分析、語義分析、問答系統(tǒng)目前的發(fā)展現(xiàn)狀和發(fā)展趨勢(shì)分享了自己的精彩觀點(diǎn)。
Transformer 大家族狂歡的一年
何晗表示,今年是以 BERT 為首的 Transformer 大家族狂歡的一年,自從發(fā)現(xiàn)在大規(guī)模無標(biāo)注語料上訓(xùn)練的 Transformer 語言模型可以編碼很多知識(shí)后,各項(xiàng)任務(wù)包括對(duì)話系統(tǒng)都在研究怎么接入 Transformer。這些研究令人振奮,在另一層意義上也有些單調(diào)無聊。雖然從結(jié)果上來看效果的確提升了許多,但模型的可解釋性還不夠。誰都知道知識(shí)肯定編碼進(jìn)去了,但究竟是如何編碼、為什么能編碼、如何精簡參數(shù)等等,還在研究當(dāng)中。
英文句法分析摸到了天花板
句法分析和語義分析都可以歸結(jié)為為每個(gè)單詞找被修飾詞,然后標(biāo)注它們的關(guān)系。針對(duì)這種類型的任務(wù),BiAffine 是比較前沿的做法。它屬于基于圖的算法家族,天然適合并行化,在 GPU 下速度很快。此后還涌現(xiàn)了許多“改進(jìn)”研究,大致朝著高階建模的方向走。不過,何晗認(rèn)為,英文句法分析基本摸到了天花板,中文句法分析可能不是差在模型而是差在高質(zhì)量大規(guī)模樹庫上。
至于語義依存分析,與句法分析模型一樣,只不過語料庫的建設(shè)比其滯后。同屬語義分析家族的另幾項(xiàng)任務(wù),問句轉(zhuǎn) SQL、抽象語義表示則稍微平凡一些,基本上都是 Seq2Seq 的變種。對(duì)于上述的所有任務(wù),如何有效地將問題表示為向量才是核心問題。這時(shí)候,又輪到 Transformer 霸榜了。
未來機(jī)器學(xué)習(xí)工程師崗位會(huì)減少
談到 NLP 現(xiàn)在發(fā)展中的挑戰(zhàn),何晗表示,NLP 現(xiàn)在最大的問題是難以表示世界知識(shí),舉個(gè)例子,每個(gè)人都有一套對(duì)物理世界的認(rèn)識(shí),但計(jì)算機(jī)只有一些符號(hào)語料。“人們都說百聞不如一見,目前的 NLP 系統(tǒng)別說見了(機(jī)器視覺),連聞都很少聞(語音處理)”。
但就學(xué)界的前沿動(dòng)態(tài)而言,在模型結(jié)構(gòu)的探索上 AutoML(自動(dòng)設(shè)計(jì)神經(jīng)網(wǎng)絡(luò)),以及在知識(shí)工程上的自動(dòng)構(gòu)建知識(shí)圖譜, 都是未來可預(yù)見的發(fā)展趨勢(shì)。
就工業(yè)界而言,未來機(jī)器學(xué)習(xí)工程師的崗位反而會(huì)減少,因?yàn)樯窠?jīng)網(wǎng)絡(luò)可以自行設(shè)計(jì)神經(jīng)網(wǎng)絡(luò), 就不需要這么多工程師手動(dòng)設(shè)計(jì)了。到時(shí)候,軟件開發(fā)將進(jìn)入 2.0 時(shí)代,不用再寫代碼,而是標(biāo)注數(shù)據(jù)。標(biāo)注數(shù)據(jù)丟給神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)模型,模型的結(jié)構(gòu)也是神經(jīng)網(wǎng)絡(luò)自動(dòng)探索出來的,這個(gè)模型用來解決實(shí)際問題。軟件工程師不需要寫一行代碼,或者說,他們標(biāo)注的數(shù)據(jù)就是他們的代碼。神經(jīng)網(wǎng)絡(luò)是他們的編譯器,訓(xùn)練出來的神經(jīng)網(wǎng)絡(luò)是他們編譯后的程序。正如編譯器可以編譯編譯器一樣,神經(jīng)網(wǎng)絡(luò)也可以訓(xùn)練神經(jīng)網(wǎng)絡(luò)。這就是未來最有潛力的技術(shù)。
寫在最后
現(xiàn)在讀到博士了,何晗的生活依舊簡單,除了日常學(xué)習(xí),他最愛的還是動(dòng)漫和游戲。
維護(hù) HanLP 之外,何晗還業(yè)余經(jīng)營著一個(gè)名為“碼農(nóng)場”的博客,用于自己的課程筆記分享。由于太忙,這幾年“碼農(nóng)場”的更新頻率已經(jīng)降到了以“年”為單位,不過,日常仍有數(shù)千粉絲來這里翻閱資料。
從該博客的一隅,或許可以一窺何晗的另一面。
在“碼農(nóng)場”的資料介紹處,何晗稱自己是一個(gè)算法初心者。大二時(shí)兼職開發(fā) HanLP,何晗常常一個(gè)人坐在教室忙活,同學(xué)們完全不知道在干什么,“大部分女同學(xué)認(rèn)為我就是個(gè)碼農(nóng),修電腦的那種;有的男同學(xué)覺得我很 low,有的覺得我很酷“,何晗從來不解釋,他覺得做自己就好了。
他亦是一位算法堅(jiān)守者,從兼職接觸到如今鎖定研究方向,他一直在自己喜歡的領(lǐng)域保持專注。采訪最后,何晗告訴我們,畢業(yè)后,他會(huì)選擇繼續(xù)扎根學(xué)術(shù)。