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)

你可能感兴趣的:(自然语言处理)