- Ümit Yılmaz @ylmz-dev
- Büşra Gökmen @newsteps8
Nuestro objetivo es crear un soporte/revisor ortográfico de código abierto que pueda resolver muchos problemas diferentes en la literatura turca de PNL, proponer enfoques únicos y eliminar las deficiencias de los estudios en la literatura. Resolver los errores ortográficos en los textos escritos por los usuarios con un enfoque de aprendizaje profundo y también darse cuenta y corregir los errores que ocurren en este contexto mediante la realización de análisis semántico de los textos.
Aunque existen muchas bibliotecas en la literatura que corrigen errores ortográficos, ninguna de ellas tenía la capacidad de corregir errores ocurridos en el contexto semántico. Ejemplos de tales errores son -da/-de, -ki y -mi, que deben escribirse por separado o de forma adyacente en conjunciones y sufijos. Nuestro trabajo es completamente único y funciona mucho mejor que cualquier otro ejemplo en la literatura. Se probaron 1DCNN, GRU, LSTM RNN como modelos, y se eligió LSTM bidireccional de 2 capas como el modelo de mejor rendimiento, y sus parámetros se alcanzaron a valores óptimos con la técnica de optimización de búsqueda bayesiana.
Se combinaron tres conjuntos de datos diferentes para generalizar y proporcionar buenos resultados en el desempeño del modelo tanto en lenguajes formales como informales. Estos son el conjunto de datos de subtítulos de OPUS, el conjunto de datos de Wikipedia de TSCORPUS y el conjunto de datos de periódicos de TSCORPUS.
En nuestro estudio se procesaron más de 85 millones de filas de datos. Como preprocesamiento, los sufijos adyacentes se separaron de las palabras y se reemplazaron por "X". Los sufijos separados también se han reemplazado por "X". De esta forma se busca que el modelo dé resultados más precisos incluso si hay más de un sufijo en la misma oración. Después del preprocesamiento, las oraciones que contenían sufijos separados se etiquetaron con 0 y las oraciones que contenían sufijos adyacentes se etiquetaron con 1. Luego, el número excesivo de etiquetas 0 y 1 se redujo mediante un submuestreo aleatorio para evitar un aprendizaje incorrecto del modelo. Como resultado, el modelo aprendió a escribir los sufijos correctamente, no errores. El 20% de los conjuntos de datos creados se utilizaron como datos de prueba y el 10% como datos de validación. Puede acceder a todos los conjuntos de datos en formato csv en la carpeta de datos o desde los enlaces de la unidad debajo de los encabezados a continuación.
Puede cargar y probar modelos directamente con los pesos en la carpeta pre_trained_weights. O puedes entrenar tu propio corrector con tus propios datos o con los datos que compartimos y los modelos que creas usando cuadernos de entrenamiento.
Puede encontrar resultados de rendimiento, comparaciones, ejemplos de oraciones distinguidas por los modelos y enlaces de unidades de los conjuntos de datos en los siguientes títulos.
Pitón 3.6+
clon de git https://github.com/Fixy-TR/fixy.git
Para instalar la biblioteca:
pip install DeepChecker
Funciones que puedes utilizar y sus usos:
Las funciones correctas devuelven la versión correcta de la oración. Las funciones de verificación expresan el valor proveniente de la función sigmoidea de la oración. Estar cerca de 0 indica que se debe escribir por separado.
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
Estudios realizados | Tasa de precisión |
---|---|
arreglar | 87% |
bósforo | 78% |
Documentos de Google | 34% |
oficina de microsoft | 29% |
UIT | 0% |
Oficina de Libra | 0% |
Fue probado con 100 frases difíciles creadas por la Universidad Boğaziçi. Artículo relacionado
La metodología utilizada es completamente original y se basa en un enfoque diferente al de otros estudios de la literatura. La diferencia en los resultados de rendimiento demuestra la precisión del enfoque.
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
Después de instalar las bibliotecas, cargamos el modelo y lo probamos.
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 )
- Precisión en los datos de prueba: 92,13%
- AUC de la República de China en datos de prueba: 0,921
Matriz de confusión [336706 20522] [ 36227 327591]
clase | precisión | recordar | puntuación f1 | apoyo |
---|---|---|---|---|
0 | 0.9049 | 0.9397 | 0.9219 | 357228 |
1 | 0.9384 | 0.9030 | 0.9204 | 363818 |
Enlace de conjunto de datos etiquetado con datos que contiene 3605229 filas de datos creadas: Datos
Después de instalar las bibliotecas, cargamos el modelo y lo probamos.
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 )
- Precisión en los datos de prueba: 91,32%
- AUC de la República de China en datos de prueba: 0,913
Matriz de confusión [27113 3311] [ 1968 28457]
clase | precisión | recordar | puntuación f1 | apoyo |
---|---|---|---|---|
0 | 0.9323 | 0.8912 | 0.9113 | 30424 |
1 | 0.8958 | 0.9353 | 0.9151 | 30425 |
Enlace al conjunto de datos creado que contiene 304244 filas de datos, etiquetado: Datos
Después de instalar las bibliotecas, cargamos el modelo y lo probamos.
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 )
Enlace al conjunto de datos -mi etiquetado creado que contiene 9507636 filas de datos: Datos
- Precisión en los datos de prueba: 95,41%
- AUC de la República de China en datos de prueba: 0,954
Matriz de confusión [910361 40403] [ 46972 903792]
clase | precisión | recordar | puntuación f1 | apoyo |
---|---|---|---|---|
0 | 0.9509 | 0.9575 | 0.9542 | 950764 |
1 | 0.9572 | 0.9506 | 0.9539 | 950764 |
El hecho de que no exista ningún estudio sobre los sufijos the y mi en la literatura aumenta la originalidad del proyecto.
Entrenamos el modelo que creamos con una red neuronal LSTM de tres capas con aproximadamente 260.000 datos de sentimientos etiquetados positivos y negativos. Agregamos la capa de incrustación a nuestra red neuronal con los vectores de palabras que creamos aleatoriamente. Logramos una puntuación de precisión del 94,57% en el modelo que entrenamos con 10 épocas.
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
Después de instalar las bibliotecas, cargamos el modelo con Keras.
from keras . models import load_model
model = load_model ( 'hack_model.h5' ) # modeli yüklüyoruz
Creamos entradas de prueba.
#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 ]
Tokenizamos y rellenamos las entradas de prueba.
#tokenize
tokens = turkish_tokenizer . texts_to_sequences ( texts )
#padding
tokens_pad = pad_sequences ( tokens , maxlen = max_tokens )
El modelo predice a qué emoción están cercanas estas entradas
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
Enlace al conjunto de datos etiquetado como positivo-negativo que contiene 260000 filas de datos: Datos
En el modelo que creamos con la red neuronal LSTM de tres capas, etiquetamos aproximadamente 2504900 de los datos que recibimos de Twitter, periódicos y Wikipedia como formales (suaves) e informales (no fluidos) y entrenamos nuestra red neuronal. Agregamos la capa de incrustación a nuestra red neuronal con los vectores de palabras que creamos aleatoriamente. Logramos una puntuación de precisión del 95,37% en el modelo que entrenamos con 10 épocas.
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
Después de instalar las bibliotecas, cargamos el modelo con Keras.
from keras . models import load_model
model = load_model ( 'MODEL_FORMAL.h5' ) # modeli yüklüyoruz
Creamos entradas de prueba.
# 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 ]
Tokenizamos y rellenamos las entradas de prueba.
#tokenize
tokens = tokenizer . texts_to_sequences ( texts )
#padding
tokens_pad = pad_sequences ( tokens , maxlen = max_tokens )
El modelo predice a qué emoción están cercanas estas entradas
#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
Enlace de conjunto de datos formal etiquetado que contiene 1204900 filas de datos creadas: Datos Enlace de conjunto de datos informal etiquetado que contiene 3934628 filas de datos creadas: Datos
Entrenamos modelos SVM linearSVC, MultinomialNB, LogisticRegression, RandomForestClassifier con el conjunto de datos que contiene 27350 datos etiquetados con 6 emociones diferentes (Miedo: Miedo, Feliz: Alegría, Tristeza: Tristeza, Asco: Asco, Ira: Ira, Sorpresa: Sorpresa). Antes del modelado, utilizamos el vectorizador tfidf y la lista de palabras vacías turcas para vectorizar las palabras en los datos. Entre estos modelos, logramos la tasa de precisión más alta con el modelo LinearSVC.
Modelo | Exactitud |
---|---|
LinealSVC | 0,80 |
Regresión Logística | 0,79 |
MultinomialNB | 0,78 |
Clasificador de bosque aleatorio | 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
Después de cargar las bibliotecas, cargamos y probamos el modelo con 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' ]
Solicitamos a TREMODATA el conjunto de datos que utilizamos para este modelo. Además, el enlace de la unidad donde se encuentra este conjunto de datos: Datos
Puede mostrar modelos en una interfaz con la ayuda de la API Flask que creó en el entorno virtual. Bibliotecas necesarias para esto:
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
Puede conectar sus modelos a la interfaz ejecutando el archivo app.py.
En el backend, utilizamos el módulo de Normalización de Zemberek para el corrector basado en reglas. Además, utilizamos el módulo de Análisis informal de palabras de Zemberek para ver las versiones más formales de los textos en el backend.
Para que los modelos de corrector ortográfico basados en aprendizaje profundo aprendan errores ortográficos, puede ser necesario producir datos en forma de oraciones correctas o versiones incorrectas de la oración. Creamos funciones ruidosas que distorsionan las palabras adecuadas al identificar errores ortográficos comunes en turco y usarlos. De esta forma, podemos obtener datos sucios para modelar. Puede encontrar las funciones en el archivo Noice_Adder_Functions.ipynb.
Puede utilizar el conjunto de datos turco limpio de Wikipedia de 2364897 líneas en cualquier estudio de PNL turco :) Conjunto de datos de Wikipedia
- 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/