- Ümit Yılmaz @ylmz-dev
- Büşra Gökmen @newsteps8
Unser Ziel ist es, eine Open-Source-Rechtschreibunterstützung/-prüfung zu schaffen, die viele verschiedene Probleme in der türkischen NLP-Literatur lösen, einzigartige Ansätze vorschlagen und die Mängel der Studien in der Literatur beseitigen kann. Rechtschreibfehler in den von Nutzern verfassten Texten mit einem Deep-Learning-Ansatz zu beheben und durch eine semantische Analyse der Texte auch die in diesem Zusammenhang auftretenden Fehler zu erkennen und zu korrigieren.
Obwohl es in der Literatur viele Bibliotheken gibt, die Rechtschreibfehler korrigieren, verfügt keine von ihnen über die Kapazität, Fehler im semantischen Kontext zu korrigieren. Beispiele für solche Fehler sind -da/-de, -ki und -mi, die separat oder nebeneinander in Konjunktionen und Suffixen geschrieben werden müssen. Unsere Arbeit ist völlig einzigartig und schneidet viel besser ab als jedes andere Beispiel in der Literatur. 1DCNN, GRU, LSTM RNN wurden als Modelle getestet, und 2-schichtiges bidirektionales LSTM wurde als Modell mit der besten Leistung ausgewählt, und seine Parameter wurden mit der Bayes'schen Suchoptimierungstechnik auf optimale Werte gebracht.
Drei verschiedene Datensätze wurden kombiniert, um die Leistung des Modells sowohl in formellen als auch in informellen Sprachen zu verallgemeinern und gute Ergebnisse zu liefern. Dabei handelt es sich um den OPUS-Untertiteldatensatz, den TSCORPUS-Wikipedia-Datensatz und den TSCORPUS-Zeitungsdatensatz.
In unserer Studie wurden mehr als 85 Millionen Datenzeilen verarbeitet. Als Vorverarbeitung wurden benachbarte Suffixe von den Wörtern getrennt und durch „X“ ersetzt. Auch einzelne Suffixe wurden durch „X“ ersetzt. Auf diese Weise soll das Modell genauere Ergebnisse liefern, selbst wenn mehr als ein Suffix im selben Satz vorhanden ist. Nach der Vorverarbeitung wurden Sätze mit separaten Suffixen mit 0 und Sätze mit benachbarten Suffixen mit 1 gekennzeichnet. Anschließend wurde die überschüssige Anzahl der 0- und 1-Labels durch zufällige Unterabtastung reduziert, um ein falsches Lernen des Modells zu verhindern. Dadurch lernte das Modell, Suffixe richtig und nicht falsch zu schreiben. 20 % der erstellten Datensätze wurden als Testdaten und 10 % als Validierungsdaten verwendet. Sie können auf alle Datensätze im CSV-Format im Datenordner oder über die Laufwerkslinks unter den folgenden Überschriften zugreifen.
Sie können Modelle direkt mit den Gewichten im Ordner pre_trained_weights laden und testen. Oder Sie können Ihren eigenen Korrektor mit Ihren eigenen Daten oder mit den von uns geteilten Daten und den Modellen trainieren, die Sie mithilfe von Trainingsnotizbüchern erstellen.
Unter den folgenden Überschriften finden Sie Leistungsergebnisse, Vergleiche, Beispiele für von den Modellen unterschiedene Sätze und Laufwerksverknüpfungen der Datensätze.
Python 3.6+
Git-Klon https://github.com/Fixy-TR/fixy.git
So installieren Sie die Bibliothek:
pip install DeepChecker
Funktionen, die Sie verwenden können, und ihre Verwendung:
Richtige Funktionen geben die richtige Version des Satzes zurück. Prüffunktionen drücken den Wert aus, der aus der Sigmoidfunktion des Satzes stammt. Ein Wert nahe 0 bedeutet, dass es separat geschrieben werden sollte.
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
Studien abgeschlossen | Genauigkeitsrate |
---|---|
Fixy | 87 % |
Bosporus | 78 % |
Google Docs | 34 % |
Microsoft Office | 29 % |
ITU | 0% |
Waage-Büro | 0% |
Es wurde mit 100 schwierigen Sätzen getestet, die von der Boğaziçi-Universität erstellt wurden. Verwandter Artikel
Die verwendete Methodik ist völlig originell und basiert auf einem anderen Ansatz als andere Studien in der Literatur. Der Unterschied in den Leistungsergebnissen beweist die Genauigkeit des Ansatzes.
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
Nach der Installation der Bibliotheken laden wir das Modell und testen es.
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 )
- Genauigkeit der Testdaten: 92,13 %
- ROC AUC auf Testdaten: 0,921
Verwirrungsmatrix [336706 20522] [36227 327591]
Klasse | Präzision | abrufen | f1-Score | Unterstützung |
---|---|---|---|---|
0 | 0,9049 | 0,9397 | 0,9219 | 357228 |
1 | 0,9384 | 0,9030 | 0,9204 | 363818 |
Datenbeschrifteter Datensatzlink mit 3605229 erstellten Datenzeilen: Daten
Nach der Installation der Bibliotheken laden wir das Modell und testen es.
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 )
- Genauigkeit der Testdaten: 91,32 %
- ROC AUC auf Testdaten: 0,913
Verwirrungsmatrix [27113 3311] [ 1968 28457]
Klasse | Präzision | abrufen | f1-Score | Unterstützung |
---|---|---|---|---|
0 | 0,9323 | 0,8912 | 0,9113 | 30424 |
1 | 0,8958 | 0,9353 | 0,9151 | 30425 |
Link zum erstellten Datensatz mit 304244 Datenzeilen mit der Bezeichnung: Daten
Nach der Installation der Bibliotheken laden wir das Modell und testen es.
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 )
Link zum erstellten Datensatz mit der Bezeichnung -mi, der 9507636 Datenzeilen enthält: Daten
- Genauigkeit der Testdaten: 95,41 %
- ROC AUC auf Testdaten: 0,954
Verwirrungsmatrix [910361 40403] [46972 903792]
Klasse | Präzision | abrufen | f1-Score | Unterstützung |
---|---|---|---|---|
0 | 0,9509 | 0,9575 | 0,9542 | 950764 |
1 | 0,9572 | 0,9506 | 0,9539 | 950764 |
Die Tatsache, dass es in der Literatur keine Studie zu den Suffixen und mi gibt, erhöht die Originalität des Projekts.
Wir haben das von uns erstellte Modell mit einem dreischichtigen neuronalen LSTM-Netzwerk mit etwa 260.000 positiv und negativ gekennzeichneten Stimmungsdaten trainiert. Wir haben die Einbettungsschicht mit den Wortvektoren, die wir zufällig erstellt haben, zu unserem neuronalen Netzwerk hinzugefügt. Mit dem Modell, das wir mit 10 Epochen trainiert haben, haben wir einen Genauigkeitswert von 94,57 % erreicht.
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
Nach der Installation der Bibliotheken laden wir das Modell mit Keras.
from keras . models import load_model
model = load_model ( 'hack_model.h5' ) # modeli yüklüyoruz
Wir erstellen Testinputs.
#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 ]
Wir tokenisieren und füllen Testeingaben auf
#tokenize
tokens = turkish_tokenizer . texts_to_sequences ( texts )
#padding
tokens_pad = pad_sequences ( tokens , maxlen = max_tokens )
Das Modell sagt voraus, welcher Emotion diese Eingaben nahe kommen
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
Link zum gekennzeichneten Positiv-Negativ-Datensatz mit 260.000 Datenzeilen: Daten
In dem Modell, das wir mit dem dreischichtigen neuronalen Netzwerk LSTM erstellt haben, haben wir etwa 2504900 der Daten, die wir von Twitter, Zeitungen und Wikipedia erhalten haben, als formal (glatt) und informell (unglatt) gekennzeichnet und unser neuronales Netzwerk trainiert. Wir haben die Einbettungsschicht mit den Wortvektoren, die wir zufällig erstellt haben, zu unserem neuronalen Netzwerk hinzugefügt. Mit dem Modell, das wir mit 10 Epochen trainiert haben, haben wir eine Genauigkeit von 95,37 % erreicht.
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
Nach der Installation der Bibliotheken laden wir das Modell mit Keras.
from keras . models import load_model
model = load_model ( 'MODEL_FORMAL.h5' ) # modeli yüklüyoruz
Wir erstellen Testinputs.
# 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 ]
Wir tokenisieren und füllen Testeingaben auf
#tokenize
tokens = tokenizer . texts_to_sequences ( texts )
#padding
tokens_pad = pad_sequences ( tokens , maxlen = max_tokens )
Das Modell sagt voraus, welcher Emotion diese Eingaben nahe kommen
#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
Beschrifteter formaler Datensatz-Link mit 1204900 erstellten Datenzeilen: Daten. Beschrifteter informeller Datensatz-Link mit 3934628 erstellten Datenzeilen: Daten
Wir haben SVM linearSVC-, MultinomialNB-, LogisticRegression- und RandomForestClassifier-Modelle mit einem Datensatz trainiert, der 27350 Daten enthält, die mit 6 verschiedenen Emotionen gekennzeichnet sind (Angst: Angst, Glücklich: Freude, Traurigkeit: Traurigkeit, Ekel: Ekel, Wut: Wut, Überraschung: Überraschung). Vor der Modellierung verwendeten wir den TFIDF-Vektorisierer und die türkische Stoppwortliste, um die Wörter in den Daten zu vektorisieren. Unter diesen Modellen haben wir mit dem LinearSVC-Modell die höchste Genauigkeitsrate erreicht.
Modell | Genauigkeit |
---|---|
LinearSVC | 0,80 |
LogisticRegression | 0,79 |
MultinomialNB | 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
Nach dem Laden der Bibliotheken laden und testen wir das Modell mit 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' ]
Wir haben den Datensatz, den wir für dieses Modell verwendet haben, von TREMODATA angefordert. Außerdem der Laufwerkslink, auf dem sich dieser Datensatz befindet: Daten
Mithilfe der Flask-API, die Sie in der virtuellen Umgebung erstellt haben, können Sie Modelle in einer Schnittstelle anzeigen. Hierzu benötigte Bibliotheken:
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
Sie können Ihre Modelle mit dem Frontend verbinden, indem Sie die Datei app.py ausführen.
Im Backend haben wir das Normalisierungsmodul von Zemberek für den regelbasierten Korrektor verwendet. Zusätzlich haben wir das Modul „Informelle Wortanalyse“ von Zemberek verwendet, um die formelleren Versionen der Texte im Backend anzuzeigen.
Damit auf Deep Learning basierende Rechtschreibprüfungsmodelle Rechtschreibfehler lernen können, kann es erforderlich sein, Daten in Form von korrekten Sätzen oder falschen Versionen des Satzes zu erzeugen. Wir haben verrauschte Funktionen entwickelt, die richtige Wörter verzerren, indem wir häufige Rechtschreibfehler im Türkischen identifizieren und verwenden. Somit können wir schmutzige Daten für die Modellierung erhalten. Sie finden die Funktionen in der Datei Noice_Adder_Functions.ipynb.
Sie können den bereinigten türkischen Wikipedia-Datensatz mit 2364897 Zeilen in jeder türkischen NLP-Studie verwenden :) Wikipedia-Datensatz
- 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/