本文整理自知乎上的一個問答,分享給正在學習天然然語言處理的朋友們!java
1、天然語言處理是什麼?python
天然語言處理說白了,就是讓機器去幫助咱們完成一些語言層面的事情,典型的好比:情感分析、文本摘要、自動問答等等。咱們平常場景中比較常見到的相似Siri、微軟小冰之類的,這些的基礎都是天然語言處理,另外還有一些語音處理,這就暫且不表了。總之,你看到的機器與人利用語言交互,用機器模擬人腦閱讀,對話,評論等等這些的基礎都是天然語言處理的範疇以內。git
2、天然語言處理怎麼學?github
天然語言處理的實際入門步驟來講,假如單單從應用來講,我以爲仍是直接先從簡單的應用搞起更好一點,上來就是理論的話可能對一些人仍是比較枯燥,我認爲一個好的過程是:實踐-理論-實踐,先由實踐搞起,加深興趣,而後理論研究,深化理解,最後繼續實踐,知行合一。閒言少敘,下面說下本身的入門步驟:算法
一、分詞網絡
針對中文而言(固然假如你處理英文,可直接跳過這一步),首先就是分詞的問題,由於中文相對於英文,並非空格分隔的,另外進行天然語言處理的相關實踐,也不大可能直接一長段文本進行操做,因此分詞仍是首當其中的。分詞的原理暫且不說(好比CRF、霍夫曼等等,有興趣可本身去了解),這裏主要推薦一下經常使用到(Java)的幾個分詞工具:機器學習
(1)、HanLP 是一箇中文天然語言處理的基礎包,它囊括了包含分詞在內的幾乎全部的天然語言處理涉及的基礎操做,同時工具包來講,分爲data版和ptotable版,對於通常的分詞而言,protable徹底就能夠知足要求。另外還有一些其餘的操做,例如詞性識別,也是實際應用中比較多的。固然其餘的相似關鍵詞提取,情感識別作個參考也就行了,實際仍是要本身優化;工具
(2)、LTP 是哈工大的一個分詞組件,相較於HanLP而言,其包含的依存句法分析以及語義依存分析的方法,對於咱們基於文本進行更高級一點的操做(好比提取句子的主語、謂語;行動關係等,另外基於此進行分詞優化實踐也有必定的提高),能夠說是比較方便的;可是與此同時,LTP提供分詞的方式是利用http接口的方式,這就讓它在實際的應用中有那麼一點落後,雖然它也提供了自搭服務的方式,但也逃不出請求接口。最後的最後,貌似如今已經和訊飛合做了,開放接口都須要申請,並且還不必定能用。。允悲。學習
(3)、jieba 提及分詞,就不得不提jieba,包括最基礎的python版本,而後還有衍生出來的java版、C#版等等,實際使用起來也是比較方便,固然對於java版而言,它沒有詞性的功能,這也是我在實際應用中使用表少的一個緣由吧。優化
另外,分詞工具還有ansj、StanfordNLP中工具等等,用的很少也就不瞎說了。
二、關鍵詞提取
對於中文文本而言,分詞完畢,接下來咱們要作的事情,大體逃不出那麼幾件:關鍵詞提取、句子類似性、文本摘要等,這其中一個比較典型的應用就是關鍵詞提取。相應的實踐方式主要有如下幾種:
(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也不失爲一種選擇。總之,看你實際應用需求。
三、詞向量
從關鍵詞提取直接跳轉到詞向量,感受是一個比較大的跳躍,但實際而言,詞向量是咱們後續進行機器學習或者深度學習的處理,由於機器處理的始終仍是二進制,你不可能改變計算機底層的實現(固然說的是如今,沒準後來有人就真成了呢,咱們當那是一個美好的願景吧)。詞向量說白了,就是用向量的形式表示詞,這就牽涉到一個問題了,咱們怎麼把一箇中文詞語轉化成一個向量呢。這裏主要有如下幾種方式:
(1)、詞袋模型,顧名思義就是把全部的詞都放進一個袋子裏,而後指定每一個詞的位置。因此這樣生成的向量,就是長度等同於單詞總數,盡在詞對應的位置置1,其餘位置均爲0。這樣你也應該能想到,實際應用而言,不太現實。
(2)、HashTF,對應詞袋模型的困境,人們首先想到的就是怎麼縮小向量的維度,同時表示相同的單詞呢,HashTF的基本思想也就是爲了解決這個問題,利用Hash的思想,將大量的單詞映射到一個小維度向量中,來解讀維度爆炸的問題,固然有利有弊,仍然不能很好的解決詞語映射的問題。
(3)、Word2Vec是工業上比較經常使用的一個詞向量模型工具,也是實際應用中採用的。其思想包括CBOW和Skip-Gram,基本思想都是詞語和詞語周圍單詞間的一個共現關係,它在必定程度上考慮了語境和語義的影響,是一個能夠實際使用的工具。
歸納來講,在咱們後期利用機器學習或者深度學習處理問題的時候,詞向量是咱們必不可少的一步,word2vec也是咱們能夠考慮的一個比較不錯的選擇。
四、文本分類
文本分類是一個比較大的概念,具體到應用,其中包括了情感識別、敏感識別等,具體到實現方式,包括二類分類、多類別分類、多標籤分類等。就是爲了把一組文本按照指定要求利用機器進行區分。具體到實現算法而言,不勝枚舉。。Spark Mllib中包含了大量的分類算法,能夠進行實踐,這也是入門的一種比較快速的方式,先會後懂而後深刻。
五、自動問答
自動問答是一個比較熱的概念,也是一個應用比較普遍的天然語言處理案例,當前業界最高水平R-Net已經能夠達到80%多的準確率,已是一個比較了不得的成就了,可是實際操做起來,也仍是有必定難度,我也在不斷摸索,暫時不瞎說了。
3、天然語言處理的深刻
談到天然語言處理的深刻,這個能夠作的就比較多了,上面列舉的各個方面都與比較大的優化空間。但整體而言,最大的幾個問題在於分詞、詞向量的轉化以及文本特徵的提取,這也是必定程序上困擾咱們繼續提升的幾大阻礙。拿分詞來講,不管是基於詞典和算法的分詞仍是目前基於深度學習的分詞方式,都只能說必定程度上進行分詞實現,想要達到人腦的分詞效果,實際上仍是前路漫漫;詞向量的轉化在必定程序上也依賴於大量的語料,而咱們也不可能在訓練模型時囊括全部的詞語,全部的語境,全部的文本,這些也都是不現實的,只能說時優化算法或者選擇一種更好的方式;文本特徵的提取也是一個咱們在後期進行學習過程當中一個繞不過去的坎。總而言之,天然語言處理說簡單也簡單,說難也難,就看你想要達到什麼樣的高度。
做者:鄭海倫