自然語言處理怎麼最快入門?

adnb34g發表於2018-11-28

本文整理自知乎上的一個問答,分享給正在學習自然然語言處理的朋友們!

一、自然語言處理是什麼?

自然語言處理說白了,就是讓機器去幫助我們完成一些語言層面的事情,典型的比如:情感分析、文字摘要、自動問答等等。我們日常場景中比較常見到的類似 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 ,其他位置均為 。這樣你也應該能想到,實際應用而言,不太現實。

2 )、 HashTF ,對應詞袋模型的困境,人們首先想到的就是怎麼縮小向量的維度,同時表示相同的單詞呢, HashTF 的基本思想也就是為了解決這個問題,利用 Hash 的思想,將大量的單詞對映到一個小維度向量中,來解讀維度爆炸的問題,當然有利有弊,仍然不能很好的解決詞語對映的問題。

3 )、 Word2Vec 是工業上比較常用的一個詞向量模型工具,也是實際應用中採用的。其思想包括 CBOW Skip-Gram ,基本思想都是詞語和詞語周圍單詞間的一個共現關係,它在一定程度上考慮了語境和語義的影響,是一個可以實際使用的工具。

概括來說,在我們後期利用機器學習或者深度學習處理問題的時候,詞向量是我們必不可少的一步, word2vec 也是我們可以考慮的一個比較不錯的選擇。

4 、文字分類

文字分類是一個比較大的概念,具體到應用,其中包括了情感識別、敏感識別等,具體到實現方式,包括二類分類、多類別分類、多標籤分類等。就是為了把一組文字按照指定要求利用機器進行區分。具體到實現演算法而言,不勝列舉。。 Spark Mllib 中包含了大量的分類演算法,可以進行實踐,這也是入門的一種比較快速的方式,先會後懂然後深入。

5 、自動問答

自動問答是一個比較熱的概念,也是一個應用比較廣泛的自然語言處理案例,當前業界最高水平 R-Net 已經可以達到 80% 多的準確率,已經是一個比較了不起的成就了,但是實際操作起來,也還是有一定難度,我也在不斷摸索,暫時不瞎說了。

三、自然語言處理的深入

談到自然語言處理的深入,這個可以做的就比較多了,上面列舉的各個方面都與比較大的最佳化空間。但總體而言,最大的幾個問題在於分詞、詞向量的轉化以及文字特徵的提取,這也是一定程式上困擾我們繼續提高的幾大阻礙。拿分詞來說,無論是基於詞典和演算法的分詞還是目前基於深度學習的分詞方式,都只能說一定程度上進行分詞實現,想要達到人腦的分詞效果,實際上還是前路漫漫;詞向量的轉化在一定程式上也依賴於大量的語料,而我們也不可能在訓練模型時囊括所有的詞語,所有的語境,所有的文字,這些也都是不現實的,只能說時最佳化演算法或者選擇一種更好的方式;文字特徵的提取也是一個我們在後期進行學習過程中一個繞不過去的坎。總而言之,自然語言處理說簡單也簡單,說難也難,就看你想要達到什麼樣的高度。

作者:鄭海倫


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31524777/viewspace-2221902/,如需轉載,請註明出處,否則將追究法律責任。

相關文章