nlp.vocab 和 nlp.vocab.strings 有什么区别?

What is the difference between nlp.vocab and nlp.vocab.strings?

我正在学习NLP,我想看看我用spacy下载的词汇总量。

import spacy

nlp = spacy.load('en_core_web_trf')
nlp2 = spacy.load('en_core_web_sm')

在导入 Spacy 并加载大包和小包后,我检查了这些:

len(nlp.vocab)

给出 770,

len(nlp2.vocab)

给出 761,

len(nlp.vocab.strings)

给出 83934,

len(nlp2.vocab.strings)

给出 83914。

它们有什么不同以及为什么不同? 如何查看每个包裹的总词汇数?

len(nlp.vocab) 是缓存词素的数量,因此当您在某些词上使用模型时,它可能会有所不同。

len(nlp.vocab.strings) 将字符串映射到哈希值,反之亦然。它可以给你不同字符串的数量。例如,对于模型 en_core_web_md,这将为您提供 701800

如果你想访问的话,试试:

words=[]
for x in nlp.vocab.strings:
    words.append(x)

spaCy v2.3 或 v3 中没有真正的“词汇”计数。您应该主要将 nlp.vocabnlp.vocab.strings 视为总计数不是有意义值的缓存。 nlp.vocab Vocab 不是静态的,它会随着您使用管道处理文本而增长。

vocab 是 Lexeme 个对象的缓存,nlp.vocab.strings StringStore 是字符串哈希的缓存。 vocab 包含之前在管道处理的某些文本中看到的标记的词素,字符串存储包含之前看到的字符串,作为标记或注释(POS 标签、引理、依赖标签)。

字符串存储不是 100% 的缓存,可能包含在训练期间添加的字符串,这些字符串以前未在当前加载的管道中使用过,但字符串存储的大小不会告诉您有关管道的任何信息性能。