SRILM là bộ công cụ hỗ trợ đắc lực cho chúng ta trong việc xây dựng các mô hình ngôn ngữ thống kê (Language Model), bài toán này thường được sử dụng trong nhận dạng giọng nói(auto speech recognition), gắn thẻ(statistical tagging), phân đoạn(segmentation) và dịch máy(machine translation). Bài viết này Lập trình không khó xin chia sẻ cách cài đặt SRILM trên Ubuntu.
Cài đặt srilm trên Ubuntu
Để cài đặt srilm, việc đầu tiên là bạn vào đây để download(nên download phiên bản mới nhất, hiện tại là bản 1.7.2): http://www.speech.sri.com/projects/srilm/download.html
Sau khi download xong, bạn sẽ được một file nén. Giờ chúng ta sẽ cài nó vào trong `/usr/share/srilm`. Do vậy, bạn hãy mở Terminal tại nơi chứa file vừa tải về mà thực thi các command dưới đây:
$ sudo mkdir /usr/share/srilm $ sudo mv srilm-1.7.2.tar.gz /usr/share/srilm $ cd /usr/share/srilm $ sudo tar xzf srilm-1.7.2.tar.gz
Do chúng ta đang thao tác trong vùng nhớ hệ điều hành nên các command phải được thực thi với quyền super user.
Tiếp theo, bạn cần sửa đường dẫn cài đặt của nó, mở Makefile trong thư mục srilm
vừa giải nén và sửa như sau:
$ sudo gedit Makefile // Ở dòng 7 của Makefile có dòng này: # SRILM = /home/speech/stolcke/project/srilm/devel // Bạn hãy thay thế dòng trên thành nội dung như sau: SRILM = /usr/share/srilm // Lưu file, quay lại Terminal
Sau khi quay lại Terminal, tiếp tục thực hiện các lệnh sau:
$ sudo apt-get install tcsh // Nếu là Ubuntu x64 $ sudo make NO_TCL=1 MACHINE_TYPE=i686-m64 World $ /usr/share/srilm/bin/i686-m64/ngram-count -help #Test install success // Nếu là Ubuntu x32 $ sudo make NO_TCL=1 MACHINE_TYPE=i686-gcc4 World $ /usr/share/srilm/bin/i686-gcc4/ngram-count -help #Test install success
Một số lỗi khi cài đặt srilm
- Lỗi
libiconv
: https://stackoverflow.com/questions/51552703
Xây dựng mô hình ngôn ngữ với srilm
Bạn vừa mới cài thành công srilm trên Ubuntu. Bây giờ chúng ta sẽ đi build thử một cái language model và đánh giá nó nhé. Chúng ta sẽ sử dụng ngram-count
để xây language model và sử dụng ngram
để đánh giá perplexity của language model sau khi xây xong.
Máy mình là Ubuntu x64 nên đường dẫn tới ngram-count
và ngram
nằm trong thư mục `/usr/share/srilm/bin/i686-m64/`.
Bây giờ chúng ta sẽ cần có một bộ corpus(một file chứa nhiều câu văn) và bộ từ điển từ đơn tiếng việt(vocab) để chạy thử language model. Bạn có thể download dữ liệu demo của tôi tại đây.
Bạn có thể để 2 file này ở bất cứ thư mục nào, rồi mở terminal tại đó để thực thi lệnh sau để train language model trên tập dữ liệu train.txt
:
$ /usr/share/srilm/bin/i686-m64/ngram-count -lm model.arpa -kndiscount1 -gt1min 0 -kndiscount2 -gt2min 1 -kndiscount3 -gt3min 1 -kndiscount4 -gt4min 2 -order 4 -text ./train.txt -vocab ./vocab.txt -sort
Các tham số:
- order: chọn số gram tối đa, mặc định là 3-gram
- gtnmin: tần suất tối thiểu của n-gram
Nếu như bước này thành công, thư mục này sẽ có thêm một file mới có tên model.arpa. File này có định dạng ARPA. Bạn có thể mở lên bằng một text editer bất kỳ để xem.
# Một vài dòng đầu của model.arpa data ngram 1=17968 ngram 2=7633 ngram 3=9780 ngram 4=789 1-grams: -1.276263 </s> -99 <s> -0.1703026 -3.789454 a -0.07848597 -3.793878 ai -0.09667012 -4.256616 am -0.102116 -3.171115 an -0.07520207 -4.901993 ang -3.262849 anh -0.07258336 -3.538889 ao -0.1398861 -4.901993 au -4.901993 ay -2.36961 ba -0.2446924 -4.901993 bai -4.901993 bam -3.171115 ban -0.1293306 -4.901993 bang -4.901993 banh -3.789454 bao -0.06994798
Đánh giá language model có hoạt động tốt không trên tập dữ liệu mới test.txt
như sau:
$ /usr/share/srilm/bin/i686-m64/ngram -order 4 -lm model.arpa -ppl test.txt -debug 2 > eval.out
Sau đó bạn mở file eval.out
để xem kết quả. Câu có điểm perplexity càng thấp thì chứng tỏ language model của chúng ta là tốt với câu đó. Kéo xuống cuối file để xem perplexity của cả tập test.
file test.txt: 200 sentences, 2750 words, 68 OOVs 0 zeroprobs, logprob= -6134.3 ppl= 134.427 ppl1= 193.736
Giảm kích thước của language model
– Để giảm kích thước lưu trữ trên máy tính, bạn hãy lưu language model ở dạng file nén, srilm hỗ trợ việc đọc/ghi file nén cho bạn luôn, bạn chỉ cần chỉ định output model có đuôi .gz là được:
$ /usr/share/srilm/bin/i686-m64/ngram-count -lm model.gz -kndiscount1 -gt1min 0 -kndiscount2 -gt2min 1 -kndiscount3 -gt3min 1 -kndiscount4 -gt4min 2 -order 4 -text ./train.txt -vocab ./vocab.txt -sort
– Bạn cũng có thể ghi LM file ở dạng binary bằng cách sau:
$ ngram -order N -lm OLDLM -write-bin-lm NEWLM $ /usr/share/srilm/bin/i686-m64/ngram-count -write-binary-lm -lm model.gz -kndiscount1 -gt1min 0 -kndiscount2 -gt2min 1 -kndiscount3 -gt3min 1 -kndiscount4 -gt4min 2 -order 4 -text ./train.txt -vocab ./vocab.txt -sort
– Đặc biệt, khi train lm thì output của file thường rất lớn dẫn đến việc khó khăn hoặc không thể deploy ở các máy cấu hình yếu, khi đó bạn có thể xem xét việc cắt tỉa file lm của mình như sau:
$ ngram -order 4 -lm mixed.arpa -prune 1e-8 -write-lm mixed_pruned.arpa
Ở đây 1e-8 là con số mình minh họa, bạn có thể tăng/giảm nó để có được kích thước lm phù hợp. Tất nhiên là việc cắt tỉa này sẽ ảnh hưởng đến một chút tới perplexity nhưng đôi khi ta cần đánh đổi.
Tài liệu tham khảo thêm
- http://www.speech.sri.com/projects/srilm/manpages/ngram-count.1.html
- http://idiom.ucsd.edu/~rlevy/teaching/2015winter/lign165/lectures/lecture13/lecture13_ngrams_with_SRILM.pdf
Chúc các bạn thành công!
Để lại một bình luận