如何解决OpenNLP LemmatizerTrainer的UTFDataFormatException异常?
异常原因
这个错误是Java内置DataOutputStream.writeUTF()方法的固有限制导致的:该方法最多支持写入长度不超过65535字节的UTF编码字符串,你训练生成的模型特征集过大,序列化时产生的字符串长度达到383769字节,超出了上限,属于旧版OpenNLP的已知问题,在训练大语种、大规模语料的模型时很容易触发。
解决方法
- 优先升级OpenNLP到1.9.4及以上的稳定版本,该版本已经官方修复了模型序列化时的UTF长度限制问题,升级后重新执行训练命令即可正常写入模型文件。
- 若暂时无法升级版本,可修改训练参数文件
params.txt,调高特征截断阈值cutoff的数值,比如从默认值5调整到10~15,过滤出现频率极低的冗余特征,降低总特征量,使序列化字符串长度降到64K限制以内。 - 也可以将全量训练集拆分为多个小批次分别训练,再用OpenNLP自带的模型合并工具拼接为最终模型,该方案的训练效果略逊于全量训练,仅作为备选方案。
- 如果你有自定义编译源码的需求,可直接修改
BinaryGISModelWriter类的writeUTF实现,绕过DataOutputStream.writeUTF()的长度限制:先写入UTF字符串的字节长度,再直接写入字节数组即可,修改后需自行测试生成模型的兼容性。
内容的提问来源于stack exchange,提问作者wero026
相关产品推荐
相关产品推荐

