如何在SRILM中实现给定初始类分配的监督式基于类语言模型?
解决SriLM预定义类分配生成LM概率全为-99的问题
我之前在做预定义类的语言模型时也踩过类似的坑,给你几个实用的排查方向:
检查类映射格式是否合规
SriLM对预定义类的映射文件要求很严格:- 每行必须是
[单词] [类ID]的格式,类ID得是整数,不能有特殊字符或空格 - 训练语料里出现的所有单词都必须在映射文件中有对应条目,哪怕是停用词或者低频词,遗漏就会导致未知词处理异常,进而出现全-99的概率
- 每行必须是
核对训练命令的参数配置
一定要确保正确指定了类映射文件,同时加上必要的平滑参数(没有平滑的话,未见过的ngram概率会直接归0,log概率就是-99)。举个正确的命令示例:ngram-count -text train_corpus.txt -class word_class_map.txt -lm output_class_lm.arpa -order 3 -kndiscount -interpolate重点确认
-class参数的位置是否正确,以及输出路径有没有权限问题。验证语料与类映射的一致性
检查语料和映射文件中的单词是否完全匹配:比如大小写是否一致(SriLM默认区分大小写)、有没有拼写错误、是否存在语料里有但映射里没有的词。可以写个简单的脚本遍历语料,把不在映射里的词列出来排查。用小样本测试定位问题
先构建一个极小的测试语料和对应的类映射,比如:
训练语料(test.txt):apple banana apple orange类映射(test_map.txt):
apple 1 banana 2 orange 2用这个小样本跑训练命令,如果生成的LM概率正常,说明问题出在你的大语料或映射文件里,再逐步扩大范围排查。
查看详细日志找线索
运行ngram-count时加上-verbose参数,会输出详细的处理日志,比如是否有未知词、类映射加载是否成功、平滑计算的过程等。这些日志里往往能找到概率异常的具体原因。尝试更新SriLM版本
旧版本的SriLM在处理预定义类语言模型时可能存在bug,建议更新到最新的稳定版本再试。
内容的提问来源于stack exchange,提问作者Ranjeet Singh
相关产品推荐
相关产品推荐

