文章目錄
- spaCy 簡介
- spaCy 安裝
- spaCy的基本使用
- spaCy中的幾個重要類
- spaCy的處理過程(Processing Pipeline)
- 實戰:對中文進行分詞和Word Embedding
spaCy 簡介
spaCy(官方網站,github連結)是一個NLP領域的文本預處理Python庫,包括分詞(Tokenization)、詞性标注(Part-of-speech Tagging, POS Tagging)、依存分析(Dependency Parsing)、詞形還原(Lemmatization)、句子邊界檢測(Sentence Boundary Detection,SBD)、命名實體識别(Named Entity Recognition, NER)等功能。具體支援功能參考連結。
spaCy的特點:
- 支援多種語言
- 使用深度學習模型進行分詞等任務
- 每種語言基本都提供了不同尺寸的模型可供選擇,使用者可根據實際需求選擇。使用者可通過官網連結或github連結查詢模型。
- 簡單易用
spaCy 安裝
pip install spacy -i https://pypi.tuna.tsinghua.edu.cn/simple
若想安裝GPU版,可參考官方文檔
spaCy的基本使用
spacy對所有的任務基本都是4步走:
- 下載下傳模型
- 加載模型
- 對句子進行處理
- 擷取結果
舉例,使用spacy進行英文分詞:
1.首先通過指令下載下傳模型:
python -m spacy download en_core_web_sm
en_core_web_sm
是模型的名稱,可以到該連結搜尋模型。
由于在國内,可能會有下載下傳慢的問題,可以到github搜尋模型,然後使用 pip install some_model.whl
手動安裝
2.加載、使用模型和擷取結果
import spacy # 導包
# 加載模型
nlp = spacy.load("en_core_web_sm")
# 使用模型,傳入句子即可
doc = nlp("Apple is looking at buying U.K. startup for $1 billion")
# 擷取分詞結果
print([token.text for token in doc])
最終輸出為:
['Apple', 'is', 'looking', 'at', 'buying', 'U.K.', 'startup', 'for', '$', '1', 'billion']
spaCy中的幾個重要類
在上一節中,有幾個關鍵對象
-
:該對象為nlp
類(官方文檔連結)。spacy.Language
方法會傳回該類對象。spacy.load
本質就是調了Language.__call__方法nlp("...")
-
: 該對象為doc
(官方文檔連結),裡面包含分詞、詞性标注、詞形還原等結果(具體可參考連結)。spacy.tokens.Doc
是一個可疊代對象。doc
-
: 該對象為token
(官方文檔連結),可以通過該對象擷取每個詞的具體屬性(單詞、詞性等),具體可參考連結。spacy.tokens.token.Token
spaCy的處理過程(Processing Pipeline)

調用
nlp(...)
時會按照上圖的順序執行(先分詞,然後進行詞性标注等等)。對于不需要的元件,可以選擇在加載模型時排除掉:
nlp = spacy.load("en_core_web_sm", exclude=["ner"])
或者禁用掉:
nlp = spacy.load("en_core_web_sm", disable=["tagger", "parser"])
對于禁用,可以在後續想要使用的時候解除禁用:
nlp.enable_pipe("tagger")
所有内置的元件可參考連結
實戰:對中文進行分詞和Word Embedding
1.首先到官方文檔的中文子產品下找到合适的模型。這裡就選擇最小的那個吧。
2.下載下傳模型
python -m spacy download zh_core_web_sm
import spacy # 導包
# 加載模型,并排除掉不需要的components
nlp = spacy.load("zh_core_web_sm", exclude=("tagger", "parser", "senter", "attribute_ruler", "ner"))
# 對句子進行處理
doc = nlp("自然語言處理是計算機科學領域與人工智能領域中的一個重要方向。它研究能實作人與計算機之間用自然語言進行有效通信的各種理論和方法。")
# for循環擷取每一個token與它對應的向量
for token in doc:
# 這裡為了友善展示,隻截取5位,但實際該模型将中文詞編碼成了96維的向量
print(token.text, token.tensor[:5])
自然 [-0.16925007 -0.8783153 -1.4360809 0.14205566 -0.76843846]
語言 [ 0.4438781 -0.82981354 -0.8556605 -0.84820974 -1.0326502 ]
處理 [-0.16880168 -0.24469137 0.05714838 -0.8260342 -0.50666815]
是 [ 0.07762825 0.8785285 2.1840482 1.688557 -0.68410844]
... // 略
和 [ 0.6057179 1.4358768 2.142096 -2.1428592 -1.5056412]
方法 [ 0.5175674 -0.57559186 -0.13569726 -0.5193214 2.6756258 ]
。 [-0.40098143 -0.11951387 -0.12609476 -1.9219975 0.7838618 ]