Dans ce projet, je télécharge l'ensemble de données persan wiki-dump depuis wikipedia, le prétraite et enfin forme un correcteur orthographique et un modèle de langage kenlm.
Téléchargez le dump wiki persan en utilisant le script bash suivant. La taille de l’ensemble de données est d’environ 1 Go, alors soyez patient !
Remarque : Si vous vivez en Iran, c'est sûrement le cas car ce dépôt est destiné à la langue persane, allumez votre VPN !
language=fa
bash download_wiki_dump.sh $language
Extrayez et convertissez le format .bz2
en .txt
. À l'aide de wikiextractor
le dump est nettoyé et converti en fichier .txt
. Cela peut aussi prendre un certain temps !
n_processors=16
bash extract_and_clean_wiki_dump.sh ${language}wiki-latest-pages-articles.xml.bz2 $n_processors
Remarque : En cas d'erreur pdb, remplacez la variable expand_templates=True
par expand_templates=False
qui est un argument d'entrée de la fonction clean_text
située autour de la ligne 948 de wikiextractor/wikiextractor/extract.py.
Le texte de sortie doit être prétraité et normalisé pour supprimer les textes inutiles comme "[doc]" et normaliser les textes à l'aide des bibliothèques hazm
et nltk
!
Installez les exigences :
pip install -r requirements.txt
Traitement principal. Cela peut prendre du temps !
python preprocess_wiki_dump.py fawiki-latest-pages-articles.txt
python cleaner.py
En utilisant ce script, les mots du corpus seront comptés. Avant cela, une normalisation et un nettoyage supplémentaires seront également appliqués aux mots.
sudo apt-get install pv
bash get_counts.sh
Symspell a besoin d'un fichier texte contenant des vocabulaires et leur occurrence. fa_wiki.counts
créé dans la section Get the word-count of the corpus
doit être réduit pour contenir uniquement les 80 000 mots les plus fréquents et empêcher ceux dont la fréquence est inférieure à 50.
python get_spellchecker_top_vocabs.py --top-vocabs 80000 --ignore-less 25 --output wiki_fa_80k.txt
Symspell est un simple correcteur orthographique. Tout d’abord, installez-le depuis pypi à l’aide de la commande suivante :
pip install symspellpy
Pour l'utiliser, instanciez-le simplement avec le dictionnaire de vocabulaire que nous avons créé dans la section 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 )
Le résultat est le suivant. Comme vous pouvez le constater, اهواز
est correctement choisi !
اهواز, 1, 4692
ادوار, 1, 1350
الوار, 1, 651
انوار, 1, 305
اهورا, 1, 225
À l'aide du code suivant, les 80 000 échantillons les plus fréquents sont écrits dans kenlm_vocabs.txt
. Pour le rendre plus rapide, les vocabulaires avec moins de 25 occurrences sont supprimés !
python get_kenlm_top_vocabs.py --top-vocabs 80000 --ignore-less 25 --output wiki_fa_kenlm_vocabs.txt
Installez d'abord la configuration requise pour KenLM à l'aide des commandes suivantes :
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
Ensuite clone
et créez les modules C++ :
git clone https://github.com/kpu/kenlm.git
cd kenlm
mkdir -p build
cd build
cmake ..
make -j 4
Si tout se passe bien, vous pouvez trouver lmplz
et build_binary
dans le répertoire ./kenlm/build/bin
. Finalement, entraînez le modèle de langage kenlm
à l’aide du script bash suivant.
bash train_kenlm.sh -o 4 -l fa
Remarque : le module binaire est également créé car il est beaucoup plus rapide que le module non binarisé.
Installez KenLm :
pip install https://github.com/kpu/kenlm/archive/master.zip
Comment l'utiliser :
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
Pour plus d'exemples, consultez le lien suivant : https://github.com/kpu/kenlm/blob/master/python/example.py