Advertisement

【srilm语言模型训练】基于srilm的语言模型训练

阅读量:

准备

srilm是一个语言模型训练工具,在训练模型之前需要对文本数据进行处理,得到分好词的文本数据 。分好词的文本数据大概是下图这样。关于srilm的安装和配置可以在其他博客学习。
在这里插入图片描述
同时,我们还需要准备一个词典lexicon.txt ,大家可以自行建立自己的词典或者获取其他已经建立好的词典作为lexicon。词典在这里的作用是我们在训练模型之前需要对文本数据中出现的词进行一个统计。统计每一个词在文本中出现的频率。

然后我们还需要测试数据集 ,我们需要准备一些测试数据集用于测试我们训练的模型性能。

词频统计

在得到了分好词的文本后,需要对文本中的每个词进行一个词频统计,具体的步骤如下:

  1. 处理输入文本:将输入文本(分好词)中没有出现在lexicon中的词替换成,然后生成文件text.no_oov。生成的文本大概如下图。
    在这里插入图片描述
    实现这一步所需要的shell代码:$text代表我们的文本数据的路径,$lexicon是词典的路径。
复制代码
    cat $text | awk -v lex=$lexicon 'BEGIN{while((getline<lex) >0){ seen[$1]=1; } }
      {for(n=1; n<=NF;n++) {  if (seen[$n]) { printf("%s ", $n); } else {printf("<UNK> ");} } printf("\n");}' > $cleantext || exit 1;
  1. 统计text.no_oov (cleantxt)中出现的词的词频并按词频降序排列,生成word.counts。结果如下图:
    在这里插入图片描述
    从图中可以看到第一列为我们的词频,第二列为文本中所有出现过的词。都已经按照降序排好顺序了。代码如下,这步我指定了一个临时文件夹$tmp, 用于存储中间过程的临时文件,使用之前需要创建。
复制代码
    cat $cleantext | awk '{for(n=1;n<=NF;n++) print $n; }' | sort -T $tmp | uniq -c | sort -T $tmp -nr > $dir/word.counts || exit 1;
  1. 把text.no_oov(cleantext)中的所有词和lexicon中的非静音词合并,统计词频,按照词频降序排列,生成unigram.counts。
复制代码
    cat $cleantext | awk '{for(n=1;n<=NF;n++) print $n; }' | cat - <(grep -w -v '!SIL' $lexicon | awk '{print $1}') | sort -T $tmp | uniq -c | sort -nr > $dir/unigram.counts || exit 1;
  1. 用kaldi/tools/kaldi_lm中的get_word_map.pl工具将unigram.counts中的词改成一种简短的形式,生成word_map
复制代码
    cat $dir/unigram.counts  | awk '{print $2}' | kaldi/tools/kaldi_lm/get_word_map.pl "<s>" "</s>" "<UNK>" > $dir/word_map || exit 1;

至此我们就得到了word_map,可以用它来进行ngram语言模型的训练了。

训练

在针对小文本数据量的语言模型训练中,我们可以直接调用srilm中的n-gram-count工具进行训练,但针对大数据量文本数据进行训练时,可能会造成内存溢出的问题,所以针对这个问题,srilm工具箱同时集成了另一个工具make-big-lm,它可以达到把文本数据分块进行处理的功能,节省了内存空间提升了训练效率。后续会详细的介绍这些工具。
训练。srilm工具箱中集成了我们训练语言模型所需要的因素,所以我们只需要调用shell指令来训练即可:

复制代码
    ngram-count -text $sdir/train -order 4 -limit-vocab -vocab $sdir/wordlist -unk -map-unk "<UNK>" -kndiscount -interpolate -lm $sdir/srilm.o4g.kn.gz

text:训练数据集所需要的预料
order 4:采用4元的语言模型(4-gram)

测试:用一些其他的预料来测试我们的语言模型效果。评估的标准采用ppl(困惑度)来进行评估。

复制代码
    ngram -lm $lm -ppl $testfile &

testfile即为我们的测试文本。最终我们会得到一个关于语言模型的测试结果,如下图。在这里我们分别用了七种不同的测试集对语言模型进行测试,每种测试集分别代表一种不同的领域。可以看到我们的语言模型在针对news4000_test这个测试集的ppl是最低的,也就是效果最好。说明我们的语言模型与这个测试集语言领域的关联性最强。
在这里插入图片描述

全部评论 (0)

还没有任何评论哟~