- Ümit Yılmaz @ylmz-dev
- Büşra Gökmen @newsteps8
Nosso objetivo é criar um verificador/corretor ortográfico de código aberto que possa resolver muitos problemas diferentes na literatura turca de PNL, propor abordagens únicas e eliminar as deficiências dos estudos na literatura. Resolver os erros ortográficos dos textos escritos pelos usuários com uma abordagem de aprendizagem profunda e também perceber e corrigir os erros que ocorrem neste contexto realizando análises semânticas dos textos.
Embora existam muitas bibliotecas na literatura que corrigem erros ortográficos, nenhuma delas tinha capacidade de corrigir erros ocorridos no contexto semântico. Exemplos de tais erros são -da/-de, -ki e -mi, que devem ser escritos separadamente ou adjacentes em conjunções e sufixos. Nosso trabalho é completamente único e tem um desempenho muito melhor do que qualquer outro exemplo na literatura. 1DCNN, GRU, LSTM RNN foram testados como modelos, e LSTM bidirecional de 2 camadas foi escolhido como o modelo de melhor desempenho, e seus parâmetros foram alcançados em valores ideais com a técnica de otimização de busca bayesiana.
Três conjuntos de dados diferentes foram combinados a fim de generalizar e fornecer bons resultados no desempenho do modelo tanto em linguagens formais quanto informais. Estes são o conjunto de dados OPUS Subtitle, o conjunto de dados TSCORPUS Wikipedia e o conjunto de dados de jornais TSCORPUS.
Mais de 85 milhões de linhas de dados foram processadas em nosso estudo. Como pré-processamento, os sufixos adjacentes foram separados das palavras e substituídos por “X”. Sufixos separados também foram substituídos por “X”. Desta forma, pretende-se que o modelo dê resultados mais precisos mesmo que haja mais de um sufixo na mesma frase. Após o pré-processamento, as sentenças contendo sufixos separados foram rotuladas como 0 e as sentenças contendo sufixos adjacentes foram rotuladas como 1. Em seguida, o número excessivo de rótulos 0 e 1 foi reduzido por subamostragem aleatória para evitar o aprendizado incorreto do modelo. Como resultado, o modelo aprendeu a escrever sufixos corretamente, e não a cometer erros. 20% dos conjuntos de dados criados foram utilizados como dados de teste e 10% como dados de validação. Você pode acessar todos os conjuntos de dados em formato csv na pasta de dados ou nos links da unidade nos títulos abaixo.
Você pode carregar e testar modelos diretamente com os pesos na pasta pre_trained_weights. Ou você pode treinar seu próprio corretor com seus próprios dados ou com os dados que compartilhamos e os modelos que você cria usando notebooks de treinamento.
Você pode encontrar resultados de desempenho, comparações, exemplos de frases diferenciadas pelos modelos e direcionar links dos conjuntos de dados nos seguintes títulos.
Python 3.6+
clone do git https://github.com/Fixy-TR/fixy.git
Para instalar a biblioteca:
pip install DeepChecker
Funções que você pode usar e seus usos:
Funções corretas retornam a versão correta da frase. As funções de verificação expressam o valor proveniente da função sigmóide da frase. Estar próximo de 0 indica que deve ser escrito separadamente.
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
Estudos realizados | Taxa de precisão |
---|---|
fixo | 87% |
Bósforo | 78% |
Documentos Google | 34% |
Microsoft Office | 29% |
UIT | 0% |
Escritório Libra | 0% |
Foi testado com 100 frases difíceis criadas pela Universidade Boğaziçi. Artigo relacionado
A metodologia utilizada é totalmente original e baseia-se numa abordagem diferente de outros estudos da literatura. A diferença nos resultados de desempenho comprova a precisão da abordagem.
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
Após instalar as bibliotecas, carregamos o modelo e testamos.
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 )
- Precisão nos dados de teste: 92,13%
- ROC AUC em dados de teste: 0,921
Matriz de confusão [336706 20522] [36227 327591]
aula | precisão | lembrar | pontuação f1 | apoiar |
---|---|---|---|---|
0 | 0,9049 | 0,9397 | 0,9219 | 357228 |
1 | 0,9384 | 0,9030 | 0,9204 | 363818 |
Link do conjunto de dados rotulado contendo 3605229 linhas de dados criados: Dados
Após instalar as bibliotecas, carregamos o modelo e testamos.
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 )
- Precisão nos dados de teste: 91,32%
- ROC AUC em dados de teste: 0,913
Matriz de confusão [27113 3311] [1968 28457]
aula | precisão | lembrar | pontuação f1 | apoiar |
---|---|---|---|---|
0 | 0,9323 | 0,8912 | 0,9113 | 30424 |
1 | 0,8958 | 0,9353 | 0,9151 | 30425 |
Link para o conjunto de dados criado contendo 304.244 linhas de dados, rotulado: Dados
Após instalar as bibliotecas, carregamos o modelo e testamos.
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 para o conjunto de dados -mi rotulado criado contendo 9507636 linhas de dados: Dados
- Precisão nos dados de teste: 95,41%
- ROC AUC em dados de teste: 0,954
Matriz de confusão [910361 40403] [46972 903792]
aula | precisão | lembrar | pontuação f1 | apoiar |
---|---|---|---|---|
0 | 0,9509 | 0,9575 | 0,9542 | 950764 |
1 | 0,9572 | 0,9506 | 0,9539 | 950764 |
O fato de não haver nenhum estudo sobre os sufixos e mi na literatura aumenta a originalidade do projeto.
Treinamos o modelo que criamos com uma rede neural LSTM de três camadas com aproximadamente 260.000 dados de sentimento rotulados positivos e negativos. Adicionamos a camada de incorporação à nossa rede neural com os vetores de palavras que criamos aleatoriamente. Alcançamos uma pontuação de precisão de 94,57% no modelo que treinamos com 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
Após instalar as bibliotecas, carregamos o modelo com Keras.
from keras . models import load_model
model = load_model ( 'hack_model.h5' ) # modeli yüklüyoruz
Criamos entradas de teste.
#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 ]
Nós tokenizamos e preenchemos as entradas de teste
#tokenize
tokens = turkish_tokenizer . texts_to_sequences ( texts )
#padding
tokens_pad = pad_sequences ( tokens , maxlen = max_tokens )
O modelo prevê de qual emoção essas entradas estão próximas
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 para o conjunto de dados rotulado positivo-negativo contendo 260.000 linhas de dados: Dados
No modelo que criamos com a rede neural LSTM de três camadas, rotulamos aproximadamente 2.504.900 dos dados que recebemos do Twitter, jornal e Wikipedia como formais (suave) e informais (não suaves) e treinamos nossa rede neural. Adicionamos a camada de incorporação à nossa rede neural com os vetores de palavras que criamos aleatoriamente. Alcançamos uma pontuação de precisão de 95,37% no modelo que treinamos com 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
Após instalar as bibliotecas, carregamos o modelo com Keras.
from keras . models import load_model
model = load_model ( 'MODEL_FORMAL.h5' ) # modeli yüklüyoruz
Criamos entradas de teste.
# 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 ]
Nós tokenizamos e preenchemos as entradas de teste
#tokenize
tokens = tokenizer . texts_to_sequences ( texts )
#padding
tokens_pad = pad_sequences ( tokens , maxlen = max_tokens )
O modelo prevê de qual emoção essas entradas estão próximas
#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
Link do conjunto de dados formal rotulado contendo 1.204.900 linhas de dados criados: Dados Link do conjunto de dados informal rotulado contendo 3.934.628 linhas de dados criados: Dados
Treinamos modelos SVM linearSVC, MultinomialNB, LogisticRegression, RandomForestClassifier com o conjunto de dados contendo 27350 dados rotulados com 6 emoções diferentes (Medo: Medo, Feliz: Alegria, Tristeza: Tristeza, Nojo: Nojo, Raiva: Raiva, Surpresa: Surpresa). Antes da modelagem, usamos o vetorizador tfidf e a lista de palavras irrelevantes turca para vetorizar as palavras nos dados. Dentre esses modelos, alcançamos a maior taxa de precisão com o modelo LinearSVC.
Modelo | Precisão |
---|---|
LinearSVC | 0,80 |
Regressão Logística | 0,79 |
MultinomialNB | 0,78 |
RandomForestClassificador | 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
Após carregar as bibliotecas, carregamos e testamos o modelo com 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 ao TREMODATA o conjunto de dados que usamos para este modelo. Além disso, o link da unidade onde este conjunto de dados está localizado: Dados
Você pode exibir modelos em uma interface com a ajuda da API Flask criada no ambiente virtual. Bibliotecas necessárias para isso:
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
Você pode conectar seus modelos ao frontend executando o arquivo app.py.
No backend, usamos o módulo Normalização de Zemberek para o corretor baseado em regras. Além disso, usamos o módulo Informal Word Analysis de Zemberek para ver as versões mais formais dos textos no backend.
Para que os modelos de verificação ortográfica baseados em aprendizagem profunda aprendam erros ortográficos, pode ser necessário produzir dados na forma de frases corretas ou versões incorretas da frase. Criamos funções barulhentas que distorcem palavras adequadas, identificando erros ortográficos comuns em turco e usando-os. Assim, podemos obter dados sujos para modelagem. Você pode encontrar as funções no arquivo Noice_Adder_Functions.ipynb.
Você pode usar o conjunto de dados limpo da Wikipedia turca de 2364897 linhas em qualquer estudo de PNL turca :) Conjunto de dados da 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/