이 프로젝트에서는 Wikipedia에서 페르시아어 wiki-dump 데이터 세트를 다운로드하고 사전 처리한 후 마지막으로 맞춤법 검사기와 kenlm 언어 모델을 교육합니다.
다음 bash 스크립트를 사용하여 페르시아어 위키 덤프를 다운로드하세요. 데이터 세트의 크기는 약 1G이므로 인내심을 가지십시오!
참고 : 이란에 거주하고 계시다면 이 저장소는 페르시아어용이므로 VPN을 켜실 것입니다!
language=fa
bash download_wiki_dump.sh $language
.bz2
형식을 추출하여 .txt
로 변환합니다. wikiextractor
사용하면 덤프가 정리되고 .txt
파일로 변환됩니다. 이것도 시간이 좀 걸릴 수 있어요!
n_processors=16
bash extract_and_clean_wiki_dump.sh ${language}wiki-latest-pages-articles.xml.bz2 $n_processors
참고 : pdb 오류가 발생하는 경우 wikiextractor/wikiextractor/extract.py의 948번째 줄에 있는 clean_text
함수에 대한 입력 인수인 expand_templates=True
변수를 expand_templates=False
로 변경하세요.
출력 텍스트는 "[doc]"와 같은 불필요한 텍스트를 제거하고 hazm
및 nltk
라이브러리를 사용하여 텍스트를 정규화하기 위해 전처리 및 정규화되어야 합니다!
요구 사항을 설치합니다.
pip install -r requirements.txt
주요 처리. 시간이 좀 걸릴 수 있어요!
python preprocess_wiki_dump.py fawiki-latest-pages-articles.txt
python cleaner.py
이 스크립트를 사용하면 말뭉치 단어가 계산됩니다. 그 전에는 추가 정규화 및 정리가 단어에도 적용됩니다.
sudo apt-get install pv
bash get_counts.sh
Symspell에는 어휘와 해당 단어가 포함된 텍스트 파일이 필요합니다. Get the word-count of the corpus
섹션에서 생성된 fa_wiki.counts
는 상위 자주 사용되는 단어 80,000개만 포함하고 빈도가 50보다 낮은 단어는 방지하도록 잘려야 합니다.
python get_spellchecker_top_vocabs.py --top-vocabs 80000 --ignore-less 25 --output wiki_fa_80k.txt
Symspell은 간단한 맞춤법 검사기입니다. 먼저 다음 명령을 사용하여 pypi에서 설치하십시오.
pip install symspellpy
이를 사용하려면 Get top frequent vocabs for SymSpell
섹션에서 만든 어휘 사전을 사용하여 인스턴스화하기만 하면 됩니다.
# import symspell
from symspellpy import SymSpell , Verbosity
# instantiate it
sym_spell = SymSpell ( max_dictionary_edit_distance = 2 , prefix_length = 7 )
dictionary_path = "wiki_fa_80k.txt"
sym_spell . load_dictionary ( dictionary_path , term_index = 0 , count_index = 1 )
# input sample:
input_term = "اهوار" # misspelling of "اهواز" It's a city name!
# lookup the dictionary
suggestions = sym_spell . lookup ( input_term , Verbosity . ALL , max_edit_distance = 2 )
# display suggestion term, term frequency, and edit distance
for suggestion in suggestions [: 5 ]:
print ( suggestion )
출력은 다음과 같습니다. 보시다시피 اهواز
이 올바르게 선택되었습니다!
اهواز, 1, 4692
ادوار, 1, 1350
الوار, 1, 651
انوار, 1, 305
اهورا, 1, 225
다음 코드를 사용하면 가장 빈번한 80K 샘플이 kenlm_vocabs.txt
에 기록됩니다. 더 빠르게 만들기 위해 발생 횟수가 25회 미만인 어휘는 삭제됩니다!
python get_kenlm_top_vocabs.py --top-vocabs 80000 --ignore-less 25 --output wiki_fa_kenlm_vocabs.txt
먼저 다음 명령을 사용하여 KenLM 요구 사항을 설치하십시오.
sudo apt-get update
sudo apt-get install cmake build-essential libssl-dev libeigen3-dev libboost-all-dev zlib1g-dev libbz2-dev liblzma-dev -y
그런 다음 C++ 모듈을 clone
하고 만듭니다.
git clone https://github.com/kpu/kenlm.git
cd kenlm
mkdir -p build
cd build
cmake ..
make -j 4
모든 것이 제대로 진행되면 ./kenlm/build/bin
디렉터리에서 lmplz
및 build_binary
찾을 수 있습니다. 결국 다음 bash 스크립트를 사용하여 kenlm
언어 모델을 교육합니다.
bash train_kenlm.sh -o 4 -l fa
참고: 이진화되지 않은 모듈보다 훨씬 빠르기 때문에 이진 모듈도 생성됩니다.
KenLm을 설치합니다:
pip install https://github.com/kpu/kenlm/archive/master.zip
그것을 사용하는 방법:
import kenlm
model = kenlm.Model('fa_wiki.binary')
print("score: ", model.score('کشور ایران شهر تهران', bos=True, eos=True))
print("score: ", model.score('کشور تهران شهر ایران', bos=True, eos=True))
# score: -11.683658599853516
# score: -15.572178840637207
더 많은 예제를 보려면 다음 링크를 확인하세요: https://github.com/kpu/kenlm/blob/master/python/example.py