使用SRILM這個工具編寫語言模型工具的問題就是內存不怎么夠。。。,內存最多就3G,還在跑另外的一個程序,所以想要一次訓練完是不可能的,在http://www-speech.sri.com/projects/srilm/manpages/srilm-faq.7.html給出了一個解決的辦法,那就是將大文件拆分成多個小文件,然后再將多個小文件的count合並,完成最終的訓練。具體的做法如下:
首先使用split將一個大文件分成最多26*26(使用字母后綴,這是默認的行為)或者是100(使用數字后綴,需要-d參數)個文件,可以將文件按行拆分(使用-l num參數)或者是按大小拆分(使用-b size參數),還可以給出文件的前綴(或者使用默認的x)。在進行拆分的時候將文件會將每num行放到一個文件中,文件按字母序產生,對於語言模型的使用來說需要命令:split -l NUM_LINE_OF_FILE BigFiles [ Prefix-name ] [ -d ]
然后使用make-batch-counts腳本:make-batch-counts file-list 5 cat counts -order 5 -sort,file-list是個文件名,這個文件存儲了你分割大文件而得到的小文件的文件名;5的意識是每5個小文件用於一次ngram-count訓練,獲得對應的count文件;cat 是用於過濾輸出的腳本名,我們這里直接輸出;后面的是傳給ngram-count的參數,可以自己隨便寫
再是使用merge-batch-counts將所有的小count文件合並成一個大的count文件: merge-batch-counts [ -l N ] counts [ filename-list ],將counts目錄下的所有文件合並成一個文件,如果有些文件不用參與合並,可以在最后添加一個filename-list,只有在filename-list里面出現的文件才會被用於合並;-l N參數之處,一次同時合並N個文件。
最后使用make-big-lm腳本,參數類似於ngram-count。make-big-lm -read *.gz -order 5 -lm my.lm