Dalam proyek ini, saya mengunduh kumpulan data wiki-dump Persia dari wikipedia, memprosesnya terlebih dahulu, dan terakhir melatih pemeriksa ejaan dan model bahasa kenlm.
Unduh dump wiki persia menggunakan skrip bash berikut. Ukuran kumpulan datanya sekitar 1G jadi bersabarlah!
Catatan : Jika Anda tinggal di Iran, kemungkinan besar Anda melakukannya karena repo ini untuk bahasa Persia, aktifkan vpn Anda!
language=fa
bash download_wiki_dump.sh $language
Ekstrak dan konversi format .bz2
ke .txt
. Menggunakan wikiextractor
dump dibersihkan dan dikonversi file .txt
. Ini mungkin memerlukan waktu juga!
n_processors=16
bash extract_and_clean_wiki_dump.sh ${language}wiki-latest-pages-articles.xml.bz2 $n_processors
Catatan : Jika terjadi kesalahan pdb, ubah variabel expand_templates=True
menjadi expand_templates=False
yang merupakan argumen masukan ke fungsi clean_text
yang terletak di sekitar baris 948 dari wikiextractor/wikiextractor/extract.py.
Teks keluaran harus diproses sebelumnya dan dinormalisasi untuk menghapus teks yang tidak perlu seperti "[doc]" dan menormalkan teks menggunakan perpustakaan hazm
dan nltk
!
Instal persyaratan:
pip install -r requirements.txt
Pengolahan Utama. Mungkin perlu waktu!
python preprocess_wiki_dump.py fawiki-latest-pages-articles.txt
python cleaner.py
Dengan menggunakan skrip ini kata-kata korpus akan dihitung. Sebelumnya, beberapa normalisasi dan pembersihan tambahan juga akan diterapkan pada kata-kata tersebut.
sudo apt-get install pv
bash get_counts.sh
Symspell membutuhkan file teks yang berisi kosakata dan kemunculannya. fa_wiki.counts
yang dibuat di bagian Get the word-count of the corpus
harus dipangkas agar hanya berisi 80 ribu kata yang paling sering muncul dan mencegah kata-kata yang frekuensinya lebih rendah dari 50.
python get_spellchecker_top_vocabs.py --top-vocabs 80000 --ignore-less 25 --output wiki_fa_80k.txt
Symspell adalah pemeriksa ejaan sederhana. Pertama, instal dari pypi menggunakan perintah berikut:
pip install symspellpy
Untuk menggunakannya, cukup instantiate dengan kamus kosakata yang kami buat di bagian 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 )
Outputnya adalah sebagai berikut. Seperti yang Anda lihat, اهواز
dipilih dengan benar!
اهواز, 1, 4692
ادوار, 1, 1350
الوار, 1, 651
انوار, 1, 305
اهورا, 1, 225
Dengan menggunakan kode berikut, 80 ribu sampel paling sering ditulis ke kenlm_vocabs.txt
. Untuk membuatnya lebih cepat, kosakata dengan kurang dari 25 kemunculan akan dibuang!
python get_kenlm_top_vocabs.py --top-vocabs 80000 --ignore-less 25 --output wiki_fa_kenlm_vocabs.txt
Pertama instal persyaratan KenLM menggunakan perintah berikut:
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
Kemudian clone
dan buat modul c++:
git clone https://github.com/kpu/kenlm.git
cd kenlm
mkdir -p build
cd build
cmake ..
make -j 4
Jika semuanya berjalan baik, Anda dapat menemukan lmplz
dan build_binary
di bawah direktori ./kenlm/build/bin
. Terakhir, latih model bahasa kenlm
menggunakan skrip bash berikut.
bash train_kenlm.sh -o 4 -l fa
Catatan: modul biner juga dibuat karena jauh lebih cepat dibandingkan modul non-binarisasi.
Instal KenLm:
pip install https://github.com/kpu/kenlm/archive/master.zip
Cara menggunakannya:
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
Untuk contoh lebih lanjut, lihat tautan berikut: https://github.com/kpu/kenlm/blob/master/python/example.py