Neste projeto, eu baixei o conjunto de dados wiki-dump persa da Wikipedia, pré-processei-o e, finalmente, treinei um corretor ortográfico e um modelo de linguagem kenlm.
Baixe o dump do wiki persa usando o seguinte script bash. O tamanho do conjunto de dados é de cerca de 1G, então tenha paciência!
Nota : Se você mora no Irã, certamente mora porque este repositório é para o idioma persa, ligue sua VPN!
language=fa
bash download_wiki_dump.sh $language
Extraia e converta o formato .bz2
para .txt
. Usando wikiextractor
o dump é limpo e convertido em arquivo .txt
. Isso também pode levar algum tempo!
n_processors=16
bash extract_and_clean_wiki_dump.sh ${language}wiki-latest-pages-articles.xml.bz2 $n_processors
Nota : No caso de um erro de pdb, altere a variável expand_templates=True
para expand_templates=False
que é um argumento de entrada para a função clean_text
localizada por volta da linha 948 de wikiextractor/wikiextractor/extract.py.
O texto de saída deve ser pré-processado e normalizado para remover textos desnecessários como "[doc]" e normalizar os textos usando as bibliotecas hazm
e nltk
!
Instale os requisitos:
pip install -r requirements.txt
Processamento principal. Pode levar algum tempo!
python preprocess_wiki_dump.py fawiki-latest-pages-articles.txt
python cleaner.py
Utilizando este script serão contadas as palavras do corpus. Antes disso, alguma normalização e limpeza extra também serão aplicadas às palavras.
sudo apt-get install pv
bash get_counts.sh
Symspell precisa de um arquivo de texto que contenha vocabulários e suas ocorrências. fa_wiki.counts
criados na seção Get the word-count of the corpus
devem ser cortados para conter apenas as 80 mil palavras mais frequentes e evitar aquelas com frequência inferior a 50.
python get_spellchecker_top_vocabs.py --top-vocabs 80000 --ignore-less 25 --output wiki_fa_80k.txt
Symspell é um corretor ortográfico simples. Primeiro, instale-o a partir do pypi usando o seguinte comando:
pip install symspellpy
Para usá-lo, basta instanciá-lo com o dicionário de vocabulário que criamos na seção 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 )
A saída é a seguinte. Como você pode ver, اهواز
foi escolhido corretamente!
اهواز, 1, 4692
ادوار, 1, 1350
الوار, 1, 651
انوار, 1, 305
اهورا, 1, 225
Usando o código a seguir, as amostras de 80K mais frequentes são gravadas em kenlm_vocabs.txt
. Para torná-lo mais rápido, vocabulários com menos de 25 ocorrências são descartados!
python get_kenlm_top_vocabs.py --top-vocabs 80000 --ignore-less 25 --output wiki_fa_kenlm_vocabs.txt
Primeiro instale os requisitos do KenLM usando os seguintes 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
Em seguida, clone
e crie os módulos c++:
git clone https://github.com/kpu/kenlm.git
cd kenlm
mkdir -p build
cd build
cmake ..
make -j 4
Se tudo correr bem, você pode encontrar lmplz
e build_binary
no diretório ./kenlm/build/bin
. Eventualmente, treine o modelo de linguagem kenlm
usando o seguinte script bash.
bash train_kenlm.sh -o 4 -l fa
Nota: o módulo binário também é criado porque é muito mais rápido que o não-binarizado.
Instale o KenLm:
pip install https://github.com/kpu/kenlm/archive/master.zip
Como usar:
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 mais exemplos, verifique o seguinte link: https://github.com/kpu/kenlm/blob/master/python/example.py