如何用Python處理天然語言?(Spacy與Word Embedding)

本文教你用簡單易學的工業級Python天然語言處理軟件包Spacy,對天然語言文本作詞性分析、命名實體識別、依賴關係刻畫,以及詞嵌入向量的計算和可視化。html

盲維

我總愛重複一句芒格愛說的話:python

To the one with a hammer, everything looks like a nail. (手中有錘,看什麼都像釘)git

這句話是什麼意思呢?github

就是你不能只掌握數量不多的方法、工具。web

不然你的認知會被本身能力框住。不僅是存在盲點,而是存在「盲維」。小程序

你會嘗試用不合適的方法解決問題(還自誇「一招鮮,吃遍天」),卻對本來合適的工具視而不見。數組

結果可想而知。瀏覽器

因此,你得在本身的工具箱裏面,多放一些兵刃。微信

最近我又對本身的學生,唸叨芒格這句話。網絡

由於他們開始作實際研究任務的時候,一遇到天然語言處理(Natural Language Processing, NLP),腦子裏想到的就是詞雲情感分析LDA主題建模

爲何?

由於個人專欄和公衆號裏,天然語言處理部分,只寫過這些內容。

你若是認爲,NLP只能作這些事,就大錯特錯了。

看看這段視頻,你大概就能感覺到目前天然語言處理的前沿,已經到了哪裏。

固然,你手頭擁有的工具和數據,尚不能作出Google展現的黑科技效果。

可是,現有的工具,也足可讓你對天然語言文本,作出更豐富的處理結果。

科技的發展,蓬勃迅速。

除了我們以前文章中已介紹過的結巴分詞、SnowNLP和TextBlob,基於Python的天然語言處理工具還有不少,例如 NLTK 和 gensim 等。

我沒法幫你一一熟悉,你可能用到的全部天然語言處理工具。

可是我們不妨開個頭,介紹一款叫作 Spacy 的 Python 工具包。

剩下的,本身觸類旁通。

工具

Spacy 的 Slogan,是這樣的:

Industrial-Strength Natural Language Processing. (工業級別的天然語言處理)

這句話聽上去,是否是有些狂妄啊?

不過人家仍是用數聽說話的。

數據採自同行評議(Peer-reviewed)學術論文:

看完上述的數據分析,咱們大體對於Spacy的性能有些瞭解。

可是我選用它,不只僅是由於它「工業級別」的性能,更是由於它提供了便捷的用戶調用接口,以及豐富、詳細的文檔。

僅舉一例。

上圖是Spacy上手教程的第一頁。

能夠看到,左側有簡明的樹狀導航條,中間是詳細的文檔,右側是重點提示。

僅安裝這一項,你就能夠點擊選擇操做系統、Python包管理工具、Python版本、虛擬環境和語言支持等標籤。網頁會動態爲你生成安裝的語句。

這種設計,對新手用戶,頗有幫助吧?

Spacy的功能有不少。

從最簡單的詞性分析,到高階的神經網絡模型,五花八門。

篇幅所限,本文只爲你展現如下內容:

  • 詞性分析
  • 命名實體識別
  • 依賴關係刻畫
  • 詞嵌入向量的近似度計算
  • 詞語降維和可視化

學完這篇教程,你能夠按圖索驥,利用Spacy提供的詳細文檔,自學其餘天然語言處理功能。

咱們開始吧。

環境

