2019獨角獸企業重金招聘Python工程師標準>>>
本文整理自知乎上的一個問答,分享給正在學習自然然語言處理的朋友們!
一、自然語言處理是什么?
自然語言處理說白了,就是讓機器去幫助我們完成一些語言層面的事情,典型的比如:情感分析、文本摘要、自動問答等等。我們日常場景中比較常見到的類似Siri、微軟小冰之類的,這些的基礎都是自然語言處理,另外還有一些語音處理,這就暫且不表了。總之,你看到的機器與人利用語言交互,用機器模擬人腦閱讀,對話,評論等等這些的基礎都是自然語言處理的范疇之內。
二、自然語言處理怎么學?
自然語言處理的實際入門步驟來說,假如單單從應用來說,我覺得還是直接先從簡單的應用搞起更好一點,上來就是理論的話可能對一些人還是比較枯燥,我認為一個好的過程是:實踐-理論-實踐,先由實踐搞起,加深興趣,然后理論研究,深化理解,最后繼續實踐,知行合一。閑言少敘,下面說下自己的入門步驟:
1、分詞
針對中文而言(當然假如你處理英文,可直接跳過這一步),首先就是分詞的問題,因為中文相對于英文,并不是空格分隔的,另外進行自然語言處理的相關實踐,也不大可能直接一長段文本進行操作,所以分詞還是首當其中的。分詞的原理暫且不說(比如CRF、霍夫曼等等,有興趣可自己去了解),這里主要推薦一下常用到(Java)的幾個分詞工具:
(1)、HanLP?是一個中文自然語言處理的基礎包,它囊括了包含分詞在內的幾乎所有的自然語言處理涉及的基礎操作,同時工具包來說,分為data版和ptotable版,對于一般的分詞而言,protable完全就可以滿足要求。另外還有一些其他的操作,例如詞性識別,也是實際應用中比較多的。當然其他的類似關鍵詞提取,情感識別做個參考也就好了,實際還是要自己優化;
(2)、LTP?是哈工大的一個分詞組件,相較于HanLP而言,其包含的依存句法分析以及語義依存分析的方法,對于我們基于文本進行更高級一點的操作(比如提取句子的主語、謂語;行動關系等,另外基于此進行分詞優化實踐也有一定的提升),可以說是比較方便的;但是與此同時,LTP提供分詞的方式是利用http接口的方式,這就讓它在實際的應用中有那么一點落后,雖然它也提供了自搭服務的方式,但也逃不出請求接口。最后的最后,貌似現在已經和訊飛合作了,開放接口都需要申請,而且還不一定能用。。允悲。
(3)、jieba 說起分詞,就不得不提jieba,包括最基礎的python版本,然后還有衍生出來的java版、C#版等等,實際使用起來也是比較方便,當然對于java版而言,它沒有詞性的功能,這也是我在實際應用中使用表少的一個原因吧。
另外,分詞工具還有ansj、StanfordNLP中工具等等,用的不多也就不瞎說了。
2、關鍵詞提取
對于中文文本而言,分詞完畢,接下來我們要做的事情,大致逃不出那么幾件:關鍵詞提取、句子相似性、文本摘要等,這其中一個比較典型的應用就是關鍵詞提取。相應的實踐方式主要有以下幾種:
(1)、TF-IDF 是關鍵詞提取一個可以說是首先想到的解決方案,它說自己第二,沒人敢說第一。當然它的理論也是比較好理解的,歸結起來一句話:在一篇文本中那些不常出現(此處指的文本集)的詞在當前文本中大量出現,那它就是關鍵詞;TF、IDF也相應的就是兩個概念,想看理論,查查便知;具體到應用層級來說,對于大量文本,語料比較豐富的場景下,這種方式提取關鍵詞來說,確實也是比較方便和準確的,但在語料不足的情況下,可能也就just soso了。但是思想是最重要的,這也是我們入門的基礎。
(2)、TextRank 是基于Google的PageRank的一個應用于文本的一個關鍵詞提取算法,基于詞語窗口的思想,利用相互投票的方式,提取文本關鍵詞。TextRank有一個最大的好處就是不依賴額外文本,針對單篇文本,處理得當也就可以提取出看的過去的關鍵詞,簡單實用。關于其優化方式,比如改變詞語網絡窗口的大小,分詞的預過濾,詞性權重投票等等,都是一個不錯的方向,效果也還算顯著。其對應的實現都有開源的版本,GitHub上動動手就有了。
(3)、LDA 從嚴謹的角度而言,它并不是一個提取關鍵詞的方式,但是對于我們預先有一定分類的文本而言,利用LDA提取文本的中心詞,或者說針對類別的關鍵詞,某些情況下效果也是不錯的。具體到實現上,Java開源的有JGIbbLDA、當然python的scikit-learn,以及Spark Mllib中都包含了對應的LDA版本,可以一試。
具體到實際的使用場景,對于有大量語料,首推TF-IDF;對于單篇文本,當然還是TextRank;對于類別文本,LDA也不失為一種選擇。總之,看你實際應用需求。
3、詞向量
從關鍵詞提取直接跳轉到詞向量,感覺是一個比較大的跳躍,但實際而言,詞向量是我們后續進行機器學習或者深度學習的處理,因為機器處理的始終還是二進制,你不可能改變計算機底層的實現(當然說的是現在,沒準后來有人就真成了呢,我們當那是一個美好的愿景吧)。詞向量說白了,就是用向量的形式表示詞,這就牽涉到一個問題了,我們怎么把一個中文詞語轉化成一個向量呢。這里主要有以下幾種方式:
(1)、詞袋模型,顧名思義就是把所有的詞都放進一個袋子里,然后指定每個詞的位置。所以這樣生成的向量,就是長度等同于單詞總數,盡在詞對應的位置置1,其他位置均為0。這樣你也應該能想到,實際應用而言,不太現實。
(2)、HashTF,對應詞袋模型的困境,人們首先想到的就是怎么縮小向量的維度,同時表示相同的單詞呢,HashTF的基本思想也就是為了解決這個問題,利用Hash的思想,將大量的單詞映射到一個小維度向量中,來解讀維度爆炸的問題,當然有利有弊,仍然不能很好的解決詞語映射的問題。
(3)、Word2Vec是工業上比較常用的一個詞向量模型工具,也是實際應用中采用的。其思想包括CBOW和Skip-Gram,基本思想都是詞語和詞語周圍單詞間的一個共現關系,它在一定程度上考慮了語境和語義的影響,是一個可以實際使用的工具。
概括來說,在我們后期利用機器學習或者深度學習處理問題的時候,詞向量是我們必不可少的一步,word2vec也是我們可以考慮的一個比較不錯的選擇。
4、文本分類
文本分類是一個比較大的概念,具體到應用,其中包括了情感識別、敏感識別等,具體到實現方式,包括二類分類、多類別分類、多標簽分類等。就是為了把一組文本按照指定要求利用機器進行區分。具體到實現算法而言,不勝枚舉。。Spark Mllib中包含了大量的分類算法,可以進行實踐,這也是入門的一種比較快速的方式,先會后懂然后深入。
5、自動問答
自動問答是一個比較熱的概念,也是一個應用比較廣泛的自然語言處理案例,當前業界最高水平R-Net已經可以達到80%多的準確率,已經是一個比較了不起的成就了,但是實際操作起來,也還是有一定難度,我也在不斷摸索,暫時不瞎說了。
三、自然語言處理的深入
談到自然語言處理的深入,這個可以做的就比較多了,上面列舉的各個方面都與比較大的優化空間。但總體而言,最大的幾個問題在于分詞、詞向量的轉化以及文本特征的提取,這也是一定程序上困擾我們繼續提高的幾大阻礙。拿分詞來說,無論是基于詞典和算法的分詞還是目前基于深度學習的分詞方式,都只能說一定程度上進行分詞實現,想要達到人腦的分詞效果,實際上還是前路漫漫;詞向量的轉化在一定程序上也依賴于大量的語料,而我們也不可能在訓練模型時囊括所有的詞語,所有的語境,所有的文本,這些也都是不現實的,只能說時優化算法或者選擇一種更好的方式;文本特征的提取也是一個我們在后期進行學習過程中一個繞不過去的坎。總而言之,自然語言處理說簡單也簡單,說難也難,就看你想要達到什么樣的高度。
作者:鄭海倫
?