- Ümit Yılmaz @ylmz-dev
- Büşra Gökmen @newsteps8
Notre objectif est de créer un support/vérificateur d'orthographe open source capable de résoudre de nombreux problèmes différents dans la littérature turque en PNL, de proposer des approches uniques et d'éliminer les lacunes des études dans la littérature. Résoudre les fautes d'orthographe dans les textes rédigés par les utilisateurs avec une approche d'apprentissage profond et également réaliser et corriger les erreurs qui surviennent dans ce contexte en effectuant une analyse sémantique des textes.
Bien qu’il existe de nombreuses bibliothèques dans la littérature qui corrigent les fautes d’orthographe, aucune d’entre elles n’avait la capacité de corriger les erreurs survenues dans le contexte sémantique. Des exemples de telles erreurs sont -da/-de, -ki et -mi, qui doivent être écrits séparément ou adjacents dans des conjonctions et des suffixes. Notre travail est totalement unique et fonctionne bien mieux que tout autre exemple dans la littérature. 1DCNN, GRU, LSTM RNN ont été testés comme modèles, et le LSTM bidirectionnel à 2 couches a été choisi comme modèle le plus performant, et ses paramètres ont été atteints à des valeurs optimales avec la technique d'optimisation de la recherche bayésienne.
Trois ensembles de données différents ont été combinés afin de généraliser et de fournir de bons résultats dans les performances du modèle dans les langages formels et informels. Il s'agit de l'ensemble de données de sous-titres OPUS, de l'ensemble de données Wikipedia TSCORPUS et de l'ensemble de données de journaux TSCORPUS.
Plus de 85 millions de lignes de données ont été traitées dans notre étude. En prétraitement, les suffixes adjacents ont été séparés des mots et remplacés par « X ». Les suffixes séparés ont également été remplacés par « X ». De cette manière, l’objectif est que le modèle donne des résultats plus précis même s’il y a plus d’un suffixe dans la même phrase. Après le prétraitement, les phrases contenant des suffixes séparés ont été étiquetées 0 et les phrases contenant des suffixes adjacents ont été étiquetées 1. Ensuite, le nombre excessif d’étiquettes 0 et 1 a été réduit par sous-échantillonnage aléatoire pour éviter un apprentissage incorrect du modèle. En conséquence, le modèle a appris à écrire correctement les suffixes et non les erreurs. 20 % des ensembles de données créés ont été utilisés comme données de test et 10 % comme données de validation. Vous pouvez accéder à tous les ensembles de données au format CSV dans le dossier de données ou à partir des liens du lecteur sous les rubriques ci-dessous.
Vous pouvez charger et tester des modèles directement avec les poids dans le dossier pre_trained_weights. Vous pouvez également entraîner votre propre correcteur avec vos propres données ou avec les données que nous partageons et les modèles que vous créez à l'aide de carnets de train.
Vous pouvez trouver des résultats de performances, des comparaisons, des exemples de phrases distinguées par les modèles et des liens vers les ensembles de données sous les rubriques suivantes.
Python3.6+
clone git https://github.com/Fixy-TR/fixy.git
Pour installer la bibliothèque :
pip install DeepChecker
Fonctions que vous pouvez utiliser et leurs utilisations :
Les fonctions correctes renvoient la version correcte de la phrase. Les fonctions de contrôle expriment la valeur provenant de la fonction sigmoïde de la phrase. Être proche de 0 indique qu’il doit être écrit séparément.
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
Études réalisées | Taux de précision |
---|---|
fixe | 87% |
Bosphore | 78% |
Google Documents | 34% |
Microsoft Office | 29% |
UIT | 0% |
Bureau de la Balance | 0% |
Il a été testé avec 100 phrases difficiles créées par l'Université de Boğaziçi. Article connexe
La méthodologie utilisée est tout à fait originale et repose sur une approche différente des autres études de la littérature. La différence dans les résultats de performance prouve la précision de l’approche.
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
Après avoir installé les bibliothèques, nous chargeons le modèle et le testons.
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 )
- Précision sur les données de test : 92,13 %
- ROC AUC sur les données de test : 0,921
Matrice de confusion [336706 20522] [ 36227 327591]
classe | précision | rappel | score f1 | soutien |
---|---|---|---|---|
0 | 0,9049 | 0,9397 | 0,9219 | 357228 |
1 | 0,9384 | 0,9030 | 0,9204 | 363818 |
Lien vers l'ensemble de données étiqueté contenant 3 605 229 lignes de données créées : Données
Après avoir installé les bibliothèques, nous chargeons le modèle et le testons.
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 )
- Précision sur les données de test : 91,32 %
- ROC AUC sur les données de test : 0,913
Matrice de confusion [27113 3311] [ 1968 28457]
classe | précision | rappel | score f1 | soutien |
---|---|---|---|---|
0 | 0,9323 | 0,8912 | 0,9113 | 30424 |
1 | 0,8958 | 0,9353 | 0,9151 | 30425 |
Lien vers l'ensemble de données créé contenant 304244 lignes de données, intitulé : Données
Après avoir installé les bibliothèques, nous chargeons le modèle et le testons.
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 )
Lien vers l'ensemble de données étiqueté -mi créé contenant 9507636 lignes de données : Données
- Précision sur les données de test : 95,41 %
- ROC AUC sur les données de test : 0,954
Matrice de confusion [910361 40403] [ 46972 903792]
classe | précision | rappel | score f1 | soutien |
---|---|---|---|---|
0 | 0,9509 | 0,9575 | 0,9542 | 950764 |
1 | 0,9572 | 0,9506 | 0,9539 | 950764 |
Le fait qu’il n’existe pas d’étude sur les suffixes et mi dans la littérature augmente l’originalité du projet.
Nous avons formé le modèle que nous avons créé avec un réseau neuronal LSTM à trois couches avec environ 260 000 données de sentiments étiquetées positives et négatives. Nous avons ajouté la couche d'intégration à notre réseau neuronal avec les vecteurs de mots que nous avons créés aléatoirement. Nous avons obtenu un score de précision de 94,57 % à partir du modèle que nous avons formé avec 10 époques.
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
Après avoir installé les bibliothèques, nous chargeons le modèle avec Keras.
from keras . models import load_model
model = load_model ( 'hack_model.h5' ) # modeli yüklüyoruz
Nous créons des entrées de test.
#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 ]
Nous tokenisons et complétons les entrées de test
#tokenize
tokens = turkish_tokenizer . texts_to_sequences ( texts )
#padding
tokens_pad = pad_sequences ( tokens , maxlen = max_tokens )
Le modèle prédit de quelle émotion ces entrées sont proches
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
Lien vers l'ensemble de données positif-négatif étiqueté contenant 260 000 lignes de données : Données
Dans le modèle que nous avons créé avec le réseau neuronal LSTM à trois couches, nous avons étiqueté environ 2 504 900 des données que nous avons reçues de Twitter, des journaux et de Wikipédia comme formelles (lisses) et informelles (non fluides) et avons entraîné notre réseau neuronal. Nous avons ajouté la couche d'intégration à notre réseau neuronal avec les vecteurs de mots que nous avons créés aléatoirement. Nous avons obtenu un score de précision de 95,37 % avec le modèle que nous avons formé avec 10 époques.
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
Après avoir installé les bibliothèques, nous chargeons le modèle avec Keras.
from keras . models import load_model
model = load_model ( 'MODEL_FORMAL.h5' ) # modeli yüklüyoruz
Nous créons des entrées de test.
# 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 ]
Nous tokenisons et complétons les entrées de test
#tokenize
tokens = tokenizer . texts_to_sequences ( texts )
#padding
tokens_pad = pad_sequences ( tokens , maxlen = max_tokens )
Le modèle prédit de quelle émotion ces entrées sont proches
#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
Lien vers un ensemble de données formel étiqueté contenant 1 204 900 lignes de données créées : Données Lien vers un ensemble de données informel étiqueté contenant 3 934 628 lignes de données créées : Données
Nous avons formé les modèles SVM LinearSVC, MultinomialNB, LogisticRegression, RandomForestClassifier avec l'ensemble de données contenant 27 350 données étiquetées avec 6 émotions différentes (Peur : Peur, Heureux : Joie, Tristesse : Tristesse, Dégoût : Dégoût, Colère : Colère, Surprise : Surprise). Avant la modélisation, nous avons utilisé le vectoriseur tfidf et la liste de mots vides turcs pour vectoriser les mots dans les données. Parmi ces modèles, nous avons atteint le taux de précision le plus élevé avec le modèle LinearSVC.
Modèle | Précision |
---|---|
LinéaireSVC | 0,80 |
Régression Logistique | 0,79 |
MultinomialNB | 0,78 |
RandomForestClassificateur | 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
Après avoir chargé les bibliothèques, nous chargeons et testons le modèle avec 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' ]
Nous avons demandé l'ensemble de données que nous avons utilisé pour ce modèle à TREMODATA. Également, le lien du lecteur où se trouve cet ensemble de données : Données
Vous pouvez afficher des modèles dans une interface à l'aide de l'API Flask que vous avez créée dans l'environnement virtuel. Bibliothèques nécessaires pour cela :
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
Vous pouvez connecter vos modèles au frontend en exécutant le fichier app.py.
Dans le backend, nous avons utilisé le module de normalisation de Zemberek pour le correcteur basé sur des règles. De plus, nous avons utilisé le module Informal Word Analysis de Zemberek pour voir les versions plus formelles des textes dans le backend.
Pour que les modèles de vérification orthographique basés sur le Deep Learning apprennent les erreurs d’orthographe, il peut être nécessaire de produire des données sous la forme de phrases correctes ou de versions incorrectes de la phrase. Nous avons créé des fonctions bruyantes qui déforment les mots appropriés en identifiant les fautes d'orthographe courantes en turc et en les utilisant. Ainsi, nous pouvons obtenir des données sales pour la modélisation. Vous pouvez retrouver les fonctions dans le fichier Noise_Adder_Functions.ipynb.
Vous pouvez utiliser l'ensemble de données Wikipédia turc nettoyé de 2364897 lignes dans n'importe quelle étude PNL turque :) Ensemble de données Wikipédia
- 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/