nltk自然语言处理
2019獨角獸企業重金招聘Python工程師標準>>>
自然語言處理,也就從自然語言中解讀信息,知識。目前機器翻譯取得一些不錯的進展,深度學習在NLP的應用還比較有限。本質原因在于文本里,并未包含所有信息,語言有太多的潛臺詞,所以即便LSTM統計到所有的細節,仍然有限的原因。
深度學習只是一種工具,適當的輸入才有恰當的輸出。所以純粹文本seq2seq的學習,在NLP上注定沒有什么大用途。必須要文本解讀,分詞,POS, NER,建立語法樹,提取事件等,然后再借助深度學習強大的統計力去建模。
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,形容詞。
詞性就是一種“額外”信息了,比傳統只統計詞頻,把所有詞同等對待,又進了一步。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量化最前沿技術、資訊。
轉載于:https://my.oschina.net/u/1996852/blog/1569917
總結
以上是生活随笔為你收集整理的nltk自然语言处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于图像分析的铁路车号识别系统
- 下一篇: PHP配置问题:AppServ安装dis