spaCy 是一個號稱工業級的自然語言處理工具包,最核心的資料結構是Doc和Vocab。Doc物件包含Token的序列和Token的註釋(Annotation),Vocab物件是spaCy使用的詞彙表(vocabulary),用於儲存語言中共享的資料,spaCy通過集中儲存字串,單詞向量和詞彙屬性(lexical attribute)等,避免儲存資料的多個副本。
spaCy模組有4個非常重要的類:
- Doc:訪問語言註釋的容器
- Span:Doc物件的一個切片
- Token:單獨的Token,例如,單詞,符號,空格等
- Vocab:儲存詞彙表和語言共享的資料
一,Vocab類
Vocab物件用於儲存詞彙表和語言共享的資料,可以在不同的Doc物件之間共享資料,詞彙表使用Lexeme物件和StringStore物件來表示。
>>> import spacy >>> nlp=spacy.load("en_core_web_lg") >>> apple=nlp.vocab[u'apple']
apple是一個Lexeme物件,vocab還包含一個strings屬性,用於表示把單詞對映到64位的雜湊值,這使得每一個單詞在spaCy中只儲存一份。
1,Lexeme型別
Lexeme物件是詞彙表Vocab中的一個詞條(entry),可以通過該similarity()函式計算兩個詞條的相似性:
apple = nlp.vocab[u"apple"] orange = nlp.vocab[u"orange"] apple_orange = apple.similarity(orange)
Lexeme物件的屬性,通常屬性是成對存在的,不帶下劃線的是屬性的ID形式,帶下劃線的是屬性的文字形式:
- text:文字內容(Verbatim text content)
- orth、orth_:文字ID和文字內容
- lower、lower_:文字的小寫
- is_alpha、is_ascii、is_digit、is_lower、is_upper、is_title、is_punct、is_space:指示文字的型別,返回值是boolean型別
- like_url、like_num、like_email:指示文字是否是url、數字和email,返回值是boolean型別
- sentiment:標量值,用於指示詞彙的積極性
- cluster:布朗Cluster ID
2,StringStore型別
StringStore類是一個string-to-int的物件,通過64位的雜湊值來查詢詞彙,或者把詞彙對映到64位的雜湊值:
>>> from spacy.strings import StringStore >>> stringstore = StringStore([u"apple", u"orange"]) >>> apple_hash = stringstore[u"apple"] >>> apple_hash 8566208034543834098
Vocab的strings屬性是一個StringStore物件,用於儲存共享的詞彙資料:
apple_id=nlp.vocab.strings[u'apple'] >>> apple_id 8566208034543834098
3,Vocab類
在初始化Vocab類時,傳遞引數strings是list或者StringStore物件,得到Vocab物件:
from spacy.vocab import Vocab vocab = Vocab(strings=[u"apple", u"orange"]) >>> vocab.strings[u"apple"] 8566208034543834098
二,Token類
Token是一個單詞、標點符號、空格等,在自然語言處理中,把一個單詞,一個標點符號,一個空格等叫做一個token。
>>> import spacy >>> nlp=spacy.load("en_core_web_sm") >>> doc=nlp("I like apples and oranges") >>> token_apple =doc[2] >>> token_orange=doc[4]
1,Token物件的函式
計算不同token之間的語義相似性
token_apple.similarity(token_orange)
對一段文字,獲得相鄰的token,預設情況下,得到的是下一個相鄰的token:
>>> token_apple.nbor() and
從一段文字種,獲得相連的token:
token_apple.conjuncts
(oranges,)
2,Token物件的屬性
Token物件,除了具有Lexeme物件屬性之外,還具有Token物件特有的屬性:
- doc:父doc
- sent:token所在的Span物件
- text:文字
- orth、orth_:文字ID和文字
- i:token在父doc中的索引
- ent_type、ent_type_:命名實體型別
- lemma、lemma_:token的基本形式(base form)
- norm、norm_:token的標準化形式
- pos、pos_:token的詞性(Coarse-grained POS)
- tag、tag_:token的詞性(Fine-grained POS)
- lower、lower_:token的小寫形式
- is_alpha、is_ascii、is_digit、is_lower、is_upper、is_title、is_punct、is_space
- like_url、like_num、like_email
- sentiment
三,Doc類
對一個文字資料進行分詞之後,Doc物件是token的序列,Span物件是Doc物件的一個切片:
>>> import spacy >>> nlp=spacy.load("en_core_web_sm") >>> doc=nlp("I like apples and oranges")
>>> span=doc[0:3]
1,獲得文字的命名實體
doc.ents
2,獲得文字的名詞塊
doc.noun_chunks
3,獲得文字的句子
doc.sents
4,檢視doc的文字
doc.text
四,Span類
Span物件是Doc物件的一個切片,Span物件的屬性:
- start:span的第一個token在doc中的索引
- end:span的最後一個token在doc中的索引
- text:span的文字
- orth、orth_:span的文字
- lemma_:span的lemma
六,spaCy的架構
Doc物件是由Tokenizer構造,然後由管道(pipeline)的元件進行適當的修改。 Language物件協調這些元件,它接受原始文字並通過管道傳送,返回帶註釋(Annotation)的文件。 文字註釋(Text Annotation)被設計為單一來源:Doc物件擁有資料,Span是Doc物件的檢視。
參考文件: