- Ucapkan Yılmaz @ylmz-dev
- Buşra Gökmen @newsteps8
Tujuan kami adalah untuk menciptakan pendukung/pemeriksa ejaan sumber terbuka yang dapat memecahkan banyak masalah berbeda dalam literatur NLP Turki, mengedepankan pendekatan unik dan menghilangkan kekurangan studi dalam literatur. Untuk mengatasi kesalahan ejaan pada teks yang ditulis oleh pengguna dengan pendekatan deep learning dan juga menyadari serta memperbaiki kesalahan yang terjadi dalam konteks ini dengan melakukan analisis semantik pada teks tersebut.
Meskipun terdapat banyak perpustakaan dalam literatur yang memperbaiki kesalahan ejaan, tidak satupun dari mereka memiliki kapasitas untuk memperbaiki kesalahan yang terjadi dalam konteks semantik. Contoh kesalahannya adalah -da/-de, -ki, dan -mi yang harus ditulis terpisah atau berdekatan pada kata penghubung dan sufiks. Pekerjaan kami benar-benar unik dan berkinerja jauh lebih baik dibandingkan contoh lain dalam literatur. 1DCNN, GRU, LSTM RNN diuji sebagai model, dan LSTM Dua Arah 2 lapis dipilih sebagai model dengan kinerja terbaik, dan parameternya dicapai ke nilai optimal dengan teknik optimasi pencarian Bayesian.
Tiga kumpulan data berbeda digabungkan untuk menggeneralisasi dan memberikan hasil yang baik dalam performa model baik dalam bahasa formal maupun informal. Ini adalah kumpulan data OPUS Subtitle, kumpulan data Wikipedia TSCORPUS, dan kumpulan data surat kabar TSCORPUS.
Lebih dari 85 juta baris data diproses dalam penelitian kami. Sebagai pra-pemrosesan, sufiks yang berdekatan dipisahkan dari kata dan diganti dengan "X". Sufiks terpisah juga telah diganti dengan “X”. Dengan cara ini model diharapkan memberikan hasil yang lebih akurat meskipun terdapat lebih dari satu sufiks dalam kalimat yang sama. Setelah pra-pemrosesan, kalimat yang mengandung sufiks terpisah diberi label 0, dan kalimat yang mengandung sufiks yang berdekatan diberi label 1. Kemudian, kelebihan jumlah label 0 dan 1 dikurangi dengan undersampling acak untuk mencegah pembelajaran model yang salah. Hasilnya, model belajar menulis sufiks dengan benar, bukan kesalahan. 20% dari dataset yang dibuat digunakan sebagai data uji dan 10% sebagai data validasi. Anda dapat mengakses semua kumpulan data dalam format csv di folder data atau dari tautan drive di bawah judul di bawah.
Anda dapat memuat dan menguji model secara langsung dengan bobot di folder pre_trained_weights. Atau Anda dapat melatih korektor Anda sendiri dengan data Anda sendiri atau dengan data yang kami bagikan dan model yang Anda buat menggunakan buku catatan kereta.
Anda dapat menemukan hasil kinerja, perbandingan, contoh kalimat yang dibedakan berdasarkan model, dan mengarahkan tautan kumpulan data di bawah judul berikut.
Python 3.6+
git klon https://github.com/Fixy-TR/fixy.git
Untuk menginstal perpustakaan:
pip install DeepChecker
Fungsi yang dapat Anda gunakan dan kegunaannya:
Fungsi yang benar mengembalikan versi kalimat yang benar. Fungsi cek menyatakan nilai yang berasal dari fungsi sigmoid kalimat. Mendekati 0 menunjukkan bahwa itu harus ditulis secara terpisah.
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
Studi Selesai | Tingkat Akurasi |
---|---|
tetap | 87% |
Bosphorus | 78% |
Google Dokumen | 34% |
Microsoft Office | 29% |
itu | 0% |
Kantor Libra | 0% |
Itu diuji dengan 100 kalimat sulit yang dibuat oleh Universitas Boğaziçi. Artikel terkait
Metodologi yang digunakan sepenuhnya orisinal dan didasarkan pada pendekatan yang berbeda dibandingkan penelitian lain dalam literatur. Perbedaan hasil kinerja membuktikan keakuratan pendekatan tersebut.
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
Setelah menginstal perpustakaan, kami memuat model dan mengujinya.
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 )
- Akurasi Data Uji: 92,13%
- ROC AUC pada Data Uji: 0,921
Matriks Kebingungan [336706 20522] [ 36227 327591]
kelas | presisi | mengingat | skor f1 | mendukung |
---|---|---|---|---|
0 | 0,9049 | 0,9397 | 0,9219 | 357228 |
1 | 0,9384 | 0,9030 | 0,9204 | 363818 |
Data Tautan kumpulan data berlabel berisi 3605229 baris data yang dibuat: Data
Setelah menginstal perpustakaan, kami memuat model dan mengujinya.
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 )
- Akurasi Data Uji: 91,32%
- ROC AUC pada Data Uji: 0,913
Matriks Kebingungan [27113 3311] [ 1968 28457]
kelas | presisi | mengingat | skor f1 | mendukung |
---|---|---|---|---|
0 | 0,9323 | 0,8912 | 0,9113 | 30424 |
1 | 0,8958 | 0,9353 | 0,9151 | 30425 |
Tautan ke himpunan data yang dibuat berisi 304244 baris data, diberi label: Data
Setelah menginstal perpustakaan, kami memuat model dan mengujinya.
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 )
Tautan ke kumpulan data berlabel -mi yang dibuat berisi 9507636 baris data: Data
- Akurasi Data Uji: 95,41%
- ROC AUC pada Data Uji: 0,954
Matriks Kebingungan [910361 40403] [ 46972 903792]
kelas | presisi | mengingat | skor f1 | mendukung |
---|---|---|---|---|
0 | 0,9509 | 0,9575 | 0,9542 | 950764 |
1 | 0,9572 | 0,9506 | 0,9539 | 950764 |
Fakta bahwa tidak ada studi tentang sufiks dan mi dalam literatur meningkatkan orisinalitas proyek.
Kami melatih model yang kami buat dengan jaringan saraf LSTM tiga lapis dengan sekitar 260.000 data sentimen berlabel positif dan negatif. Kami menambahkan lapisan penyematan ke jaringan saraf kami dengan vektor kata yang kami buat secara acak. Kami mencapai skor akurasi 94,57% dari model yang kami latih dengan 10 epoch.
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
Setelah menginstal perpustakaan, kami memuat model dengan Keras.
from keras . models import load_model
model = load_model ( 'hack_model.h5' ) # modeli yüklüyoruz
Kami membuat input pengujian.
#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 ]
Kami melakukan tokenisasi dan padding untuk input pengujian
#tokenize
tokens = turkish_tokenizer . texts_to_sequences ( texts )
#padding
tokens_pad = pad_sequences ( tokens , maxlen = max_tokens )
Model tersebut memprediksi emosi mana yang paling dekat dengan masukan ini
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
Tautan ke kumpulan data berlabel positif-negatif yang berisi 260.000 baris data: Data
Dalam model yang kami buat dengan jaringan saraf LSTM tiga lapis, kami memberi label pada sekitar 2504900 data yang kami terima dari Twitter, surat kabar, dan Wikipedia sebagai formal (halus) dan informal (tidak lancar) dan melatih jaringan saraf kami. Kami menambahkan lapisan penyematan ke jaringan saraf kami dengan vektor kata yang kami buat secara acak. Kami mencapai skor akurasi 95,37% dari model yang kami latih dengan 10 epoch.
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
Setelah menginstal perpustakaan, kami memuat model dengan Keras.
from keras . models import load_model
model = load_model ( 'MODEL_FORMAL.h5' ) # modeli yüklüyoruz
Kami membuat input pengujian.
# 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 ]
Kami melakukan tokenisasi dan padding untuk input pengujian
#tokenize
tokens = tokenizer . texts_to_sequences ( texts )
#padding
tokens_pad = pad_sequences ( tokens , maxlen = max_tokens )
Model tersebut memprediksi emosi mana yang paling dekat dengan masukan ini
#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
Tautan kumpulan data formal berlabel berisi 1204900 baris data yang dibuat: Data Tautan kumpulan data informal berlabel berisi 3934628 baris data yang dibuat: Data
Kami melatih model SVM linearSVC, MultinomialNB, LogisticRegression, RandomForestClassifier dengan kumpulan data yang berisi 27350 data yang diberi label dengan 6 emosi berbeda (Fear: Fear, Happy: Joy, Sadness: Sadness, Disgust: Disgust, Anger: Anger, Surprise: Surprise). Sebelum membuat model, kami menggunakan tfidf vectorizer dan daftar stopword Turki untuk membuat vektor kata-kata dalam data. Di antara model-model ini, kami mencapai tingkat akurasi tertinggi dengan model LinearSVC.
Model | Ketepatan |
---|---|
LinearSVC | 0,80 |
Regresi Logistik | 0,79 |
MultinomialNB | 0,78 |
Pengklasifikasi Hutan Acak | 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
Setelah memuat perpustakaan, kami memuat dan menguji model dengan 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' ]
Kami meminta kumpulan data yang kami gunakan untuk model ini dari TREMODATA. Juga, tautan drive tempat kumpulan data ini berada: Data
Anda dapat menampilkan model dalam antarmuka dengan bantuan Flask API yang Anda buat di lingkungan virtual. Perpustakaan diperlukan untuk ini:
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
Anda dapat menghubungkan model Anda ke frontend dengan menjalankan file app.py.
Di backend, kami menggunakan modul Normalisasi Zemberek untuk korektor berbasis aturan. Selain itu, kami menggunakan modul Analisis Kata Informal Zemberek untuk melihat versi teks yang lebih formal di backend.
Agar model pemeriksa ejaan Berbasis Pembelajaran Mendalam dapat mempelajari kesalahan ejaan, mungkin perlu menghasilkan data berupa kalimat yang benar atau versi kalimat yang salah. Kami menciptakan fungsi berisik yang mengubah kata-kata yang tepat dengan mengidentifikasi kesalahan ejaan umum dalam bahasa Turki dan menggunakannya. Dengan demikian, kita bisa memperoleh data kotor untuk pemodelan. Anda dapat menemukan fungsinya di file Noice_Adder_Functions.ipynb.
Anda dapat menggunakan kumpulan data Wikipedia bahasa Turki yang telah dibersihkan sebanyak 2364897 baris dalam studi NLP bahasa Turki mana pun :) Kumpulan Data 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/