如何找到 spaCy 模型的词汇量?

Posted

技术标签:

【中文标题】如何找到 spaCy 模型的词汇量?【英文标题】:How to find the vocabulary size of a spaCy model? 【发布时间】:2020-04-18 07:24:42 【问题描述】:

我正在尝试查找大型英语模型的词汇量,即en_core_web_lg,我找到了三种不同的信息来源:

spaCy 的文档:685k 键,685k 唯一向量

nlp.vocab.__len__(): 1340242 #(词位数)

len(vocab.strings): 1476045

这三者有什么区别?我无法在文档中找到答案。

【问题讨论】:

【参考方案1】:

最有用的数字是与词向量相关的数字。 nlp.vocab.vectors.n_keys 告诉你有多少个词向量有词向量,len(nlp.vocab.vectors) 告诉你有多少个唯一词向量(在md 模型中,多个词可以引用同一个词向量)。

len(vocab) 是缓存词位的数量。在mdlg 模型中,大多数1340242 词位具有一些预先计算的特征(如Token.prob),但是在没有预先计算的特征的缓存中可以有额外的词位,因为在处理文本时可以添加更多条目。

len(vocab.strings) 是与标记和注释相关的字符串的数量(如nsubjNOUN),因此它不是一个特别有用的数字。训练或处理中任何地方使用的所有字符串都存储在这里,以便在需要时可以将内部整数哈希转换回字符串。

【讨论】:

非常感谢您的回复。有没有办法确定哪些字符串具有不同的词向量,哪些映射到同一个向量?所有词汇表外的单词映射到的默认字符串/单词向量是什么? 查看Vectors.dataVectors.key2row:spacy.io/api/vectors#attributes。默认 OOV 为全 0。【参考方案2】:

从spaCy 2.3+开始,根据release notes,nlp.vocab中没有加载词位;所以使用len(nlp.vocab) 是无效的。相反,使用nlp.meta['vectors'] 来查找唯一向量和单词的数量。以下是发行说明中的​​相关部分:

为了减少初始加载时间,nlp.vocab 中的词位是 no 带有向量的模型在初始化时加载的时间更长。正如你 处理文本,词位将自动添加到词汇表中, 就像在没有向量的小型模型中一样。

要查看唯一向量的数量和带有向量的单词数量, 见nlp.meta['vectors'],例如en_core_web_md有 20000 个唯一向量和 684830 个带向量的单词:


    'width': 300,
    'vectors': 20000,
    'keys': 684830,
    'name': 'en_core_web_md.vectors'

【讨论】:

以上是关于如何找到 spaCy 模型的词汇量?的主要内容,如果未能解决你的问题,请参考以下文章

我无法在 EMR PySpark 笔记本中安装 spacy 模型

spaCy 2.0:保存并加载自定义NER模型

将自定义 NER 模型添加到 spaCy 管道

Spacy 从训练模型中提取命名实体关系

每次迭代后保存spacy的NER模型

如何在Spacy语言模型中为空格添加tokenizer异常