天然語言處理,也就從天然語言中解讀信息,知識。目前機器翻譯取得一些不錯的進展,深度學習在NLP的應用還比較有限。本質緣由在於文本里,並未包含全部信息,語言有太多的潛臺詞,因此即使LSTM統計到全部的細節,仍然有限的緣由。python
深度學習只是一種工具,適當的輸入纔有恰當的輸出。因此純粹文本seq2seq的學習,在NLP上註定沒有什麼大用途。必需要文本解讀,分詞,POS, NER,創建語法樹,提取事件等,而後再借助深度學習強大的統計力去建模。sql
nltk是學習文本處理一個很好的入門框架。裏面有大量的語料供學習(大部分是英文)。好比:布朗語料庫是第一個百萬詞級的英語電子語料庫的,由布朗大學於1961 年建立。這個語料庫包含500 個不一樣來源的文本,按照文體分類,如:新聞、社論等。數據庫
from nltk.corpus import brown
print(brown.categories())
#['adventure', 'belles_lettres', 'editorial', 'fiction', 'government', 'hobbies', 'humor', 'learned', 'lore', 'mystery', 'news', 'religion', 'reviews', 'romance', 'science_fiction']
分類很豐富,有科幻,言情,探險...框架
天然語言最小單元固然是字,若是英文就是字母(char-rnn這個級別的統計會直接按字/char爲單元來學習)。通常有意義的處理單元是詞,因此分詞就是首要任務,英文nlp就佔了這個優點,它原本就是分好詞的,而中文分詞自己就是個難題,好比新詞,口語詞,行業特定詞彙等如何處理。機器學習
最直接的一個分析,就是統計詞頻,不一樣的文體,經過詞頻能夠看出風格迥異。工具
#詞頻統計 fdist = nltk.FreqDist([w.lower() for w in new_words]) print(fdist) modals = ['can', 'could', 'may', 'might', 'must', 'will'] #詞頻統計 for m in modals: print(m + ':', fdist[m])
nltk裏還包含大量nlp基本任務的已標註數據,另外還包含了不少非英文的語料,也有繁體中文。學習
詞性標註,就是把分好的詞,肯定它的詞性,中文就是名動形數量代:人工智能
tokens = nltk.word_tokenize("And now for something completely different")
tagged = nltk.pos_tag(tokens)
print(tagged)
#[('And', 'CC'), ('now', 'RB'), ('for', 'IN'), ('something', 'NN'), ('completely', 'RB'), ('different', 'JJ')]
在這裏咱們看到and 是CC,並列連詞;now 和completely 是RB,副詞;for 是IN,介詞;something 是NN,名詞;different 是JJ,形容詞。spa
詞性就是一種「額外」信息了,比傳統只統計詞頻,把全部詞同等對待,又進了一步。text.similar()方法爲一個詞w 找出全部上下文w1 w w2,然翻譯
後找出全部出如今相同上下文中的詞w',即w1 w' w2。就是出如今」相似「的位置,「woman」找到的類似的詞,都是「名詞」
text = nltk.Text(word.lower() for word in nltk.corpus.brown.words()) text.similar('woman') #man day time year moment car world family house boy child country #state job place way girl war question word
針對文本處理,更多在詞這個層面,統計詞頻,算tf-idf等,把文檔向量化,而後經過傳統機器學習,去分類(情感識別也是分類),好比判斷名字是男或女的機率,經過的方法有貝葉斯,SVM等。這些把全部詞看成一樣的東西處理,獲得的信息天然頗有限。
真正的天然語言理解,要作到像人類同樣,還有很長很長的路要走。但從文本中提供更多信息(結構化)信息,可藉機器查詢,這是可能的。
首先,固然是詞性標註,實詞比較重要,好比名詞,動詞。
其次,分塊,尤爲是名詞分塊(NP-chunking)
看一個句子:
the little yellow dog barked at the cat.
sentence = [("the", "DT"), ("little", "JJ"), ("yellow", "JJ"),\
("dog", "NN"), ("barked", "VBD"), ("at", "IN"), ("the", "DT"), ("cat", "NN")]
grammar = "NP: {<DT>?<JJ>*<NN>}"
cp = nltk.RegexpParser(grammar)
result = cp.parse(sentence)
print(result)
result.draw()
標註完詞性後,咱們使用一個簡單的正則規則,就是DT NN,之間,可能有或沒有形容詞,而後把分塊畫出來。咱們獲得兩個名詞分塊,句子也很清晰了。
有了分塊,就能夠識別命名實體(NER),主要是名詞短語,人物,事件,地點,組織等。有了命名實體,咱們再去抽取這些實體之間的關係,好比三元組或五元組,這些就是知識圖譜的基礎了。
目前很流行的QA系統,在電商,客服系統裏有大量的應用。其實,在咱們數據庫裏大量的結構化數據自己就能夠支持回覆不少問題。好比一個股票的數據庫。你想知道「昨天漲幅超過5%的股票有多少支?」。這個問題經過SQL是能夠查詢的,但對於普通用戶就有難度了,他須要知道數據庫的設計,還要會數據庫查詢。
from nltk import load_parser cp = load_parser('grammars/book_grammars/sql0.fcfg') query = 'What cities are located in China' trees = next(cp.parse(query.split())) for tree in cp.parse(query.split()): print(tree)
獲得sql語句:
(SELECT City FROM city_table, WHERE Country="china")
NLTK是學習,研究NLP處理的一個很好的工具包,包括深度學習的實驗等均可以在這個庫上進行。
關於做者:魏佳斌,互聯網產品/技術總監,北京大學光華管理學院(MBA),特許金融分析師(CFA),資深產品經理/碼農。偏心python,深度關注互聯網趨勢,人工智能,AI金融量化。致力於使用最前沿的認知技術去理解這個複雜的世界。
掃描下方二維碼,關注:AI量化實驗室(ailabx),瞭解AI量化最前沿技術、資訊。