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