В этом проекте я загружаю персидский набор данных wiki-dump из Википедии, предварительно обрабатываю его и, наконец, тренирую программу проверки орфографии и языковую модель kenlm.
Загрузите дамп персидской вики, используя следующий скрипт bash. Размер набора данных составляет около 1 ГБ, так что наберитесь терпения!
Примечание . Если вы живете в Иране, скорее всего, так оно и есть, потому что это репозиторий предназначен для персидского языка, включите 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 измените expand_templates=True
expand_templates=False
, которая является входным аргументом функции clean_text
, расположенной примерно в строке 948 файла wikiextractor/wikiextractor/extract.py.
Выходной текст должен быть предварительно обработан и нормализован для удаления ненужных текстов типа «[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 нужен текстовый файл, содержащий словарные слова и их появление. fa_wiki.counts
, созданный в разделе Get the word-count of the corpus
следует обрезать, чтобы он содержал только 80 тысяч наиболее часто встречающихся слов и исключить те, частота которых ниже 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
Используя следующий код, в kenlm_vocabs.txt
записываются наиболее часто встречающиеся образцы из 80 тысяч. Чтобы сделать это быстрее, слова, встречающиеся менее 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
Затем clone
и создайте модули C++:
git clone https://github.com/kpu/kenlm.git
cd kenlm
mkdir -p build
cd build
cmake ..
make -j 4
Если все пойдет хорошо, вы сможете найти lmplz
и build_binary
в каталоге ./kenlm/build/bin
. В конце концов обучите языковую модель kenlm
используя следующий скрипт bash.
bash train_kenlm.sh -o 4 -l fa
Примечание: двоичный модуль создается еще и потому, что он намного быстрее, чем небинаризованный.
Установите КенЛм:
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.