Spacy en_core_web_sm词表长度远低于参考值问题咨询
Spacy
len(doc.vocab) 数值远小于预期的原因及解决方案 问题原因
- 版本机制差异:你参考的Udemy课程大概率使用的是Spacy 2.x版本,该版本默认会预加载模型的全部词表到内存中,因此加载中等体量的模型后
len(doc.vocab)会达到5万+的量级;而你本地安装的是Spacy 3.x及以上版本,该版本改为了懒加载词表机制,只会把当前处理文本中出现过的词汇、以及少量内置特殊标记加入到doc.vocab中,所以如果你的测试文本较短,最终统计出来的长度就只有几百个。 - 测量对象错误:
doc.vocab统计的是当前文档关联的已加载词项,并非模型内置的全量预训练词表,即便你下载了大体积带词向量的模型,没有触发全量加载的前提下,doc.vocab也不会包含全量词项。 - 模型匹配问题:如果下载的是
en_core_web_sm这类小体量模型,本身就不携带静态预训练词向量,自然也不会有全量词表数据。
解决方案
- 方案1:匹配课程环境降级版本
如果你只是为了复现课程的操作结果,可以直接将本地Spacy及对应模型降级到2.x版本,执行以下命令安装即可:
安装完成后加载模型处理文本,pip install spacy==2.3.7 python -m spacy download en_core_web_md==2.3.1len(doc.vocab)即可得到和课程一致的5万+结果。 - 方案2:Spacy 3.x版本下正确统计全量词表
如果你不想降级版本,不要用len(doc.vocab)统计全量词表,改为统计模型的预训练向量长度即可,对应代码为:
该输出值就是模型内置的全量预训练词项数量,和课程给出的数值一致。import spacy nlp = spacy.load("en_core_web_md") print(len(nlp.vocab.vectors)) - 方案3:Spacy 3.x手动触发全量词表加载
如果你确实需要让doc.vocab包含全量词项,可以手动遍历向量列表触发加载,代码如下:
执行后即可得到和课程一致的统计结果。import spacy nlp = spacy.load("en_core_web_md") # 遍历所有向量键,触发词项加载到vocab for key in nlp.vocab.vectors.keys(): _ = nlp.vocab[key] doc = nlp("你的测试文本") print(len(doc.vocab))
内容的提问来源于stack exchange,提问作者nlpkind
相关产品推荐
相关产品推荐

