網(wǎng)易云課堂AI工程師(自然語言處理)學(xué)習(xí)筆記秩贰,接上一篇《英文文本處理工具庫1 — NLTK》。
1. spaCy簡介
spaCy 帶有預(yù)先訓(xùn)練的統(tǒng)計模型和單詞向量帕涌,目前支持 34+語言的標(biāo)記(暫不支持中文)。它具有世界上速度最快的句法分析器溜嗜,用于標(biāo)簽的卷積神經(jīng)網(wǎng)絡(luò)模型宵膨,解析和命名實體識別以及與深度學(xué)習(xí)整合。
2. spaCy與NLTK的對比
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ù)更新中锡垄,要不要點個小??鼓勵鼓勵我(????)