KenLM은 n-gram 확률을 추정하기 위해 보간된 수정 Kneser Ney Smoothing을 수행합니다.
KenLM 툴킷을 설치하기 전에 kenlm-dependents에서 찾을 수 있는 모든 종속성을 설치해야 합니다.
데비안/우분투 배포판의 경우 :
작동하는 컴파일러를 얻으려면 build-essential
패키지를 설치하십시오. Boost는 libboost-all-dev
로 알려져 있습니다. 지원되는 세 가지 압축 옵션에는 각각 별도의 개발 패키지가 있습니다.
$ sudo apt-get install build-essential libboost-all-dev cmake zlib1g-dev libbz2-dev liblzma-dev
이를 위해 conda 또는 virtualenv 가상 환경을 사용하는 것이 좋습니다. conda의 경우 다음을 사용하여 생성할 수 있습니다.
$ conda create -n kenlm_deepspeech python=3.6 nltk
그런 다음 다음을 사용하여 환경을 활성화합니다.
$ source activate kenlm_deepspeech
이제 kenlm을 설치할 준비가 되었습니다. 먼저 kenlm 저장소를 복제해 보겠습니다.
$ git clone --recursive https://github.com/vchahun/kenlm.git
그런 다음 다음을 사용하여 LM 추정 코드를 컴파일합니다.
$ cd kenlm
$ ./bjam
마지막 단계로 선택적으로 다음을 사용하여 Python 모듈을 설치합니다.
$ python setup.py install
먼저 훈련 데이터를 가져와 보겠습니다. 여기서는 성경을 사용하겠습니다.
$ wget -c https://github.com/vchahun/notes/raw/data/bible/bible.en.txt.bz2
다음으로 간단한 전처리 스크립트가 필요합니다. 그 이유는 다음과 같습니다.
.bz2
)이어야 합니다. 따라서 다음 줄을 사용하여 간단한 스크립트 preprocess.py
만듭니다.
import sys
import nltk
for line in sys . stdin :
for sentence in nltk . sent_tokenize ( line ):
print ( ' ' . join ( nltk . word_tokenize ( sentence )). lower ())
온전한 확인을 위해 다음을 수행하십시오.
$ bzcat bible.en.txt.bz2 | python preprocess.py | wc
그리고 잘 작동하는지 확인하세요.
이제 모델을 훈련할 수 있습니다. Kneser-Ney 평활화를 사용하여 트라이그램 모델을 교육하려면 다음을 사용하세요.
# -o means `order` which translates to the `n` in n-gram
$ bzcat bible.en.txt.bz2 |
python preprocess.py |
./kenlm/bin/lmplz -o 3 > bible.arpa
위 명령은 먼저 토큰화 및 소문자화를 수행하는 전처리 스크립트를 통해 데이터를 파이프합니다. 다음으로, 토큰화된 소문자 텍스트는 추정 작업을 수행하는 lmplz
프로그램으로 파이프됩니다.
몇 초 안에 완료되고 bible.arpa
arpa 파일이 생성됩니다. less
또는 more
(예: $ less bible.arpa
)를 사용하여 arpa 파일을 검사할 수 있습니다. 처음에는 유니그램, 바이그램, 트라이그램 개수와 예상 값이 포함된 데이터 섹션이 있어야 합니다.
ARPA 파일을 직접 읽을 수 있습니다. 그러나 바이너리 형식은 훨씬 빠르게 로드되고 더 많은 유연성을 제공합니다. 바이너리 형식을 사용하면 로딩 시간이 크게 줄어들고 더 많은 구성 옵션이 제공됩니다. 이러한 이유로 다음을 사용하여 모델을 이진화합니다.
$ ./kenlm/bin/build_binary bible.arpa bible.binary
IRSTLM과 달리 파일 확장자는 중요하지 않습니다. 바이너리 형식은 매직 바이트를 사용하여 인식됩니다.
이진화할 때 trie
사용할 수도 있습니다. 이를 위해 다음을 사용하십시오.
$ ./kenlm/bin/build_binary trie bible.arpa bible.binary
이제 언어 모델이 있으므로 문장의 점수를 매길 수 있습니다. Python 인터페이스를 사용하면 이 작업을 수행하는 것이 매우 쉽습니다. 아래는 예입니다:
import kenlm
model = kenlm . LanguageModel ( 'bible.binary' )
model . score ( 'in the beginning was the word' )
그러면 다음과 같은 점수를 얻을 수 있습니다.
-15.03003978729248