En este proyecto, descargo un conjunto de datos persa wiki-dump de wikipedia, lo preproceso y finalmente entreno un corrector ortográfico y un modelo de lenguaje kenlm.
Descargue el volcado de wiki persa usando el siguiente script bash. El tamaño del conjunto de datos es de aproximadamente 1G, ¡así que tenga paciencia!
Nota : Si vives en Irán, seguramente sí porque este repositorio es para el idioma persa, ¡enciende tu VPN!
language=fa
bash download_wiki_dump.sh $language
Extraiga y convierta el formato .bz2
a .txt
. Usando wikiextractor
el volcado se limpia y convierte el archivo .txt
. ¡Esto también puede llevar algún tiempo!
n_processors=16
bash extract_and_clean_wiki_dump.sh ${language}wiki-latest-pages-articles.xml.bz2 $n_processors
Nota : En caso de un error de pdb, cambie la variable expand_templates=True
a expand_templates=False
, que es un argumento de entrada para la función clean_text
ubicada alrededor de la línea 948 de wikiextractor/wikiextractor/extract.py.
El texto de salida debe preprocesarse y normalizarse para eliminar textos innecesarios como "[doc]" y normalizar los textos utilizando las bibliotecas hazm
y nltk
.
Instale los requisitos:
pip install -r requirements.txt
Procesamiento principal. ¡Puede que lleve algo de tiempo!
python preprocess_wiki_dump.py fawiki-latest-pages-articles.txt
python cleaner.py
Usando este script se contarán las palabras del corpus. Antes de eso, también se aplicará una normalización y limpieza adicionales a las palabras.
sudo apt-get install pv
bash get_counts.sh
Symspell necesita un archivo de texto que contenga vocabularios y su aparición. fa_wiki.counts
que se creó en la sección Get the word-count of the corpus
debe recortarse para contener solo las 80.000 palabras más frecuentes y evitar aquellas que tienen una frecuencia inferior a 50.
python get_spellchecker_top_vocabs.py --top-vocabs 80000 --ignore-less 25 --output wiki_fa_80k.txt
Symspell es un corrector ortográfico sencillo. Primero, instálelo desde pypi usando el siguiente comando:
pip install symspellpy
Para usarlo, simplemente cree una instancia con el diccionario de vocabulario que creamos en la sección 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 )
El resultado es el siguiente. ¡Como puedes ver, اهواز
está elegido correctamente!
اهواز, 1, 4692
ادوار, 1, 1350
الوار, 1, 651
انوار, 1, 305
اهورا, 1, 225
Con el siguiente código, las muestras de 80 K más frecuentes se escriben en kenlm_vocabs.txt
. Para hacerlo más rápido, ¡se descartan los vocabularios con menos de 25 apariciones!
python get_kenlm_top_vocabs.py --top-vocabs 80000 --ignore-less 25 --output wiki_fa_kenlm_vocabs.txt
Primero instale los requisitos de KenLM usando los siguientes comandos:
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
Luego clone
y crea los módulos de C++:
git clone https://github.com/kpu/kenlm.git
cd kenlm
mkdir -p build
cd build
cmake ..
make -j 4
Si todo va bien, puede encontrar lmplz
y build_binary
en el directorio ./kenlm/build/bin
. Finalmente, entrene el modelo de lenguaje kenlm
utilizando el siguiente script bash.
bash train_kenlm.sh -o 4 -l fa
Nota: el módulo binario también se crea porque es mucho más rápido que el no binarizado.
Instalar KenLm:
pip install https://github.com/kpu/kenlm/archive/master.zip
Cómo usarlo:
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
Para obtener más ejemplos, consulte el siguiente enlace: https://github.com/kpu/kenlm/blob/master/python/example.py