請點擊這個連接(http://t.cn/R35fElv),直接進入我們的實驗環境。

對,你沒看錯。

不須要在本地計算機安裝任何軟件包。只要有一個現代化瀏覽器(包括Google Chrome, Firefox, Safari和Microsoft Edge等)就能夠了。所有的依賴軟件,我都已經爲你準備好了。

打開連接以後,你會看見這個頁面。

不一樣於以前的 Jupyter Notebook,這個界面來自 Jupyter Lab。

你能夠將它理解爲 Jupyter Notebook 的加強版,它具有如下特徵:

  • 代碼單元直接鼠標拖動;
  • 一個瀏覽器標籤,可打開多個Notebook,並且分別使用不一樣的Kernel;
  • 提供實時渲染的Markdown編輯器;
  • 完整的文件瀏覽器;
  • CSV數據文件快速瀏覽
  • ……

圖中左側分欄,是工做目錄下的所有文件。

右側打開的,是我們要使用的ipynb文件。

根據我們的講解,請你逐條執行,觀察結果。

咱們說一說樣例文本數據的來源。

若是你以前讀過個人其餘天然語言處理方面的教程,應該記得這部電視劇。

對,就是"Yes, Minister"。

出於對這部80年代英國喜劇的喜好,我仍是用維基百科上"Yes, Minister"的介紹內容,做爲文本分析樣例。

下面,咱們就正式開始,一步步執行程序代碼了。

我建議你先徹底按照教程跑一遍,運行出結果。

若是一切正常,再將其中的數據,替換爲你本身感興趣的內容

以後,嘗試打開一個空白 ipynb 文件,根據教程和文檔,本身敲代碼,而且嘗試作調整。

這樣會有助於你理解工做流程和工具使用方法。

實踐

咱們從維基百科頁面的第一天然段中,摘取部分語句,放到text變量裏面。

text = "The sequel, Yes, Prime Minister, ran from 1986 to 1988. In total there were 38 episodes, of which all but one lasted half an hour. Almost all episodes ended with a variation of the title of the series spoken as the answer to a question posed by the same character, Jim Hacker. Several episodes were adapted for BBC Radio, and a stage play was produced in 2010, the latter leading to a new television series on UKTV Gold in 2013."
複製代碼

顯示一下,看是否正確存儲。

text
複製代碼
'The sequel, Yes, Prime Minister, ran from 1986 to 1988. In total there were 38 episodes, of which all but one lasted half an hour. Almost all episodes ended with a variation of the title of the series spoken as the answer to a question posed by the same character, Jim Hacker. Several episodes were adapted for BBC Radio, and a stage play was produced in 2010, the latter leading to a new television series on UKTV Gold in 2013.'
複製代碼

沒問題了。

下面咱們讀入Spacy軟件包。

import spacy
複製代碼

咱們讓Spacy使用英語模型,將模型存儲到變量nlp中。

nlp = spacy.load('en')
複製代碼

下面,咱們用nlp模型分析我們的文本段落,將結果命名爲doc。

doc = nlp(text)
複製代碼

咱們看看doc的內容。

doc
複製代碼
The sequel, Yes, Prime Minister, ran from 1986 to 1988. In total there were 38 episodes, of which all but one lasted half an hour. Almost all episodes ended with a variation of the title of the series spoken as the answer to a question posed by the same character, Jim Hacker. Several episodes were adapted for BBC Radio, and a stage play was produced in 2010, the latter leading to a new television series on UKTV Gold in 2013.
複製代碼

好像跟剛纔的text內容沒有區別呀?不仍是這段文本嗎?

彆着急,Spacy只是爲了讓咱們看着舒服,因此只打印出來文本內容。

其實,它在後臺,已經對這段話進行了許多層次的分析。

不信?

咱們來試試,讓Spacy幫咱們分析這段話中出現的所有詞例(token)。

for token in doc:
    print('"' + token.text + '"')
複製代碼

你會看到,Spacy爲咱們輸出了一長串列表。

"The"
"sequel"
","
"Yes"
","
"Prime"
"Minister"
","
"ran"
"from"
"1986"
"to"
"1988"
"."
"In"
"total"
"there"
"were"
"38"
"episodes"
","
"of"
"which"
"all"
"but"
"one"
"lasted"
"half"
"an"
"hour"
"."
"Almost"
"all"
"episodes"
"ended"
"with"
"a"
"variation"
"of"
"the"
"title"
"of"
"the"
"series"
"spoken"
"as"
"the"
"answer"
"to"
"a"
"question"
"posed"
"by"
"the"
"same"
"character"
","
"Jim"
"Hacker"
"."
"Several"
"episodes"
"were"
"adapted"
"for"
"BBC"
"Radio"
","
"and"
"a"
"stage"
"play"
"was"
"produced"
"in"
"2010"
","
"the"
"latter"
"leading"
"to"
"a"
"new"
"television"
"series"
"on"
"UKTV"
"Gold"
"in"
"2013"
"."
複製代碼

你可能不覺得然——這有什麼了不得?

英語原本就是空格分割的嘛!我本身也能編個小程序,以空格分段,依次打印出這些內容來!

別忙,除了詞例內容自己,Spacy還把每一個詞例的一些屬性信息,進行了處理。

下面,咱們只對前10個詞例(token),輸出如下內容:

  • 文本
  • 索引值(即在原文中的定位)
  • 詞元(lemma)
  • 是否爲標點符號
  • 是否爲空格
  • 詞性
  • 標記
for token in doc[:10]:
    print("{0}\t{1}\t{2}\t{3}\t{4}\t{5}\t{6}\t{7}".format(
        token.text,
        token.idx,
        token.lemma_,
        token.is_punct,
        token.is_space,
        token.shape_,
        token.pos_,
        token.tag_
    ))
複製代碼

結果爲:

The 0   the False   False   Xxx DET DT
sequel  4   sequel  False   False   xxxx    NOUN    NN
,   10  ,   True    False   ,   PUNCT   ,
Yes 12  yes False   False   Xxx INTJ    UH
,   15  ,   True    False   ,   PUNCT   ,
Prime   17  prime   False   False   Xxxxx   PROPN   NNP
Minister    23  minister    False   False   Xxxxx   PROPN   NNP
,   31  ,   True    False   ,   PUNCT   ,
ran 33  run False   False   xxx VERB    VBD
from    37  from    False   False   xxxx    ADP IN
複製代碼

看到Spacy在後臺默默爲咱們作出的大量工做了吧?

下面咱們再也不考慮所有詞性,只關注文本中出現的實體(entity)詞彙。

for ent in doc.ents:
    print(ent.text, ent.label_)
複製代碼
1986 to 1988 DATE
38 CARDINAL
one CARDINAL
half an hour TIME
Jim Hacker PERSON
BBC Radio ORG
2010 DATE
UKTV Gold ORG
2013 DATE
複製代碼

在這一段文字中,出現的實體包括日期、時間、基數(Cardinal)……Spacy不只自動識別出了Jim Hacker爲人名,還正確斷定BBC Radio和UKTV Gold爲機構名稱。

若是你平時的工做,須要從海量評論裏篩選潛在競爭產品或者競爭者,那看到這裏,有沒有一點兒靈感呢?

執行下面這段代碼,看看會發生什麼:

from spacy import displacy
displacy.render(doc, style='ent', jupyter=True)
複製代碼

如上圖所示,Spacy幫咱們把實體識別的結果,進行了直觀的可視化。不一樣類別的實體,還採用了不一樣的顏色加以區分。

把一段文字拆解爲語句,對Spacy而言,也是小菜一碟。

for sent in doc.sents:
    print(sent)
複製代碼
The sequel, Yes, Prime Minister, ran from 1986 to 1988.
In total there were 38 episodes, of which all but one lasted half an hour.
Almost all episodes ended with a variation of the title of the series spoken as the answer to a question posed by the same character, Jim Hacker.
Several episodes were adapted for BBC Radio, and a stage play was produced in 2010, the latter leading to a new television series on UKTV Gold in 2013.
複製代碼

注意這裏,doc.sents並非個列表類型。

doc.sents
複製代碼
<generator at 0x116e95e18>
複製代碼

因此,假設咱們須要從中篩選出某一句話,須要先將其轉化爲列表。

list(doc.sents)
複製代碼
[The sequel, Yes, Prime Minister, ran from 1986 to 1988.,
 In total there were 38 episodes, of which all but one lasted half an hour.,
 Almost all episodes ended with a variation of the title of the series spoken as the answer to a question posed by the same character, Jim Hacker.,
 Several episodes were adapted for BBC Radio, and a stage play was produced in 2010, the latter leading to a new television series on UKTV Gold in 2013.]
複製代碼

下面要展現的功能,分析範圍侷限在第一句話。

咱們將其抽取出來,而且從新用nlp模型處理,存入到新的變量newdoc中。

newdoc = nlp(list(doc.sents)[0].text)
複製代碼

對這一句話,咱們想要搞清其中每個詞例(token)之間的依賴關係。

for token in newdoc:
    print("{0}/{1} <--{2}-- {3}/{4}".format(
        token.text, token.tag_, token.dep_, token.head.text, token.head.tag_))
複製代碼
The/DT <--det-- sequel/NN
sequel/NN <--nsubj-- ran/VBD
,/, <--punct-- sequel/NN
Yes/UH <--intj-- sequel/NN
,/, <--punct-- sequel/NN
Prime/NNP <--compound-- Minister/NNP
Minister/NNP <--appos-- sequel/NN
,/, <--punct-- sequel/NN
ran/VBD <--ROOT-- ran/VBD
from/IN <--prep-- ran/VBD
1986/CD <--pobj-- from/IN
to/IN <--prep-- from/IN
1988/CD <--pobj-- to/IN
./. <--punct-- ran/VBD
複製代碼

很清晰,可是列表的方式,彷佛不大直觀。

那就讓Spacy幫咱們可視化吧。

displacy.render(newdoc, style='dep', jupyter=True, options={'distance': 90})
複製代碼

結果以下:

這些依賴關係連接上的詞彙,都表明什麼?

若是你對語言學比較瞭解,應該能看懂。

不懂?查查字典嘛。

跟語法書對比一下,看看Spacy分析得是否準確。

前面咱們分析的,屬於語法層級。

下面咱們看語義。

咱們利用的工具,叫作詞嵌入(word embedding)模型。

以前的文章《如何用Python從海量文本抽取主題?》中,咱們提到過如何把文字表達成電腦能夠看懂的數據。

文中處理的每個單詞,都僅僅對應着詞典裏面的一個編號而已。你能夠把它當作你去營業廳辦理業務時領取的號碼。

它只提供了先來後到的順序信息,跟你的職業、學歷、性別通通沒有關係。

咱們將這樣過於簡化的信息輸入,計算機對於詞義的瞭解,也必然少得可憐。

例如給你下面這個式子:

? - woman = king - queen
複製代碼

只要你學過英語,就不難猜到這裏大機率應該填寫「man」。

可是,若是你只是用了隨機的序號來表明詞彙,又如何可以猜到這裏正確的填詞結果呢?

幸虧,在深度學習領域,咱們可使用更爲順手的單詞向量化工具——詞嵌入(word embeddings )。

如上圖這個簡化示例,詞嵌入把單詞變成多維空間上面的向量。

這樣,詞語就再也不是冷冰冰的字典編號,而是具備了意義。

使用詞嵌入模型,咱們須要Spacy讀取一個新的文件。

nlp = spacy.load('en_core_web_lg')
複製代碼

爲測試讀取結果,咱們讓Spacy打印「minister」這個單詞對應的向量取值。

print(nlp.vocab['minister'].vector)
複製代碼

能夠看到,每一個單詞,用總長度爲300的浮點數組成向量來表示。

順便說一句,Spacy讀入的這個模型,是採用word2vec,在海量語料上訓練的結果。

咱們來看看,此時Spacy的語義近似度判別能力。

這裏,咱們將4個變量,賦值爲對應單詞的向量表達結果。

dog = nlp.vocab["dog"]
cat = nlp.vocab["cat"]
apple = nlp.vocab["apple"]
orange = nlp.vocab["orange"]
複製代碼

咱們看看「狗」和「貓」的近似度:

dog.similarity(cat)
複製代碼
0.80168545
複製代碼

嗯,都是寵物,近似度高,能夠接受。

下面看看「狗」和「蘋果」。

dog.similarity(apple)
複製代碼
0.26339027
複製代碼

一個動物,一個水果,近似度一會兒就跌落下來了。

「狗」和「橘子」呢?

dog.similarity(orange)
複製代碼
0.2742508
複製代碼

可見,類似度也不高。

那麼「蘋果」和「橘子」之間呢?

apple.similarity(orange)
複製代碼
0.5618917
複製代碼

水果間近似度,遠遠超過水果與動物的類似程度。

測試經過。

看來Spacy利用詞嵌入模型,對語義有了必定的理解。

下面爲了好玩,咱們來考考它。

這裏,咱們須要計算詞典中可能不存在的向量,所以Spacy自帶的similarity()函數,就顯得不夠用了。

咱們從scipy中,找到類似度計算須要用到的餘弦函數。

from scipy.spatial.distance import cosine
複製代碼

對比一下,咱們直接代入「狗」和「貓」的向量,進行計算。

1 - cosine(dog.vector, cat.vector)
複製代碼
0.8016855120658875
複製代碼

除了保留數字外,計算結果與Spacy自帶的similarity()運行結果沒有差異。

咱們把它作成一個小函數,專門處理向量輸入。

def vector_similarity(x, y):
    return 1 - cosine(x, y)
複製代碼

用咱們自編的類似度函數,測試一下「狗」和「蘋果」。

vector_similarity(dog.vector, apple.vector)
複製代碼
0.2633902430534363
複製代碼

與剛纔的結果對比,也是一致的。

咱們要表達的,是這個式子:

? - woman = king - queen
複製代碼

咱們把問號,稱爲 guess_word

因此

guess_word = king - queen + woman
複製代碼

咱們把右側三個單詞,通常化記爲 words。編寫下面函數,計算guess_word取值。

def make_guess_word(words):
    [first, second, third] = words
    return nlp.vocab[first].vector - nlp.vocab[second].vector + nlp.vocab[third].vector
複製代碼

下面的函數就比較暴力了,它實際上是用咱們計算的 guess_word 取值,和字典中所有詞語一一覈對近似性。把最爲近似的10個候選單詞打印出來。

def get_similar_word(words, scope=nlp.vocab):

    guess_word = make_guess_word(words)

    similarities = []

    for word in scope:
        if not word.has_vector:
            continue

        similarity = vector_similarity(guess_word, word.vector)
        similarities.append((word, similarity))


    similarities = sorted(similarities, key=lambda item: -item[1])
    print([word[0].text for word in similarities[:10]])
複製代碼

好了,遊戲時間開始。

咱們先看看:

? - woman = king - queen
複製代碼

即:

guess_word = king - queen + woman
複製代碼

輸入右側詞序列:

words = ["king", "queen", "woman"]
複製代碼

而後執行對比函數:

get_similar_word(words)
複製代碼

這個函數運行起來,須要一段時間。請保持耐心。

運行結束以後,你會看到以下結果:

['MAN', 'Man', 'mAn', 'MAn', 'MaN', 'man', 'mAN', 'WOMAN', 'womAn', 'WOman']
複製代碼

原來字典裏面,「男人」(man)這個詞彙有這麼多的變形啊。

可是這個例子太經典了,咱們嘗試個新鮮一些的:

? - England = Paris - London
複製代碼

即:

guess_word = Paris - London + England
複製代碼

對你來說,絕對是簡單的題目。左側國別,右側首都,對應來看,天然是巴黎所在的法國(France)。

問題是,Spacy能猜對嗎?

咱們把這幾個單詞輸入。

words = ["Paris", "London", "England"]
複製代碼

讓Spacy來猜:

get_similar_word(words)
複製代碼
['france', 'FRANCE', 'France', 'Paris', 'paris', 'PARIS', 'EUROPE', 'EUrope', 'europe', 'Europe']
複製代碼

結果很使人振奮,前三個都是「法國」(France)。

下面咱們作一個更有趣的事兒,把詞向量的300維的高空間維度,壓縮到一張紙(二維)上,看看詞語之間的相對位置關係。

首先咱們須要讀入numpy軟件包。

import numpy as np
複製代碼

咱們把詞嵌入矩陣先設定爲空。一下子慢慢填入。

embedding = np.array([])
複製代碼

須要演示的單詞列表,也先空着。

word_list = []
複製代碼

咱們再次讓Spacy遍歷「Yes, Minister」維基頁面中摘取的那段文字,加入到單詞列表中。注意此次咱們要進行判斷:

  • 若是是標點,丟棄;
  • 若是詞彙已經在詞語列表中,丟棄。
for token in doc:
    if not(token.is_punct) and not(token.text in word_list):
        word_list.append(token.text)
複製代碼

看看生成的結果:

word_list
複製代碼
['The',
 'sequel',
 'Yes',
 'Prime',
 'Minister',
 'ran',
 'from',
 '1986',
 'to',
 '1988',
 'In',
 'total',
 'there',
 'were',
 '38',
 'episodes',
 'of',
 'which',
 'all',
 'but',
 'one',
 'lasted',
 'half',
 'an',
 'hour',
 'Almost',
 'ended',
 'with',
 'a',
 'variation',
 'the',
 'title',
 'series',
 'spoken',
 'as',
 'answer',
 'question',
 'posed',
 'by',
 'same',
 'character',
 'Jim',
 'Hacker',
 'Several',
 'adapted',
 'for',
 'BBC',
 'Radio',
 'and',
 'stage',
 'play',
 'was',
 'produced',
 'in',
 '2010',
 'latter',
 'leading',
 'new',
 'television',
 'on',
 'UKTV',
 'Gold',
 '2013']
複製代碼

檢查了一下,一長串(63個)詞語列表中,沒有出現標點。一切正常。

下面,咱們把每一個詞彙對應的空間向量,追加到詞嵌入矩陣中。

for word in word_list:
    embedding = np.append(embedding, nlp.vocab[word].vector)
複製代碼

看看此時詞嵌入矩陣的維度。

embedding.shape
複製代碼
(18900,)
複製代碼

能夠看到,全部的向量內容,都被放在了一個長串上面。這顯然不符合咱們的要求,咱們將不一樣的單詞對應的詞向量,拆解到不一樣行上面去。

embedding = embedding.reshape(len(word_list), -1)
複製代碼

再看看變換後詞嵌入矩陣的維度。

embedding.shape
複製代碼
(63, 300)
複製代碼

63個詞彙,每一個長度300,這就對了。

下面咱們從scikit-learn軟件包中,讀入TSNE模塊。

from sklearn.manifold import TSNE
複製代碼

咱們創建一個同名小寫的tsne,做爲調用對象。

tsne = TSNE()
複製代碼

tsne的做用,是把高維度的詞向量(300維)壓縮到二維平面上。咱們執行這個轉換過程:

low_dim_embedding = tsne.fit_transform(embedding)
複製代碼

如今,咱們手裏擁有的 low_dim_embedding ,就是63個詞彙下降到二維的向量表示了。

咱們讀入繪圖工具包。

import matplotlib.pyplot as plt
%pylab inline
複製代碼

下面這個函數,用來把二維向量的集合,繪製出來。

若是你對該函數內容細節不理解,不要緊。由於我尚未給你係統介紹過Python下的繪圖功能。

好在這裏咱們只要會調用它,就能夠了。

def plot_with_labels(low_dim_embs, labels, filename='tsne.pdf'):
    assert low_dim_embs.shape[0] >= len(labels), "More labels than embeddings"
    plt.figure(figsize=(18, 18))  # in inches
    for i, label in enumerate(labels):
        x, y = low_dim_embs[i, :]
        plt.scatter(x, y)
        plt.annotate(label,
                 xy=(x, y),
                 xytext=(5, 2),
                 textcoords='offset points',
                 ha='right',
                 va='bottom')
    plt.savefig(filename)
複製代碼

終於能夠進行降維後的詞向量可視化了。

請執行下面這條語句:

plot_with_labels(low_dim_embedding, word_list)
複製代碼

你會看到這樣一個圖形。

請注意觀察圖中的幾個部分:

  • 年份
  • 同一單詞的大小寫形式
  • Radio 和 television
  • a 和 an

看看有什麼規律沒有?

我發現了一個有意思的現象——每次運行tsne,產生的二維可視化圖都不同!

不過這也正常,由於這段話之中出現的單詞,並不是都有預先訓練好的向量。

這樣的單詞,被Spacy進行了隨機化等處理。

所以,每一次生成高維向量,結果都不一樣。不一樣的高維向量,壓縮到二維,結果天然也會有區別。

問題來了,若是我但願每次運行的結果都一致,該如何處理呢?

這個問題,做爲課後思考題,留給你自行解答。

細心的你可能發現了,執行完最後一條語句後,頁面左側邊欄文件列表中,出現了一個新的pdf文件。

這個pdf,就是你剛剛生成的可視化結果。你能夠雙擊該文件名稱,在新的標籤頁中查看。

看,就連pdf文件,Jupyter Lab也能正確顯示。

下面,是練習時間。

請把ipynb出現的文本內容,替換爲你感興趣的段落和詞彙,再嘗試運行一次吧。

源碼

執行了所有代碼,而且嘗試替換了本身須要分析的文本,成功運行後,你是否是頗有成就感?

你可能想要更進一步挖掘Spacy的功能,而且但願在本地復現運行環境與結果。

沒問題,請使用這個連接t.cn/R35MIKh)下載本文用到的所有源代碼和運行環境配置文件(Pipenv)壓縮包。

若是你知道如何使用github,也歡迎用這個連接t.cn/R35MEqk)訪問對應的github repo,進行clone或者fork等操做。

固然,要是能給個人repo加一顆星,就更好了。

謝謝!

小結

本文利用Python天然語言處理工具包Spacy,很是簡要地爲你演示瞭如下NLP功能:

  • 詞性分析
  • 命名實體識別
  • 依賴關係刻畫
  • 詞嵌入向量的近似度計算
  • 詞語降維和可視化

但願學過以後,你成功地在工具箱裏又添加了一件趁手的兵器。

願它在之後的研究和工做中,助你披荊斬棘,馬到成功。

加油!

討論

你以前作過天然語言處理項目嗎?使用過哪些工具包?除了本文介紹的這些基本功能外,你以爲還有哪些NLP功能是很是基礎而重要的?你是如何學習它們的呢?歡迎留言,把你的經驗和思考分享給你們,咱們一塊兒交流討論。

喜歡請點贊。還能夠微信關注和置頂個人公衆號「玉樹芝蘭」(nkwangshuyi)

若是你對數據科學感興趣,不妨閱讀個人系列教程索引貼《如何高效入門數據科學?》,裏面還有更多的有趣問題及解法。

相關文章
相關標籤/搜索