使用sentence_transformers批量生成BERT嵌入报索引越界如何解决
sentence_transformers批量编码300份文档触发IndexError: list index out of range修复方案
报错核心原因
SentenceTransformer.encode()方法的默认输入要求是原始字符串组成的列表,不需要提前手动做分词处理。你代码中传入的tokenized_docs_smaller是提前分词得到的token列表/嵌套列表结构,和模型内部预处理逻辑的输入预期不匹配,批量处理时就会触发列表索引越界错误。
修复步骤
- 替换输入为原始文本列表
不要传入提前分词的结果,直接传入清洗后的原始文档字符串列表即可,模型内部会自动完成分词、padding、截断等适配操作,参考修正代码:from sentence_transformers import SentenceTransformer model = SentenceTransformer('distilbert-base-nli-mean-tokens') # docs为原始文本列表,单个元素对应一篇文档的字符串内容 embeddings = model.encode(docs, show_progress_bar=True) - 清洗输入的异常数据
如果输入列表中混有None、非字符串类型元素、空值,也会触发该类索引错误,编码前先做一轮数据清洗:cleaned_docs = [] for doc in raw_docs: # 过滤非字符串、空内容异常项 if not isinstance(doc, str) or len(doc.strip()) == 0: cleaned_docs.append("") continue cleaned_docs.append(doc.strip()) - 调小批处理大小
显存/内存不足时,批量加载数据可能出现截断导致索引越界,可手动调低batch_size参数测试,默认值为32,可根据硬件情况降到16或8:embeddings = model.encode( cleaned_docs, show_progress_bar=True, batch_size=16 ) - 校验模型文件完整性
如果以上操作都无法解决,大概率是本地缓存的模型文件损坏,删除本地缓存路径下的distilbert-base-nli-mean-tokens文件夹,重新运行代码自动下载完整模型即可。
内容的提问来源于stack exchange,提问作者Aska
相关产品推荐
相关产品推荐

