自然語言處理和大部分的機(jī)器學(xué)習(xí)或者人工智能領(lǐng)域的技術(shù)一樣,是一個涉及到多個技能、技術(shù)和領(lǐng)域的綜合體。
所以自然語言處理工程師會有各種各樣的背景,大部分都是在工作中自學(xué)或者是跟著項目一起學(xué)習(xí)的,這其中也不乏很多有科班背景的專業(yè)人才,因為技術(shù)的發(fā)展實在是日新月異,所以時刻要保持著一種強(qiáng)烈的學(xué)習(xí)欲望,讓自己跟上時代和技術(shù)發(fā)展的步伐。本文作者從個人學(xué)習(xí)經(jīng)歷出發(fā),介紹相關(guān)經(jīng)驗。
一些研究者將自然語言處理(NLP,Natural Language Processing)和自然語言理解(NLU,Natural Language Understanding)區(qū)分開,在文章中我們說的NLP是包含兩者的,并沒有將兩者嚴(yán)格分開。
圖1 自然語言處理工程師技能樹
自然語言處理學(xué)習(xí)路線
數(shù)學(xué)基礎(chǔ)
數(shù)學(xué)對于自然語言處理的重要性不言而喻。當(dāng)然數(shù)學(xué)的各個分支在自然語言處理的不同階段也會扮演不同的角色,這里介紹幾個重要的分支。
代數(shù)
代數(shù)作為計算數(shù)學(xué)里面很重要的一個分支,在自然語言處理中也有舉足輕重的作用。這一部分需要重點關(guān)注矩陣處理相關(guān)的一些知識,比如矩陣的SVD、QR分解,矩陣逆的求解,正定矩陣、稀疏矩陣等特殊矩陣的一些處理方法和性質(zhì)等等。
對于這一部分的學(xué)習(xí),既可以跟著大學(xué)的代數(shù)書一起學(xué)習(xí),也可以跟著網(wǎng)上的各種公開課一起學(xué)習(xí),這里既可以從國內(nèi)的一些開放學(xué)習(xí)平臺上學(xué),也可以從國外的一些開放學(xué)習(xí)平臺上學(xué)。這
概率論
在很多的自然語言處理場景中,我們都是算一個事件發(fā)生的概率。這其中既有特定場景的原因,比如要推斷一個拼音可能的漢字,因為同音字的存在,我們能計算的只能是這個拼音到各個相同發(fā)音的漢字的條件概率。也有對問題的抽象處理,比如詞性標(biāo)注的問題,這個是因為我們沒有很好的工具或者說能力去精準(zhǔn)地判斷各個詞的詞性,所以就構(gòu)造了一個概率解決的辦法。
對于概率論的學(xué)習(xí),既要學(xué)習(xí)經(jīng)典的概率統(tǒng)計理論,也要學(xué)習(xí)貝葉斯概率統(tǒng)計。相對來說,貝葉斯概率統(tǒng)計可能更重要一些,這個和貝葉斯統(tǒng)計的特性是相關(guān)的,因其提供了一種描述先驗知識的方法。使得歷史的經(jīng)驗使用成為了可能,而歷史在現(xiàn)實生活中,也確實是很有用的。比如樸素貝葉斯模型、隱馬爾卡模型、最大熵模型,這些我們在自然語言處理中耳熟能詳?shù)囊恍?a target="_blank">算法,都是貝葉斯模型的一種延伸和實例。
信息論作為一種衡量樣本純凈度的有效方法。對于刻畫兩個元素之間的習(xí)慣搭配程度非常有效。這個對于我們預(yù)測一個語素可能的成分(詞性標(biāo)注),成分的可能組成(短語搭配)非常有價值,所以這一部分知識在自然語言處理中也有非常重要的作用。
同時這部分知識也是很多機(jī)器學(xué)習(xí)算法的核心,比如決策樹、隨機(jī)森林等以信息熵作為決策樁的一些算法。對于這部分知識的學(xué)習(xí),更多的是要理解各個熵的計算方法和優(yōu)缺點,比如信息增益和信息增益率的區(qū)別,以及各自在業(yè)務(wù)場景中的優(yōu)缺點。
數(shù)據(jù)結(jié)構(gòu)與算法
這部分內(nèi)容的重要性就不做贅述了。學(xué)習(xí)了上面的基礎(chǔ)知識,只是萬里長征開始了第一步,要想用機(jī)器實現(xiàn)對自然語言的處理,還是需要實現(xiàn)對應(yīng)的數(shù)據(jù)結(jié)構(gòu)和算法。這一部分也算是自然語言處理工程師的一個看家本領(lǐng)。這一部分的內(nèi)容也是比較多的,這里就做一個簡單的介紹和說明。
首先數(shù)據(jù)結(jié)構(gòu)部分,需要重點關(guān)注鏈表、樹結(jié)構(gòu)和圖結(jié)構(gòu)(鄰接矩陣)。包括各個結(jié)構(gòu)的構(gòu)建、操作、優(yōu)化,以及各個結(jié)構(gòu)在不同場景下的優(yōu)缺點。當(dāng)然大部分情況下,可能使用到的數(shù)據(jù)結(jié)構(gòu)都不是單一的,而是有多種數(shù)據(jù)結(jié)構(gòu)組合。比如在分詞中有非常優(yōu)秀表現(xiàn)的雙數(shù)組有限狀態(tài)機(jī)就使用樹和鏈表的結(jié)構(gòu),但是實現(xiàn)上采用的是鏈表形式,提升了數(shù)據(jù)查詢和匹配的速度。在熟練掌握各種數(shù)據(jù)結(jié)構(gòu)之后,就是要設(shè)計良好的算法了。
伴隨著大數(shù)據(jù)的不斷擴(kuò)張,單機(jī)的算法越來越難發(fā)揮價值,所以多數(shù)場景下都要研發(fā)并行的算法。這里面又涉及到一些工具的應(yīng)用,也就是編程技術(shù)的使用。例如基于Hadoop的MapReduce開發(fā)和Spark開發(fā)都是很好的并行化算法開發(fā)工具,但是實現(xiàn)機(jī)制卻有很大的差別,同時編程的便利程度也不一樣。
當(dāng)然這里面沒有絕對的孰好孰壞,更多的是個人使用的習(xí)慣和業(yè)務(wù)場景的不同而不同。比如兩個都有比較成熟的機(jī)器學(xué)習(xí)庫,一些常用的機(jī)器學(xué)習(xí)算法都可以調(diào)用庫函數(shù)實現(xiàn),編程語言上也都可以采用Java,不過Spark場景下使用Scala會更方便一些。因為這一部分是偏實操的,所以我的經(jīng)驗會建議實例學(xué)習(xí)的方法,也就是跟著具體的項目學(xué)習(xí)各種算法和數(shù)據(jù)結(jié)構(gòu)。最好能對學(xué)習(xí)過的算法和數(shù)據(jù)結(jié)構(gòu)進(jìn)行總結(jié)回顧,這樣可以更好的得到這種方法的精髓。因為基礎(chǔ)的元素,包括數(shù)據(jù)結(jié)構(gòu)和計算規(guī)則都是有限的,所以多樣的算法更多的是在不同的場景下,對于不同元素的一個排列組合,如果能夠融會貫通各個基礎(chǔ)元素的原理和使用,不管是對于新知識的學(xué)習(xí)還是對于新解決方案的構(gòu)建都是非常有幫助的。
對于工具的選擇,建議精通一個,對于其他工具也需要知道,比如精通Java和MapReduce,對于Spark和Python也需要熟悉,這樣可以在不同的場景下使用不同的工具,提升開發(fā)效率。這一部分實在是太多、太廣,這里不能全面地介紹,大家可以根據(jù)自己的需求,選擇合適的學(xué)習(xí)資料進(jìn)行學(xué)習(xí)。
這一部分就更多是語文相關(guān)的知識,比如一個句子的組成成分包括:主、謂、賓、定、狀、補(bǔ)等。對于各個成分的組織形式也是多種多樣。比如對于主、謂、賓,常規(guī)的順序就是:主語→謂語→賓語。當(dāng)然也會有:賓語→主語→賓語(飯我吃了)。這些知識的積累有助于我們在模型構(gòu)建或者解決具體業(yè)務(wù)的時候,能夠事半功倍,因為這些知識一般情況下,如果要被機(jī)器學(xué)習(xí),都是非常困難的,或者會需要大量的學(xué)習(xí)素材,或許在現(xiàn)有的框架下,機(jī)器很難學(xué)習(xí)到。如果把這些知識作為先驗知識融合到模型中,對于提升模型的準(zhǔn)確度都是非常有價值的。
在先期的研究中,基于規(guī)則的模型,大部分都是基于語言模型的規(guī)則進(jìn)行研究和處理的。所以這一部分的內(nèi)容對于自然語言處理也是非常重要的。但是這部分知識的學(xué)習(xí)就比較雜一些,因為大部分的自然語言處理工程師都是語言學(xué)專業(yè)出身,所以對于這部分知識的學(xué)習(xí),大部分情況都是靠碎片化的積累,當(dāng)然也可以花一些精力,系統(tǒng)性學(xué)習(xí)。對于這部分知識的學(xué)習(xí),個人建議可以根據(jù)具體的業(yè)務(wù)場景進(jìn)行學(xué)習(xí),比如在項目處理中要進(jìn)行同義詞挖掘,那么就可以跟著“百科”或者“搜索引擎”學(xué)習(xí)同義詞的定義,同義詞一般會有什么樣的形式,怎么根據(jù)句子結(jié)構(gòu)或者語法結(jié)構(gòu)判斷兩個詞是不是同義詞等等。
隨著深度學(xué)習(xí)在視覺和自然語言處理領(lǐng)域大獲成功,特別是隨著AlphaGo的成功,深度學(xué)習(xí)在自然語言處理中的應(yīng)用也越來越廣泛,大家對于它的期望也越來越高。所以對于這部分知識的學(xué)習(xí)也幾乎成為了一個必備的環(huán)節(jié)(實際上可能是大部分情況,不用深度學(xué)習(xí)的模型,也可以解決很多業(yè)務(wù))。
對于這部分知識,現(xiàn)在流行的幾種神經(jīng)網(wǎng)絡(luò)都是需要學(xué)習(xí)和關(guān)注的,特別是循環(huán)神經(jīng)網(wǎng)絡(luò),因為其在處理時序數(shù)據(jù)上的優(yōu)勢,在自然語言處理領(lǐng)域尤為收到追捧,這里包括單項RNN、雙向RNN、LSTM等形式。同時新的學(xué)習(xí)框架,比如對抗學(xué)習(xí)、增強(qiáng)學(xué)習(xí)、對偶學(xué)習(xí),也是需要關(guān)注的。其中對抗學(xué)習(xí)和對偶學(xué)習(xí)都可以顯著降低對樣本的需求,這個對于自然語言處理的價值是非常大的,因為在自然語言處理中,很重要的一個環(huán)節(jié)就是樣本的標(biāo)注,很多模型都是嚴(yán)重依賴于樣本的好壞,而隨著人工成本的上升,數(shù)據(jù)標(biāo)注的成本越來越高,所以如果能顯著降低標(biāo)注數(shù)據(jù)需求,同時提升效果,那將是非常有價值的。
現(xiàn)在還有一個事物正在如火如荼地進(jìn)行著,就是知識圖譜,知識圖譜的強(qiáng)大這里就不再贅述,對于這部分的學(xué)習(xí)可能更多的是要關(guān)注信息的鏈接、整合和推理的技術(shù)。不過這里的每一項技術(shù)都是非常大的一個領(lǐng)域,所以還是建議從業(yè)務(wù)實際需求出發(fā)去學(xué)習(xí)相應(yīng)的環(huán)節(jié)和知識,滿足自己的需求。
自然語言處理現(xiàn)狀
隨著知識圖譜在搜索領(lǐng)域的大獲成功,以及知識圖譜的推廣如火如荼地進(jìn)行中,現(xiàn)在的自然語言處理有明顯和知識圖譜結(jié)合的趨勢。特別是在特定領(lǐng)域的客服系統(tǒng)構(gòu)建中,這種趨勢就更明顯,因為這些系統(tǒng)往往要關(guān)聯(lián)很多領(lǐng)域的知識,而這種知識的整合和表示,很適合用知識圖譜來解決。隨著知識圖譜基礎(chǔ)工程技術(shù)的完善和進(jìn)步,對于圖譜構(gòu)建的容易程度也大大提高,所以自然語言處理和知識圖譜的結(jié)合就越來越成為趨勢。
語義理解仍然是自然語言處理中一個難過的坎。目前各項自然語言處理技術(shù)基本已經(jīng)比較成熟,但是很多技術(shù)的效果還達(dá)不到商用的水平。特別是在語義理解方面,和商用還有比較大的差距。比如聊天機(jī)器人現(xiàn)在還很難做到正常的聊天水平。不過隨著各個研究機(jī)構(gòu)和企業(yè)的不斷努力,進(jìn)步也是飛速的,比如微軟小冰一直在不斷的進(jìn)步。
對于新的深度學(xué)習(xí)框架,目前在自然語言處理中的應(yīng)用還有待進(jìn)一步加深和提高。比如對抗學(xué)習(xí)、對偶學(xué)習(xí)等雖然在圖像處理領(lǐng)域得到了比較好的效果,但是在自然語言處理領(lǐng)域的效果就稍微差一些,這里面的原因是多樣的,因為沒有深入研究,就不敢妄言。
目前人機(jī)對話、問答系統(tǒng)、語言翻譯是自然語言處理中的熱門領(lǐng)域,各大公司都有了自己的語音助手,這一塊也都在投入大量的精力在做。當(dāng)然這些上層的應(yīng)用,也都依賴于底層技術(shù)和模型的進(jìn)步,所以對于底層技術(shù)的研究應(yīng)該說一直是熱門,在未來一段時間應(yīng)該也都還是熱門。之前聽一個教授講過一個故事,他是做parser的,開始的時候很火,后來一段時間因為整個自然語言處理的效果差強(qiáng)人意,所以作為其中一個基礎(chǔ)工作的parser就隨之受到冷落,曾經(jīng)有段時間相關(guān)的期刊會議會員銳減,但是最近整個行業(yè)的升溫,這部分工作也隨之而受到重視。不過因為他一直堅持在這個領(lǐng)域,所以建樹頗豐,最近也成為熱門領(lǐng)域和人物。
所以在最后引用一位大牛曾經(jīng)說過的話:“任何行業(yè)或者領(lǐng)域做到頭部都是非常有前途的,即使是打球,玩游戲?!保ù笠猓?/p>
個人經(jīng)驗
筆者是跟著項目學(xué)習(xí)自然語言處理的,非科班出身,所以的經(jīng)驗難免會有偏頗,說出來僅供大家參考, 有不足和紕漏的地方敬請指正。
知識結(jié)構(gòu)
要做算法研究,肯定需要一定的知識積累,對于知識積累這部分,我的經(jīng)驗是先學(xué)數(shù)學(xué)理論基礎(chǔ),學(xué)的順序可以是代數(shù)→概率論→隨機(jī)過程。當(dāng)然這里面每一科都是很大的一個方向,學(xué)的時候不必面面俱到,所有都深入理解,但是相對基礎(chǔ)的一些概念和這門學(xué)科主要講的是什么問題一定要記住。
在學(xué)習(xí)了一些基礎(chǔ)數(shù)學(xué)知識之后,就開始實現(xiàn)——編寫算法。這里的算法模型,建議跟著具體的業(yè)務(wù)來學(xué)習(xí)和實踐,比如可以先從識別垃圾郵件這樣的demo進(jìn)行學(xué)習(xí)實驗,這樣的例子在網(wǎng)上很容易找到,但是找到以后,一定不要看看就過去,要一步一步改寫拿到的demo,同時可以改進(jìn)里面的參數(shù)或者實現(xiàn)方法,看看能不能達(dá)到更好的效果。個人覺得學(xué)習(xí)還是需要下苦功夫一步一步模仿,然后改進(jìn),才能深入的掌握相應(yīng)的內(nèi)容。對于學(xué)習(xí)的資料,上學(xué)時期的各個教程即可。
工具
工欲善其事必先利其器,所以好的工具往往能事半功倍。在工具的選擇上,個人建議,最高優(yōu)先級的是Python,畢竟其的宣傳口語是:人生苦短,請用Python。第二優(yōu)先級的是Java,基于Java可以和現(xiàn)有的很多框架進(jìn)行直接交互,比如Hadoop、Spark等等。對于工具的學(xué)習(xí)兩者還是有很大的差別的,Python是一個腳本語言,所以更多的是跟著“命令”學(xué),也就是要掌握你要實現(xiàn)什么目的來找具體的執(zhí)行語句或者命令,同時因為Python不同版本、不同包對于同一個功能的函數(shù)實現(xiàn)差別也比較大,所以在學(xué)習(xí)的時候,要多試驗,求同存異。
對于Java就要學(xué)習(xí)一些基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu),然后一步一步的去編寫自己的邏輯。對于Python當(dāng)然也可以按照這個思路,Python本身也是一個高級編程語言,所以掌握了基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)之后,也可以一步一步的實現(xiàn)具體的功能,但是那樣好像就失去了slogan的意義。
緊跟時代
自然語言處理領(lǐng)域也算是一個知識密集型的行業(yè),所以知識的更新迭代非常的快,要時刻關(guān)注行業(yè)、領(lǐng)域的最新進(jìn)展。這個方面主要就是看一些論文和關(guān)注一些重要的會議,對于論文的獲取,Google Scholar、arxiv都是很好的工具和資源(請注意維護(hù)知識產(chǎn)權(quán))。會議就更多了KDD、JIST、CCKS等等。
-
算法
+關(guān)注
關(guān)注
23文章
4710瀏覽量
95397 -
數(shù)據(jù)結(jié)構(gòu)
+關(guān)注
關(guān)注
3文章
573瀏覽量
40750 -
深度學(xué)習(xí)
+關(guān)注
關(guān)注
73文章
5561瀏覽量
122795 -
自然語言
+關(guān)注
關(guān)注
1文章
292瀏覽量
13656
原文標(biāo)題:如何成為一名自然語言處理工程師
文章出處:【微信號:AI_Thinker,微信公眾號:人工智能頭條】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
評論