英語文本處理工具庫2 — spaCy

網(wǎng)易云課堂AI工程師(自然語言處理)學(xué)習(xí)筆記秩贰,接上一篇《英文文本處理工具庫1 — NLTK》


1. spaCy簡介

spaCy
spaCy是Python和Cython中的高級自然語言處理庫捐顷,它建立在最新的研究基礎(chǔ)之上幻工,從一開始就設(shè)計用于實際產(chǎn)品。

spaCy 帶有預(yù)先訓(xùn)練的統(tǒng)計模型和單詞向量帕涌,目前支持 34+語言的標(biāo)記(暫不支持中文)。它具有世界上速度最快的句法分析器溜嗜,用于標(biāo)簽的卷積神經(jīng)網(wǎng)絡(luò)模型宵膨,解析和命名實體識別以及與深度學(xué)習(xí)整合。

2. spaCy與NLTK的對比

image.png

3. spaCy安裝

windows + Anoconda環(huán)境炸宵,使用conda命令安裝比較方便:

conda config --add channels conda-forge
conda install spacy
python -m spacy download en

參考:Windows下在anaconda環(huán)境中安裝自然語言處理工具---Spacy

4. spaCy基本操作

(1)英文Tokenization(標(biāo)記化/分詞)

import spacy
nlp = spacy.load('en')

doc = nlp('Hello! My name is LittleTree!')
print("分詞如下:")
for token in doc:
    print(token.text)

print("\n斷句如下:")
for sent in doc.sents:
    print(sent)
輸出

每個token對象有著非常豐富的屬性辟躏,如下的方式可以取出其中的部分屬性。

doc = nlp("Next week I'll be in SZ.")
for token in doc:
    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_
    ))
輸出

(2)詞性標(biāo)注

doc = nlp("Next week I'll be in Shanghai.")
print([(token.text, token.tag_) for token in doc])

輸出:
[('Next', 'JJ'), ('week', 'NN'), ('I', 'PRP'), ("'ll", 'MD'), ('be', 'VB'), ('in', 'IN'), ('Shanghai', 'NNP'), ('.', '.')]

(3)命名實體識別

doc = nlp("Next week I'll be in Shanghai.")
for ent in doc.ents:
    print(ent.text, ent.label_)

輸出:
Next week DATE
Shanghai GPE

還可以用非常漂亮的可視化做顯示:

from spacy import displacy

displacy.render(doc, style='ent', jupyter=True)
輸出

(4)chunking/組塊分析

spaCy可以自動檢測名詞短語土全,并輸出根(root)詞捎琐,比如下面的"Journal","piece","currencies".

doc = nlp("Wall Street Journal just published an interesting piece on crypto currencies")
for chunk in doc.noun_chunks:
    print(chunk.text, chunk.label_, chunk.root.text)
輸出

(5)句法依存解析

doc = nlp('Wall Street Journal just published an interesting piece on crypto currencies')
 
for token in doc:
    print("{0}/{1} <--{2}-- {3}/{4}".format(
        token.text, token.tag_, token.dep_, token.head.text, token.head.tag_))
輸出

(6)詞向量使用

NLP中有一個非常強大的文本表示學(xué)習(xí)方法叫做word2vec会涎,通過詞的上下文學(xué)習(xí)到詞語的稠密向量化表示,同時在這個表示形態(tài)下瑞凑,語義相關(guān)的詞在向量空間中會比較接近末秃。也有類似v(爺爺)-v(奶奶) ≈ v(男人)-v(女人)的關(guān)系。

關(guān)于詞向量的詳細(xì)內(nèi)容籽御,請參考吳恩達序列模型第二課自然語言處理與詞嵌入

在spaCy中练慕,要使用英文的詞向量,需先下載預(yù)先訓(xùn)練好的結(jié)果技掏,終端命令如下:

python3 -m spacy download en_core_web_lg

下面我們使用詞向量來做一些有趣的事情铃将。

