spacy資料結構
資料結構
共享詞彙表和字串庫
- 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)
相關文章
- 結構化資料、半結構化資料和非結構化資料
- 【資料結構篇】認識資料結構資料結構
- 資料結構小白系列之資料結構概述資料結構
- 資料結構資料結構
- 資料結構與演算法-資料結構(棧)資料結構演算法
- 【PHP資料結構】PHP資料結構及演算法總結PHP資料結構演算法
- leetcode演算法資料結構題解---資料結構LeetCode演算法資料結構
- mysql資料庫-資料結構MySql資料庫資料結構
- 資料結構 - 圖資料結構
- 14 資料結構資料結構
- 資料結構 - 堆資料結構
- 資料結構 - 棧資料結構
- Map 資料結構資料結構
- 【模板】資料結構資料結構
- 模板 - 資料結構資料結構
- [資料結構]堆資料結構
- Python資料結構Python資料結構
- 資料結構——堆資料結構
- 資料結構-堆資料結構
- 資料結構-集合資料結構
- 資料結構 - 字串資料結構字串
- 資料結構---串資料結構
- 資料結構-棧資料結構
- 資料結構——列表資料結構
- Redis 資料結構Redis資料結構
- 資料結構|前言資料結構
- Java資料結構Java資料結構
- 資料結構——樹資料結構
- Redis資料結構Redis資料結構
- 資料結構-樹資料結構
- 資料結構-Tree資料結構
- 資料結構 - 連結串列資料結構
- 連結串列-資料結構資料結構
- 資料結構—連結串列資料結構
- 資料結構--連結串列資料結構
- 資料結構-連結串列資料結構
- 集合資料結構總結資料結構
- C++資料結構和pb資料結構的轉換C++資料結構