في هذا المشروع، أقوم بتنزيل مجموعة بيانات wiki-dump الفارسية من ويكيبيديا، ثم أقوم بمعالجتها مسبقًا وأخيرًا تدريب المدقق الإملائي ونموذج لغة kenlm.
قم بتنزيل تفريغ wiki الفارسي باستخدام البرنامج النصي 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
باستخدام التعليمة البرمجية التالية، تتم كتابة العينات الأكثر شيوعًا والتي يبلغ عددها 80 ألفًا إلى kenlm_vocabs.txt
. ولجعلها أسرع، يتم تجاهل المفردات التي تحتوي على أقل من 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