spaCy 學習 第一篇:核心型別

悅光陰發表於2019-05-10

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物件的檢視。

 

參考文件:

spaCy Architecture

相關文章