spacy資料結構

xiaoxiaoqian0519發表於2021-01-03

資料結構

共享詞彙表和字串庫

  • Vocab:儲存多個文件共享的資料;
  • 為了節省記憶體,spacy將所有字串編碼成雜湊值;
  • 字串只在StringStore中通過nlp.vocab.strings儲存一次;
  • 字串庫:雙向的查詢表
coffee_hash = nlp.vocab.strings["咖啡"]
coffee_string = nlp.vocab.strings[coffee_hash]
  • 如果該字串從未出現過,那麼會出現報錯
  • nlp.vocab.strings中查詢字串和雜湊值
doc = nlp(text)
print("hash_value", nlp.vocab.strings["咖啡"])
print("string_value", nlp.vocab.strings[7689890])
  • doc也會有詞彙表和字串
doc = nlp(text)
print("hash value", doc.vocab.strings["咖啡"])

**ps:**要拿到字串的雜湊值,需要在nlp.vocab.strings中查詢;要拿到一個雜湊值的字串形式,可以查詢雜湊值;

Lexemes

  • 一個Lexeme例項是詞彙表中的一個元素,是詞彙表中和語境無關的元素;
  • 在詞彙表中查詢一個字串或者一個雜湊ID就可以獲得一個lexeme;
doc = nlp("我想喝咖啡")
lexeme = nlp.vocab["咖啡"]
print(lexeme.text, lexeme.orth, lexeme.is_alpha)
lexeme例項中包含一個詞和與語境無關的資訊:片語的文字(lexeme.text, lexeme.orth)、詞彙的屬性(lexeme.is_alpha),但是不包含和語境相關的詞性標註、依存關係和實體標註;
  • 每一個詞彙對應的是一個lexeme,裡面儲存的這詞彙的雜湊ID,要拿到這個詞彙的文字表示,spacy需要在字串庫中查詢它的雜湊值;

Span

from spacy.token import Doc, Span
words = ["Hello", "world", "!"]
spaces = [True, False, False]
doc = Doc(nlp.vocab, words=words, spaces=spaces)
span = Span(doc, 0, 2)
span_with_label = Span(doc, 0, 2, label = "GREETING")
doc.ents = [span_with_label]

對比語義相似度

  • Doc, Token, Span三者都有判斷他們之間相似度的屬性,.similarity;
  • 需要注意的是:需要一個含有詞向量的模型,但是可以是大或者中等模型,不能是小型模型;
  • 可以不同型別的進行比較:span.similarity(doc)

判斷相似度的方法

  • 相似度是通過詞向量計算的;
  • 詞向量是一個詞彙的多維度語義表示;
  • 詞向量是用Word2Vec這樣的演算法在大規模語料上面生成的;
  • 詞向量是spacy的統計模型中的一部分;
  • 預設使用餘弦相似度;
  • Doc和Span的向量預設是由其詞符的平均值計算出來的;

結合規則

統計模型規則系統
使用場景需要根據例子來泛化應用有限個例子組成的字典
真實範例產品名,人名,主賓關係世界上的國家,城市,藥品名,狗的種類
spacy的功能實體識別器,依存關係識別器,詞性標註器分詞器,matcher,phrasematcher
from spacy.matcher import Matcher
matcher = Matcher(nlp.vocab)
pattern = [{"LEMMA": "love", "POS": "VERB"}, {"LOWER": "cat"}]
matcher.add("LOVE_CATS", None, pattern)

pattern = [{"TEXT": "very", "OP": "+"}, {"TEXT": "happy"}]
matcher.add("VERY_HAPPY", None, pattern)

doc = nlp("I love cats and I'm very very happy")
matches = matcher(doc)

example:
遍歷matcher返回的匹配結果,將得到匹配ID以及匹配到的span的起始和終止索引。我們可以利用他們獲得更多的資訊。span例項讓我們可以讀取原始文件以及所有預測出來的詞符屬性和語言特徵。

matcher = Matcher(nlp.vocab)
matcher.add("DOG", None, [{"LOWER": "golden"}, {"LOWER": "retriever"}])
doc = nlp("I have a Golden Retriver")
for match_id, start, end in matcher(doc):
	span = doc[start:end]
	print(span.text)
	print(span.root.text)

PhraseMatcher

from spacy.matcher import PhraseMatcher
matcher = PhraseMatcher(nlp.vocab)
pattern = nlp("Golden Retriver")
matcher.add("DOG", None, pattern)
doc = nlp("I have a Golden Retriver")
for match_id, start, end in matcher(doc):
	span = doc[start:end]
	print(span.text)

相關文章