張貝貝
完全開源、自主研發(fā)、精度高、速度快、內(nèi)存省……如果將這些關(guān)鍵詞都集合在HanLP上會(huì)產(chǎn)生什么?
2014年,還在攻讀日語本科的大快搜索高級(jí)研究員何晗一定沒想到,機(jī)緣巧合研發(fā)的一款中文分詞器,在隨后幾年中幾經(jīng)迭代,并在商用市場大放光彩。
而看似是“無心插柳柳成蔭”的事情,卻凝聚著何晗對(duì)HanLP工匠式的錘煉。
據(jù)介紹,HanLP是由一系列模型與算法組成的工具包,目標(biāo)是普及自然語言處理(NLP)在生產(chǎn)環(huán)境中的應(yīng)用。HanLP具備功能完善、性能高效、架構(gòu)清晰、語料時(shí)新、可自定義的特點(diǎn);能提供詞法分析(中文分詞、詞性標(biāo)注、命名實(shí)體識(shí)別)、句法分析、文本分類和情感分析等功能。目前,HanLP已經(jīng)被廣泛用于Lucene、Solr、ElasticSearch、Hadoop、Android、Resin等平臺(tái),有大量開源作者開發(fā)各種插件與拓展,并且被包裝或移植到Python、C#、R、JavaScript等語言上去。
精誠所至 金石為開
談及HanLP的開發(fā)過程,何晗回憶道,“那時(shí)我還在讀本科,當(dāng)時(shí)在上海某科技公司兼職實(shí)習(xí),公司想做全文檢索系統(tǒng),所以需要一款中文分詞器。我考察到市面上的開源工具要么來自學(xué)術(shù)界,不太重視運(yùn)行性能,要么來自工業(yè)界,不太重視算法準(zhǔn)確率,于是我想做一款平衡速度和精度的分詞器?!?/p>
不過萬事開頭難,何況對(duì)于非計(jì)算機(jī)專業(yè)的何晗來說,一切充滿著未知。因此,不可避免地遇到了許多難題。比如,相關(guān)論文中的術(shù)語從未接觸過、公式看不懂、別人的代碼沒有注釋之類。后來何晗自學(xué)了許多自然語言處理與機(jī)器學(xué)習(xí)的著作與課件,把能找到的開源代碼都研究了一遍,總算是窺得一些門道。
據(jù)何晗介紹,HanLP第一個(gè)版本效率不高,后來大量采用雙數(shù)組trie樹和AC自動(dòng)機(jī)進(jìn)行優(yōu)化,甚至提出了結(jié)合兩種算法實(shí)現(xiàn)一個(gè)新數(shù)據(jù)結(jié)構(gòu),最終把效率做到了極致。在易用性方面,一直堅(jiān)持“明文至上”的原則,許多模型都儲(chǔ)存為txt格式,在懂機(jī)器學(xué)習(xí)的人看來這是模型,在“小白”用戶看來這是詞典,大家能用得明白。
隨著HanLP的基本成型,何晗也扣動(dòng)了自主創(chuàng)新的大門。因?yàn)镠anLP內(nèi)部的算法都是自主研發(fā)的,不依賴第三方類庫,這樣的好處是可以控制產(chǎn)品的所有細(xì)節(jié)。在大快搜索商用期間,HanLP又實(shí)現(xiàn)了更多模塊,版本迅速迭代到1.6。
一觸即發(fā) 全線跟進(jìn)
如何形容HanLP的快速發(fā)展?從數(shù)據(jù)上來看,根據(jù)GitHub統(tǒng)計(jì),HanLP是全球用戶量最大的自然語言處理工具包。而從演進(jìn)的過程來看,何晗給出了這樣的總結(jié),“HanLP從單純的分詞器發(fā)展到目前功能較為完善的NLP工具包,是一個(gè)單點(diǎn)突破、全線跟進(jìn)的模式?!?/p>
眾所周知,分詞只是NLP的第一步,第一步涉及許多機(jī)器學(xué)習(xí)算法,將這些機(jī)器學(xué)習(xí)算法吃透了,其他功能都是這些機(jī)器學(xué)習(xí)算法的應(yīng)用層,可以說是手到擒來。
何晗進(jìn)一步談到,當(dāng)代的技術(shù)潮流是所謂的深度學(xué)習(xí),相較于深度學(xué)習(xí),HanLP目前主要由手工實(shí)現(xiàn)的傳統(tǒng)機(jī)器學(xué)習(xí)方法驅(qū)動(dòng),優(yōu)勢是適用于計(jì)算資源匱乏的場景,比如移動(dòng)設(shè)備和VPS。但在2.0版本之后,HanLP將全線切換到深度學(xué)習(xí)驅(qū)動(dòng),并且主要開發(fā)語言將切換到Python?!爱吘惯@是時(shí)代的大勢所趨,另外NLP本來就是一種較高層次的技術(shù),當(dāng)語料庫和數(shù)據(jù)量增大時(shí),對(duì)計(jì)算力或說顯卡的需求增長也是必然的。”
現(xiàn)在HanLP由大快搜索公司主導(dǎo)開發(fā),普及了許多常用NLP技術(shù)在生產(chǎn)環(huán)境中的運(yùn)用,普及了語料庫、雙數(shù)組trie樹、感知機(jī)等大量概念或技術(shù)的運(yùn)用。代碼完全開源,目前在開源社區(qū)的用戶量第一,在GitHub上的收藏?cái)?shù)量達(dá)到8000,遠(yuǎn)超過其他同類型的知名工具,如斯坦福的CoreNLP、NLTK和哈爾濱工業(yè)大學(xué)的LTP等。
此外,在NLP領(lǐng)域,HanLP采取算法與語料庫分離的模式,耗費(fèi)人力成本的語料庫則形成了一種新的商業(yè)模式。針對(duì)不同的行業(yè)領(lǐng)域,客戶委托公司加工行業(yè)語料庫,使用HanLP在行業(yè)語料庫上訓(xùn)練模型,于是在該行業(yè)文本上的準(zhǔn)確率大幅提升。隨著公司積累語料庫越多,HanLP能適應(yīng)的領(lǐng)域也越多,勢必會(huì)形成一個(gè)有效的正反饋循環(huán)。
走出國門 擁抱世界
HanLP命名中的Han指的是漢語的漢,它從誕生開始就是面向中文處理而開發(fā)的。用HanLP處理包含簡體在內(nèi)的多種漢語言非常方便,這種漢語的復(fù)雜程度是外國人無法理解的。大快搜索公司內(nèi)部積累標(biāo)注的海量語料庫為HanLP的領(lǐng)域拓展提供了數(shù)據(jù)上的驅(qū)動(dòng)力,使得HanLP還可以應(yīng)用于微博等社交網(wǎng)絡(luò)上的不規(guī)范文本。不僅限于中文,通過提供其他語種的語料庫,HanLP同樣可以支持任何語言。在2.0版本,HanLP將提供其他語種的模型,走出國門,擁抱世界。
可以說,HanLP是中國的,也是世界的。它具備的競爭力足以讓這款技術(shù)產(chǎn)品的開發(fā)者有足夠的信心。HanLP目前的核心優(yōu)勢主要是性能和精度的平衡以及大規(guī)模語料庫。不同于市面上的競爭產(chǎn)品,HanLP內(nèi)部的數(shù)據(jù)結(jié)構(gòu)經(jīng)過精心優(yōu)化,分析速度達(dá)到數(shù)千萬字每秒,而內(nèi)存占用控制在100MB左右,這使得HanLP實(shí)用于包含移動(dòng)設(shè)備在內(nèi)的幾乎所有場景。此外,值得強(qiáng)調(diào)的是,HanLP代碼完全開源,功能由一個(gè)jar包提供,在本地運(yùn)行不訪問云,用戶的隱私數(shù)據(jù)得到了保障。
如果用戶需要處理不通用的領(lǐng)域行業(yè)文本,還可以通過標(biāo)注行業(yè)語料庫訓(xùn)練行業(yè)模型的方法進(jìn)行拓展,設(shè)計(jì)上比那些商業(yè)產(chǎn)品更靈活。
談到商業(yè)市場的應(yīng)用,HanLP如何與具體業(yè)務(wù)結(jié)合發(fā)揮應(yīng)用的價(jià)值呢?對(duì)此,何晗談道,在搜索領(lǐng)域,可以利用插件與Lucene、Solr和ES等常見搜索引擎結(jié)合。在大數(shù)據(jù)領(lǐng)域,可以輕松集成到Hadoop中。在數(shù)據(jù)科學(xué)領(lǐng)域,HanLP還提供了Python語言接口pyhanlp。
敢問路在何方
從創(chuàng)新性上來看,HanLP無疑是走在了前面。作為首個(gè)面向生產(chǎn)環(huán)境的自然語言處理工具包,不依賴第三方庫,全部算法自主編寫。獨(dú)特的IO緩存機(jī)制,啟動(dòng)時(shí)間控制在毫秒級(jí),基于Aho Corasick自動(dòng)機(jī)的雙數(shù)組trie樹將分析速度提升到千萬字符每秒。特殊的特征裁剪算法,可以顯著降低模型的內(nèi)存占用、提升運(yùn)行效率。面向機(jī)器學(xué)習(xí)的API設(shè)計(jì),所有模塊提供訓(xùn)練接口,顯著區(qū)別于商業(yè)軟件。
未來看,HanLP的發(fā)展方向在技術(shù)上是邁向深度學(xué)習(xí),在語言上是切換到Python。因?yàn)槟壳白罹珳?zhǔn)的機(jī)器學(xué)習(xí)框架就是深度學(xué)習(xí),自然語言處理也不例外。另外,在發(fā)達(dá)國家,Python用戶數(shù)量已經(jīng)超過了Java,北美學(xué)校已經(jīng)廣泛采用Python教授數(shù)據(jù)科學(xué)相關(guān)課程。
當(dāng)然,HanLP未來的路還有很長,需要何晗繼續(xù)秉承精益求精的精神不斷錘煉,需要大快搜索主導(dǎo)的研發(fā)和應(yīng)用更上一層樓。但何晗更希望,整個(gè)IT市場,應(yīng)該多鼓勵(lì)自主研發(fā)的核心技術(shù),少包裝集成。多招用數(shù)學(xué)功底好、肯鉆研的技術(shù)工程師,少招急功近利的程序員。
也許正是這樣的家國情懷和工匠精神才讓何晗和他所研發(fā)的HanLP如此有魅力。
采訪實(shí)錄
Q:中國大數(shù)據(jù)產(chǎn)業(yè)生態(tài)聯(lián)盟、《軟件和集成電路》雜志社
A: 大快搜索高級(jí)研究員何晗
Q:如何更加深刻而形象地理解自然語言處理?
A:事實(shí)上自然語言處理是基于機(jī)器學(xué)習(xí)技術(shù)的應(yīng)用層,而機(jī)器學(xué)習(xí)是人教機(jī)器去做一些智能的事情。這個(gè)時(shí)候人就必須得提供給機(jī)器一些習(xí)題集,相當(dāng)于提供給它一些數(shù)據(jù),這些數(shù)據(jù)是人工給它標(biāo)注好的。所謂的標(biāo)注就是你把這些數(shù)據(jù)正確的答案,附在后面。把整個(gè)數(shù)據(jù)、答案作為習(xí)題集教給機(jī)器,機(jī)器學(xué)習(xí)就會(huì)做一下題,然后對(duì)一下答案。如果你沒有給它答案的話,那個(gè)機(jī)器它只做題,它不知道正確答案是什么。把數(shù)據(jù)的答案人工地找出來,或者人工地標(biāo)上去就叫做標(biāo)注。那么在自然語言處理里面,我們就希望把一些文本要素標(biāo)注出來,比如說一句話正確的單詞序列、一些單詞的正確詞性,或者一段文本里面涉及的公司名稱、人名、地名有哪些等都得標(biāo)好。機(jī)器學(xué)習(xí)完得到的模型就相當(dāng)于一個(gè)知識(shí)庫。有了這個(gè)知識(shí)庫之后,機(jī)器就可以對(duì)于未知的、而不限于你已經(jīng)給它的文檔進(jìn)行分析。
如果更加形象的來說,就相當(dāng)于你有一個(gè)孩子,你給他準(zhǔn)備了一些題目和一些參考答案,你把完整的這個(gè)習(xí)題集給他。他做完之后,他就可以參加考試了,但考試的那些題目并不一定就是習(xí)題集里面有的,它可以有未知的,然后你的孩子也可以智能地去做這些題目。
這是一個(gè)比較重要的概念,很多人誤以為大數(shù)據(jù)就是我生產(chǎn)系統(tǒng)里面積累了很多歷史的數(shù)據(jù),然后機(jī)器馬上就可以智能的去處理了。實(shí)際上并不是,你必須有一個(gè)人工標(biāo)注的過程,你只給孩子做題,不給他參考答案,你的孩子是永遠(yuǎn)學(xué)習(xí)不好的。
Q:大快搜索在人工標(biāo)注方面做了哪些嘗試和努力?
A:人工標(biāo)注是一個(gè)很重要的環(huán)節(jié),大快搜索也投入了非常多的精力在做人工標(biāo)注的配套系統(tǒng)。目前,我們已經(jīng)做出來一種產(chǎn)品,就是有一個(gè)友好的web界面,里面會(huì)存放一些沒有標(biāo)注的文檔,我們會(huì)請一些專業(yè)的標(biāo)注員,利用計(jì)算機(jī)就可以輕松地把這些文本標(biāo)注成機(jī)器可以理解的形式,然后再把這些標(biāo)注好的文檔教給機(jī)器學(xué)習(xí)??梢哉f,人工標(biāo)注得越多,自然語言處理的精度就會(huì)越高,由此也逐漸形成了一種產(chǎn)業(yè)模式。
Q:HanLP2.0具體的特點(diǎn)和轉(zhuǎn)變有哪些?
A:HanLP2.0的第一個(gè)明顯的特點(diǎn)是從底層算法的一種轉(zhuǎn)變,即從傳統(tǒng)的機(jī)器學(xué)習(xí)到深度學(xué)習(xí)、到神經(jīng)網(wǎng)絡(luò)深度學(xué)習(xí)的一個(gè)轉(zhuǎn)變。第二個(gè)特征是編程語言上面的轉(zhuǎn)變,現(xiàn)在的版本是用Java來做的,但是事實(shí)上Java在數(shù)據(jù)科學(xué)這個(gè)領(lǐng)域上面是稍微有一些落后的。北美的很多大學(xué),在教數(shù)據(jù)挖掘、數(shù)據(jù)專業(yè)的時(shí)候并不會(huì)用Java來教,而是用Python來教。像深度學(xué)習(xí)的領(lǐng)域也是被Python這門語言壟斷了,所以說到HanLP2.0的時(shí)候,HanLP會(huì)主要用Python來實(shí)現(xiàn),同時(shí)提供其他編程語言的API接口,這是第二個(gè)非常不同的地方。第三個(gè)特點(diǎn)涉及語種的問題,HanLP目前的版本是只從漢語這一語種出發(fā),是有一些局限性的,事實(shí)上HanLP用的技術(shù),完全是可以用于其他任何語種的。所以在2.0的時(shí)候,HanLP會(huì)把這個(gè)語種做成一種配置,相當(dāng)于你給我什么語種的習(xí)題集,HanLP就能處理什么語種。目前看,至少會(huì)有這三個(gè)最核心的特點(diǎn)和變化。
Q:如何看待當(dāng)前人工智能的發(fā)展?
A:個(gè)人認(rèn)為,現(xiàn)在大眾理解的人工智能的發(fā)展離實(shí)際情況太遙遠(yuǎn)了,或者說可能是很久之后的人工智能的發(fā)展?fàn)顟B(tài)?,F(xiàn)在的這個(gè)人工智能的狀態(tài),就是人們用一些經(jīng)驗(yàn)數(shù)據(jù),一些標(biāo)注好的數(shù)據(jù)去教機(jī)器,而不是機(jī)器從概念上理解數(shù)據(jù)的本質(zhì),那個(gè)太遙遠(yuǎn),像科幻一樣,不是本世紀(jì)關(guān)注的事情。
因此,目前人工智能的市場會(huì)有一些泡沫在里面,一些非專業(yè)媒體或普通的傳統(tǒng)行業(yè)客戶對(duì)當(dāng)前的形勢估計(jì)過于樂觀。無論是從學(xué)術(shù)研究還是實(shí)際的發(fā)展情況來看,當(dāng)前人工智能的發(fā)展是遠(yuǎn)遠(yuǎn)低于大眾的預(yù)期的,有大量的學(xué)者和研究者都在很嚴(yán)肅地對(duì)待這個(gè)問題。也就是說整體還處于弱人工智能狀態(tài)。
行業(yè)應(yīng)用案例
案例名稱:某市刑偵語義搜索系統(tǒng)
核心特點(diǎn):
自動(dòng)分析警情要素
自動(dòng)分析警情要素是指輸入非結(jié)構(gòu)化的報(bào)警記錄時(shí),系統(tǒng)能夠自動(dòng)提取出“何時(shí)(時(shí)間)、何地(地點(diǎn))、何事(事情)、何物(作案工具)、何情(作案情形)、何故(動(dòng)機(jī)目的)、何人(嫌疑人)”7種要素。并利用我們開發(fā)的標(biāo)注系統(tǒng),將這些要素視作命名實(shí)體,訓(xùn)練統(tǒng)計(jì)模型。在標(biāo)注的過程中增量地訓(xùn)練模型,降低標(biāo)注成本的同時(shí),提高了分析識(shí)別的準(zhǔn)確率。將大量的、枯燥的文字記錄分析工作交給機(jī)器,將警務(wù)人員從傳統(tǒng)的記錄篩選任務(wù)中解脫出來,系統(tǒng)自動(dòng)探測跟蹤并觸發(fā)報(bào)警,警務(wù)人員只需要進(jìn)行記錄查看,確認(rèn)警情并聯(lián)絡(luò)相關(guān)部門采取措施。
智能判斷出警建議
系統(tǒng)通過文本分類技術(shù)進(jìn)行警情預(yù)分析,首先完成對(duì)案件的性質(zhì)判斷,并將其歸檔到數(shù)據(jù)庫。系統(tǒng)通過詞頻特征選擇進(jìn)行分類,結(jié)合詞條在分類內(nèi)部出現(xiàn)的概率和類別內(nèi)部文檔中出現(xiàn)概率,以一種詞分布均衡度評(píng)價(jià)特征詞選擇方法,作為信息抽取的基礎(chǔ)和關(guān)鍵步驟。再根據(jù)數(shù)據(jù)庫中的歷史接警級(jí)別,以及用戶設(shè)置的出警規(guī)則,提供相應(yīng)預(yù)判。通過對(duì)模型的不斷優(yōu)化調(diào)整,得到最優(yōu)的預(yù)測模型,實(shí)現(xiàn)了對(duì)每種警情的準(zhǔn)確判斷與智能建議。
警情結(jié)果可視化展示
將歷史警情匯總并分門別類地可視化展示,提供包括時(shí)間、地域、類別、等級(jí)等全方位的檢索接口,便于工作人員直觀地獲取歷史信息,從而有針對(duì)性地布置警力。
應(yīng)用解讀:
刑事案件數(shù)據(jù)主要由辦案過程中積累下來各類案件、涉案人員等信息以及報(bào)警信息組成,這些信息由于數(shù)據(jù)采集來自不同的設(shè)備、數(shù)據(jù)的發(fā)布或維護(hù)機(jī)構(gòu)不同、存儲(chǔ)介質(zhì)多樣,造成數(shù)據(jù)類型不一、模式復(fù)雜多變、組織混亂、重復(fù)等特點(diǎn),使得在刑偵案件偵破過程中,信息獲取過程繁瑣,難以適應(yīng)高速緊張的工作需要。如何利用有限的精力,迅速完成警情分析、出警預(yù)判、信息整理成為了現(xiàn)代化刑偵必須解決的問題。
該系統(tǒng)能夠根據(jù)歷史接警記錄,自動(dòng)標(biāo)注案發(fā)地址、時(shí)間、作案工具和損失財(cái)務(wù)等警情要素。結(jié)合過往出警記錄,判斷警情等級(jí)并給出相應(yīng)建議。這大幅縮短了工作人員錄入檔案的時(shí)間,降低了高峰時(shí)期的人力負(fù)載,甚至為領(lǐng)導(dǎo)的宏觀分析提供了信息來源。
應(yīng)用價(jià)值:
該系統(tǒng)采用了大量的機(jī)器學(xué)習(xí)與自然語言處理驅(qū)動(dòng)技術(shù),構(gòu)建了準(zhǔn)確的分析模型與全方位的展示界面,為警務(wù)管理提供了新的敏捷性與準(zhǔn)確性。使用語義檢索代替了傳統(tǒng)的關(guān)鍵字檢索,有機(jī)地整合了警情信息,精確地提供了出警建議。自動(dòng)化了接警流程,縮短了出警時(shí)滯,提供了智能化的預(yù)判建議。
從學(xué)術(shù)角度出發(fā),該系統(tǒng)以模式多變、格式迥異的文檔為輸入,以結(jié)構(gòu)化的案件事實(shí)為輸出,在刑偵數(shù)據(jù)處理領(lǐng)域?qū)δP万?qū)動(dòng)的案件抽取進(jìn)行了初步的研究和有意義的探索。保證輸出案件事實(shí)的前提下,同時(shí)存儲(chǔ)了抽取的中間結(jié)果,為指代消歧、案件事實(shí)融合等后續(xù)研究工作奠定了基礎(chǔ)。