nlp = spacy.load('en_core_web_lg')
from scipy import spatial

# 余弦相似度計算
cosine_similarity = lambda x, y: 1 - spatial.distance.cosine(x, y)

# 男人、女人哑梳、國王劲阎、女王 的詞向量
man = nlp.vocab['man'].vector
woman = nlp.vocab['woman'].vector
queen = nlp.vocab['queen'].vector
king = nlp.vocab['king'].vector
 
# 我們對向量做一個簡單的計算,"man" - "woman" + "queen"
maybe_king = man - woman + queen
computed_similarities = []

# 掃描整個詞庫的詞向量做比對鸠真,召回最接近的詞向量
for word in nlp.vocab:
    if not word.has_vector:
        continue
 
    similarity = cosine_similarity(maybe_king, word.vector)
    computed_similarities.append((word, similarity))

# 排序與最接近結(jié)果展示
computed_similarities = sorted(computed_similarities, key=lambda item: -item[1])
print([w[0].text for w in computed_similarities[:10]])

輸出:
['Queen', 'QUEEN', 'queen', 'King', 'KING', 'king', 'KIng', 'Kings', 'KINGS', 'kings']

(7)詞匯與文本相似度

在詞向量的基礎(chǔ)上悯仙,spaCy提供了從詞到文檔的相似度計算的方法,下面的例子是它的使用方法吠卷。

# 詞匯語義相似度(關(guān)聯(lián)性)
banana = nlp.vocab['banana']
dog = nlp.vocab['dog']
fruit = nlp.vocab['fruit']
animal = nlp.vocab['animal']
 
print(dog.similarity(animal), dog.similarity(fruit)) # 0.6618534 0.23552845
print(banana.similarity(fruit), banana.similarity(animal)) # 0.67148364 0.2427285
# 文本語義相似度(關(guān)聯(lián)性)
target = nlp("Cats are beautiful animals.")
 
doc1 = nlp("Dogs are awesome.")
doc2 = nlp("Some gorgeous creatures are felines.")
doc3 = nlp("Dolphins are swimming mammals.")
 
print(target.similarity(doc1))  # 0.8901765218466683
print(target.similarity(doc2))  # 0.9115828449161616
print(target.similarity(doc3))  # 0.7822956752876101

持續(xù)更新中锡垄,要不要點個小??鼓勵鼓勵我(????)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市撤嫩,隨后出現(xiàn)的幾起案子偎捎,更是在濱河造成了極大的恐慌,老刑警劉巖序攘,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茴她,死亡現(xiàn)場離奇詭異,居然都是意外死亡程奠,警方通過查閱死者的電腦和手機丈牢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瞄沙,“玉大人己沛,你說我怎么就攤上這事【嗑常” “怎么了申尼?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長垫桂。 經(jīng)常有香客問我师幕,道長,這世上最難降的妖魔是什么诬滩? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任霹粥,我火速辦了婚禮灭将,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘后控。我一直安慰自己庙曙,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布浩淘。 她就那樣靜靜地躺著捌朴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪馋袜。 梳的紋絲不亂的頭發(fā)上男旗,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天舶斧,我揣著相機與錄音欣鳖,去河邊找鬼。 笑死茴厉,一個胖子當(dāng)著我的面吹牛泽台,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播矾缓,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼怀酷,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了嗜闻?” 一聲冷哼從身側(cè)響起蜕依,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎琉雳,沒想到半個月后样眠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡翠肘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年檐束,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片束倍。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡被丧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出绪妹,到底是詐尸還是另有隱情甥桂,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布邮旷,位于F島的核電站黄选,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏廊移。R本人自食惡果不足惜糕簿,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一探入、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧懂诗,春花似錦蜂嗽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至离唐,卻和暖如春病附,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背亥鬓。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工完沪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人嵌戈。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓覆积,卻偏偏與公主長得像,于是被迫代替她去往敵國和親熟呛。 傳聞我的和親對象是個殘疾皇子宽档,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容