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對象的視圖。
參考文檔: