- أوميت يلماز @ylmz-dev
- بشرى جوكمان @newsteps8
هدفنا هو إنشاء داعم/مدقق إملائي مفتوح المصدر يمكنه حل العديد من المشكلات المختلفة في أدب البرمجة اللغوية العصبية التركي، وطرح أساليب فريدة وإزالة أوجه القصور في الدراسات في الأدب. لحل الأخطاء الإملائية في النصوص المكتوبة من قبل المستخدمين باستخدام نهج التعلم العميق وكذلك إدراك وتصحيح الأخطاء التي تحدث في هذا السياق عن طريق إجراء التحليل الدلالي على النصوص.
وعلى الرغم من وجود العديد من المكتبات في الأدبيات التي تصحح الأخطاء الإملائية، إلا أنه لم يكن لدى أي منها القدرة على تصحيح الأخطاء التي حدثت في السياق الدلالي. ومن أمثلة هذه الأخطاء -da/-de، و-ki، و-mi، والتي يجب كتابتها بشكل منفصل أو متجاور في أدوات العطف واللاحقات. عملنا فريد تمامًا وأداءه أفضل بكثير من أي مثال آخر في الأدبيات. تم اختبار 1DCNN وGRU وLSTM RNN كنماذج، وتم اختيار LSTM ثنائي الاتجاه كأفضل نموذج أداء، وتم الوصول إلى معلماته إلى القيم المثلى باستخدام تقنية تحسين البحث البايزية.
تم دمج ثلاث مجموعات بيانات مختلفة من أجل تعميم وتقديم نتائج جيدة في أداء النموذج باللغتين الرسمية وغير الرسمية. هذه هي مجموعة بيانات OPUS Subtitle ومجموعة بيانات TSCORPUS Wikipedia ومجموعة بيانات صحيفة TSCORPUS.
تمت معالجة أكثر من 85 مليون صف من البيانات في دراستنا. كمعالجة مسبقة، تم فصل اللواحق المجاورة عن الكلمات واستبدالها بـ "X". كما تم استبدال اللواحق المنفصلة بـ "X". وبهذه الطريقة، يهدف النموذج إلى إعطاء نتائج أكثر دقة حتى لو كان هناك أكثر من لاحقة في نفس الجملة. بعد المعالجة المسبقة، تم تصنيف الجمل التي تحتوي على لواحق منفصلة بالرقم 0، وتم تصنيف الجمل التي تحتوي على اللواحق المتجاورة بالرقم 1. بعد ذلك، تم تقليل العدد الزائد من التسميات 0 و1 عن طريق أخذ عينات عشوائية لمنع التعلم غير الصحيح للنموذج. ونتيجة لذلك، تعلم النموذج كيفية كتابة اللواحق بشكل صحيح، وليس الأخطاء. تم استخدام 20% من مجموعات البيانات التي تم إنشاؤها كبيانات اختبار و10% كبيانات للتحقق من الصحة. يمكنك الوصول إلى جميع مجموعات البيانات بتنسيق CSV في مجلد البيانات أو من روابط محرك الأقراص الموجودة تحت العناوين أدناه.
يمكنك تحميل النماذج واختبارها مباشرة باستخدام الأوزان الموجودة في مجلد pre_trained_weights. أو يمكنك تدريب المصحح الخاص بك باستخدام بياناتك الخاصة أو باستخدام البيانات التي نشاركها والنماذج التي تقوم بإنشائها باستخدام دفاتر ملاحظات التدريب.
يمكنك العثور على نتائج الأداء، والمقارنات، وأمثلة للجمل التي تتميز بها النماذج، وروابط مجموعات البيانات تحت العناوين التالية.
بايثون 3.6+
استنساخ بوابة https://github.com/Fixy-TR/fixy.git
لتثبيت المكتبة:
pip install DeepChecker
الوظائف التي يمكنك استخدامها واستخداماتها:
تقوم الوظائف الصحيحة بإرجاع الإصدار الصحيح من الجملة. تعبر وظائف التحقق عن القيمة القادمة من الوظيفة السينية للجملة. يشير القرب من 0 إلى أنه يجب كتابته بشكل منفصل.
from DeepChecker import correct_de , correct_ki , correct_mi , check_de , check_ki , check_mi
print ( correct_de ( "bu yaz bizimkiler de tatile gelecek" )) # doğru hali output olarak gelecek
print ( check_de ( "bu yaz bizimkiler de tatile gelecek" ) # sigmoid değeri output olarak dönecek
تمت الدراسات | معدل الدقة |
---|---|
ثابت | 87% |
البوسفور | 78% |
محرّر مستندات جوجل | 34% |
مايكروسوفت أوفيس | 29% |
الاتحاد الدولي للاتصالات | 0% |
مكتب الميزان | 0% |
تم اختباره بـ 100 جملة صعبة أنشأتها جامعة البوغازيتشي. مقالة ذات صلة
المنهجية المستخدمة أصلية تمامًا وتعتمد على نهج مختلف عن الدراسات الأخرى في الأدبيات. الفرق في نتائج الأداء يثبت دقة النهج.
from google . colab import drive
import pandas as pd
import keras
import pickle
from keras . preprocessing . text import Tokenizer
from keras . preprocessing . sequence import pad_sequences
from sklearn . model_selection import train_test_split
import tensorflow as tf
from keras . layers import Dense , LSTM , Flatten , Embedding , Dropout , Activation , GRU , Flatten , Input , Bidirectional , GlobalMaxPool1D , Convolution1D , TimeDistributed , Bidirectional
from keras . layers . embeddings import Embedding
from keras . models import Model , Sequential
from keras import initializers , regularizers , constraints , optimizers , layers
بعد تثبيت المكتبات نقوم بتحميل النموذج واختباره.
model . load_weights ( "/content/Model_deda.h5" )
pred = tokenizer . texts_to_sequences ([ "olsun demek x zor artık" ])
maxlen = 7
padded_pred = pad_sequences ( pred , maxlen = maxlen )
model . predict ( padded_pred )
# 0' yakın çıkması ekin ayrı yazılması gerektiğini gösteriyor.
array ([[ 0.04085088 ]], dtype = float32 )
- دقة بيانات الاختبار: 92.13%
- ROC AUC على بيانات الاختبار: 0.921
مصفوفة الارتباك [336706 20522] [ 36227 327591]
فصل | دقة | يتذكر | f1-score | يدعم |
---|---|---|---|---|
0 | 0.9049 | 0.9397 | 0.9219 | 357228 |
1 | 0.9384 | 0.9030 | 0.9204 | 363818 |
رابط مجموعة البيانات المسمى البيانات يحتوي على 3605229 صفًا من البيانات التي تم إنشاؤها: البيانات
بعد تثبيت المكتبات نقوم بتحميل النموذج واختباره.
model . load_weights ( "/content/Model_ki.h5" )
pred = tokenizer . texts_to_sequences ([ "desem x böyle böyle oldu" ])
maxlen = 7
padded_pred = pad_sequences ( pred , maxlen = maxlen )
model . predict ( padded_pred )
# 0' yakın çıkması ekin ayrı yazılması gerektiğini gösteriyor.
array ([[ 0.00843348 ]], dtype = float32 )
- دقة بيانات الاختبار: 91.32%
- ROC AUC على بيانات الاختبار: 0.913
مصفوفة الارتباك [27113 3311] [ 1968 28457]
فصل | دقة | يتذكر | f1-score | يدعم |
---|---|---|---|---|
0 | 0.9323 | 0.8912 | 0.9113 | 30424 |
1 | 0.8958 | 0.9353 | 0.9151 | 30425 |
رابط إلى مجموعة البيانات التي تم إنشاؤها والتي تحتوي على 304244 صفًا من البيانات، بعنوان: البيانات
بعد تثبيت المكتبات نقوم بتحميل النموذج واختباره.
model . load_weights ( "/content/Model_mi.h5" )
pred = tokenizer . texts_to_sequences ([ "olsun demek x zor artık" ])
maxlen = 7
padded_pred = pad_sequences ( pred , maxlen = maxlen )
model . predict ( padded_pred )
# 0' yakın çıkması ekin ayrı yazılması gerektiğini gösteriyor.
array ([[ 0.04085088 ]], dtype = float32 )
رابط إلى مجموعة البيانات -mi التي تم إنشاؤها والتي تحتوي على 9507636 صفًا من البيانات: Data
- دقة بيانات الاختبار: 95.41%
- ROC AUC على بيانات الاختبار: 0.954
مصفوفة الارتباك [910361 40403] [ 46972 903792]
فصل | دقة | يتذكر | f1-score | يدعم |
---|---|---|---|---|
0 | 0.9509 | 0.9575 | 0.9542 | 950764 |
1 | 0.9572 | 0.9506 | 0.9539 | 950764 |
حقيقة عدم وجود دراسة عن لواحق و mi في الأدبيات تزيد من أصالة المشروع.
لقد قمنا بتدريب النموذج الذي أنشأناه باستخدام شبكة عصبية LSTM ثلاثية الطبقات تحتوي على ما يقرب من 260000 من بيانات المشاعر الإيجابية والسلبية. أضفنا طبقة التضمين إلى شبكتنا العصبية باستخدام ناقلات الكلمات التي أنشأناها بشكل عشوائي. لقد حققنا درجة دقة تبلغ 94.57% من النموذج الذي قمنا بتدريبه خلال 10 فترات.
import numpy as np
import pandas as pd
from keras . preprocessing import sequence
from keras . models import Sequential
from keras . layers import Dense , Embedding , LSTM , Dropout
from tensorflow . python . keras . preprocessing . text import Tokenizer
from tensorflow . python . keras . preprocessing . sequence import pad_sequences
بعد تثبيت المكتبات نقوم بتحميل النموذج ببرنامج Keras.
from keras . models import load_model
model = load_model ( 'hack_model.h5' ) # modeli yüklüyoruz
نقوم بإنشاء مدخلات الاختبار.
#test yorumları(inputlar)
text1 = "böyle bir şeyi kabul edemem"
text2 = "tasarımı güzel ancak ürün açılmış tavsiye etmem"
text3 = "bu işten çok sıkıldım artık"
text4 = "kötü yorumlar gözümü korkutmuştu ancak hiçbir sorun yaşamadım teşekkürler"
text5 = "yaptığın işleri hiç beğenmiyorum"
text6 = "tam bir fiyat performans ürünü beğendim"
text7 = "Bu ürünü beğenmedim"
texts = [ text1 , text2 , text3 , text4 , text5 , text6 , text7 ]
نحن نرمز ونحشو مدخلات الاختبار
#tokenize
tokens = turkish_tokenizer . texts_to_sequences ( texts )
#padding
tokens_pad = pad_sequences ( tokens , maxlen = max_tokens )
يتنبأ النموذج بالعاطفة التي تكون هذه المدخلات قريبة منها
for i in model . predict ( tokens_pad ):
if i < 0.5 :
print ( "negatif" ) #negatif yorum yapmış
else
print ( "pozitif" ) #pozitif yorum yapmış
negative
negative
negative
positive
negative
positive
positive
رابط إلى مجموعة البيانات الإيجابية والسلبية التي تحتوي على 260000 صف من البيانات: البيانات
في النموذج الذي أنشأناه باستخدام الشبكة العصبية LSTM ثلاثية الطبقات، قمنا بتصنيف ما يقرب من 2504900 من البيانات التي تلقيناها من Twitter والصحف ويكيبيديا على أنها رسمية (سلسة) وغير رسمية (غير سلسة) وقمنا بتدريب شبكتنا العصبية. أضفنا طبقة التضمين إلى شبكتنا العصبية باستخدام ناقلات الكلمات التي أنشأناها بشكل عشوائي. لقد حققنا درجة دقة تبلغ 95.37% من النموذج الذي قمنا بتدريبه خلال 10 فترات.
import numpy as np
import pandas as pd
from keras . preprocessing import sequence
from keras . models import Sequential
from keras . layers import Dense , Embedding , LSTM , Dropout
from tensorflow . python . keras . preprocessing . text import Tokenizer
from tensorflow . python . keras . preprocessing . sequence import pad_sequences
بعد تثبيت المكتبات نقوم بتحميل النموذج ببرنامج Keras.
from keras . models import load_model
model = load_model ( 'MODEL_FORMAL.h5' ) # modeli yüklüyoruz
نقوم بإنشاء مدخلات الاختبار.
# test inputları oluşturuyoruz
text1 = "atatürk, bu görevi en uzun süre yürüten kişi olmuştur."
text2 = "bdjfhdjfhdjkhj"
text3 = "hiç resimde gösterildiği gibi değil..."
text4 = "bir yirminci yüzyıl popüler kültür ikonu haline gelen ressam, resimlerinin yanı sıra inişli çıkışlı özel yaşamı ve politik görüşleri ile tanınır. "
text5 = "fransız halkı önceki döneme göre büyük bir evrim geçirmektedir. halk bilinçlenmektedir ve sarayın, kralın, seçkinlerin denetiminden çıkmaya başlamıştır. şehirlerde yaşayan pek çok burjuva, büyük bir atılım içindedir. kitaplar yaygınlaşmakta, aileler çocuklarını üniversitelere göndererek sağlam bir gelecek kurma yolunu tutarak kültürel seviyeyi yükseltmektedir. bağımsız yayıncıların çıkardıkları gazete, bildiri ve broşürler, kitlesel bilinçlenmeye yol açmaktadır. bu koşullar da toplumsal değişim taleplerinin olgunlaşmasına yol açmıştır."
text6 = "bunu çıkardım söylediklerinden"
text7 = "Bu koşullar da toplumsal değişim taleplerinin olgunlaşmasına yol açmıştır."
text8 = "bu çok saçma yaa"
text9 = "bana böyle bir yetki verilmedi."
text10 = "napıcaz bu işi böyle"
text11 = "Öncelikle Mercedes-Benz’e olan ilgin için teşekkür ederiz."
text12 = "Ekibimizle çalışma isteğin için teşekkür ediyor, sağlıklı günler ve kariyerinde başarılar diliyoruz. Farklı etkinlik ve programlarda tekrar bir araya gelmek dileğiyle."
text13 = "Ben de öyle olduğunu düşünmüyordum ama gittik yine de jzns"
texts = [ text1 , text2 , text3 , text4 , text5 , text6 , text7 , text8 , text9 , text10 , text11 , text12 , text13 ]
نحن نرمز ونحشو مدخلات الاختبار
#tokenize
tokens = tokenizer . texts_to_sequences ( texts )
#padding
tokens_pad = pad_sequences ( tokens , maxlen = max_tokens )
يتنبأ النموذج بالعاطفة التي تكون هذه المدخلات قريبة منها
#test verisini tahminleme
for i in model . predict ( tokens_pad ):
if i < 0.5 :
print ( "informal" )
else :
print ( "formal" )
formal
informal
informal
formal
formal
informal
formal
informal
informal
informal
formal
informal
informal
رابط مجموعة البيانات الرسمية المسمى الذي يحتوي على 1204900 صفًا من البيانات التي تم إنشاؤها: البيانات رابط مجموعة البيانات غير الرسمية المسمى الذي يحتوي على 3934628 صفًا من البيانات التي تم إنشاؤها: البيانات
قمنا بتدريب نماذج SVM الخطية SVC وMultinomialNB وLogiisticRegression وRandomForestClassifier باستخدام مجموعة البيانات التي تحتوي على 27350 بيانات مصنفة بستة مشاعر مختلفة (الخوف: الخوف، السعادة: الفرح، الحزن: الحزن، الاشمئزاز: الاشمئزاز، الغضب: الغضب، المفاجأة: المفاجأة). قبل النمذجة، استخدمنا ناقل tfidf وقائمة كلمات التوقف التركية لتوجيه الكلمات في البيانات. ومن بين هذه النماذج حققنا أعلى نسبة دقة مع نموذج LinearSVC.
نموذج | دقة |
---|---|
LinearSVC | 0.80 |
الانحدار اللوجستي | 0.79 |
متعدد الحدودNB | 0.78 |
RandomForestClassifier | 0.60 |
from sklearn . linear_model import LogisticRegression
from sklearn . ensemble import RandomForestClassifier
from sklearn . naive_bayes import MultinomialNB
from sklearn . svm import LinearSVC
from sklearn . model_selection import cross_val_score
from sklearn . model_selection import train_test_split
from sklearn . metrics import accuracy_score
بعد تحميل المكتبات، نقوم بتحميل النموذج واختباره باستخدام Load_model.
# modeli yükleyip test ediyoruz
tfidf = TfidfVectorizer ( sublinear_tf = True , min_df = 5 , norm = 'l2' , encoding = 'latin-1' , ngram_range = ( 1 , 2 ), stop_words = myList )
loaded_model = pickle . load ( open ( "emotion_model.pickle" , 'rb' ))
corpus = [
"İşlerin ters gitmesinden endişe ediyorum" ,
"çok mutluyum" ,
"sana çok kızgınım" ,
"beni şaşırttın" ,
]
tfidf . fit_transform ( df . Entry ). toarray ()
features = tfidf . transform ( corpus ). toarray ()
result = loaded_model . predict ( features )
print ( result )
[ 'Fear' 'Happy' 'Anger' 'Suprise' ]
لقد طلبنا مجموعة البيانات التي استخدمناها لهذا النموذج من TREMODATA. وأيضًا رابط محرك الأقراص الذي توجد به مجموعة البيانات هذه: Data
يمكنك عرض النماذج في واجهة بمساعدة Flask API التي قمت بإنشائها في البيئة الافتراضية. المكتبات المطلوبة لذلك:
from flask_wtf import FlaskForm
from flask import Flask , request , render_template , redirect
import pickle
import re
from wtforms . validators import DataRequired
import pandas as pd
from os . path import join
يمكنك توصيل نماذجك بالواجهة الأمامية عن طريق تشغيل ملف app.py.
في الواجهة الخلفية، استخدمنا وحدة التطبيع Zemberek للمصحح القائم على القواعد. بالإضافة إلى ذلك، استخدمنا وحدة تحليل الكلمات غير الرسمية الخاصة بـ Zemberek لرؤية الإصدارات الأكثر رسمية من النصوص في الواجهة الخلفية.
لكي تتمكن نماذج المدقق الإملائي المستندة إلى التعلم العميق من التعرف على الأخطاء الإملائية، قد يكون من الضروري إنتاج بيانات في شكل جمل صحيحة أو إصدارات غير صحيحة من الجملة. لقد أنشأنا وظائف مزعجة تشوه الكلمات الصحيحة من خلال تحديد الأخطاء الإملائية الشائعة باللغة التركية واستخدامها. وبالتالي، يمكننا الحصول على بيانات قذرة للنمذجة. يمكنك العثور على الوظائف في الملف Noice_Adder_Functions.ipynb.
يمكنك استخدام مجموعة بيانات ويكيبيديا التركية المنظفة المكونة من 2364897 سطرًا في أي دراسة للبرمجة اللغوية العصبية التركية :) مجموعة بيانات ويكيبيديا
- https://acl-bg.org/proceedings/2019/RANLP%202019/pdf/RANLP009.pdf
- https://tscorpus.com
- https://github.com/ozturkberkay/Zemberek-Python-Examples
- https://www.kaggle.com/mustfkeskin/turkish-wikipedia-dump
- http://demir.cs.deu.edu.tr/tremo-dataset/