- อุมิท ยิลมาซ @ylmz-dev
- บุชรา โกกเมน @newsteps8
เป้าหมายของเราคือการสร้างตัวสนับสนุน/ตัวตรวจสอบการสะกดแบบโอเพ่นซอร์สที่สามารถแก้ปัญหาต่างๆ มากมายในวรรณกรรม NLP ของตุรกี นำเสนอแนวทางที่เป็นเอกลักษณ์ และกำจัดข้อบกพร่องของการศึกษาในวรรณกรรม เพื่อแก้ไขข้อผิดพลาดในการสะกดคำในข้อความที่เขียนโดยผู้ใช้ด้วยแนวทางการเรียนรู้เชิงลึก และยังตระหนักถึงและแก้ไขข้อผิดพลาดที่เกิดขึ้นในบริบทนี้ด้วยการวิเคราะห์เชิงความหมายในข้อความ
แม้ว่าจะมีห้องสมุดหลายแห่งในวรรณกรรมที่แก้ไขข้อผิดพลาดในการสะกดคำ แต่ไม่มีห้องสมุดใดที่สามารถแก้ไขข้อผิดพลาดที่เกิดขึ้นในบริบทเชิงความหมายได้ ตัวอย่างของข้อผิดพลาดดังกล่าว ได้แก่ -da/-de, -ki และ -mi ซึ่งจะต้องเขียนแยกกันหรือติดกันโดยใช้คำสันธานและคำต่อท้าย งานของเรามีเอกลักษณ์เฉพาะตัวและทำงานได้ดีกว่าตัวอย่างอื่นๆ ในวรรณกรรม 1DCNN, GRU, LSTM RNN ได้รับการทดสอบเป็นแบบจำลอง และเลือก LSTM แบบสองทิศทาง 2 เลเยอร์เป็นแบบจำลองที่มีประสิทธิภาพดีที่สุด และพารามิเตอร์ของมันก็ถึงค่าที่เหมาะสมที่สุดด้วยเทคนิคการเพิ่มประสิทธิภาพการค้นหาแบบเบย์
ชุดข้อมูลที่แตกต่างกันสามชุดถูกรวมเข้าด้วยกันเพื่อสรุปและให้ผลลัพธ์ที่ดีในประสิทธิภาพของแบบจำลองทั้งในภาษาที่เป็นทางการและไม่เป็นทางการ เหล่านี้คือชุดข้อมูล OPUS Subtitle, ชุดข้อมูล Wikipedia ของ TSCORPUS และชุดข้อมูลหนังสือพิมพ์ TSCORPUS
ข้อมูลมากกว่า 85 ล้านแถวได้รับการประมวลผลในการศึกษาของเรา ในระหว่างการประมวลผลล่วงหน้า คำต่อท้ายที่อยู่ติดกันจะถูกแยกออกจากคำและแทนที่ด้วย "X" ส่วนต่อท้ายที่แยกกันก็ถูกแทนที่ด้วย "X" ด้วยวิธีนี้ แบบจำลองจะให้ผลลัพธ์ที่แม่นยำยิ่งขึ้น แม้ว่าจะมีคำต่อท้ายมากกว่าหนึ่งคำในประโยคเดียวกันก็ตาม หลังจากการประมวลผลล่วงหน้า ประโยคที่มีส่วนต่อท้ายแยกกันจะมีป้ายกำกับเป็น 0 และประโยคที่มีส่วนต่อท้ายที่อยู่ติดกันจะมีป้ายกำกับว่า 1 จากนั้น จำนวนป้ายกำกับ 0 และ 1 ที่เกินมาจะลดลงโดยการสุ่มตัวอย่างด้านล่างเพื่อป้องกันการเรียนรู้โมเดลที่ไม่ถูกต้อง เป็นผลให้แบบจำลองได้เรียนรู้วิธีการเขียนส่วนต่อท้ายอย่างถูกต้อง ไม่ใช่ข้อผิดพลาด 20% ของชุดข้อมูลที่สร้างขึ้นถูกใช้เป็นข้อมูลทดสอบ และ 10% เป็นข้อมูลการตรวจสอบ คุณสามารถเข้าถึงชุดข้อมูลทั้งหมดในรูปแบบ CSV ได้ในโฟลเดอร์ข้อมูลหรือจากลิงก์ไดรฟ์ใต้หัวข้อด้านล่าง
คุณสามารถโหลดและทดสอบโมเดลได้โดยตรงด้วยตุ้มน้ำหนักในโฟลเดอร์ pre_trained_weights หรือคุณสามารถฝึกตัวแก้ไขของคุณเองด้วยข้อมูลของคุณเองหรือกับข้อมูลที่เราแชร์และแบบจำลองที่คุณสร้างโดยใช้สมุดบันทึกการฝึก
คุณสามารถค้นหาผลลัพธ์ประสิทธิภาพ การเปรียบเทียบ ตัวอย่างประโยคที่แยกตามรุ่น และลิงก์ไดรฟ์ของชุดข้อมูลภายใต้หัวข้อต่อไปนี้
ไพธอน 3.6+
โคลนคอมไพล์ https://github.com/Fixy-TR/fixy.git
ในการติดตั้งไลบรารี่:
pip install DeepChecker
ฟังก์ชั่นที่คุณสามารถใช้และการใช้งาน:
ฟังก์ชันที่ถูกต้องจะส่งกลับเวอร์ชันที่ถูกต้องของประโยค ฟังก์ชันตรวจสอบแสดงค่าที่มาจากฟังก์ชันซิกมอยด์ของประโยค การเข้าใกล้ 0 แสดงว่าควรเขียนแยกกัน
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
การศึกษาเสร็จแล้ว | อัตราความแม่นยำ |
---|---|
ซ่อมเลย | 87% |
บอสฟอรัส | 78% |
Google เอกสาร | 34% |
ไมโครซอฟต์ ออฟฟิศ | 29% |
ไอทูยู | 0% |
สำนักงานราศีตุลย์ | 0% |
ได้รับการทดสอบด้วยประโยคยากๆ 100 ประโยคที่สร้างโดยมหาวิทยาลัยBoğaziçi บทความที่เกี่ยวข้อง
วิธีการที่ใช้เป็นวิธีการดั้งเดิมโดยสิ้นเชิงและมีพื้นฐานอยู่บนแนวทางที่แตกต่างจากการศึกษาอื่นๆ ในวรรณคดี ความแตกต่างในผลลัพธ์การปฏิบัติงานพิสูจน์ความถูกต้องของแนวทางดังกล่าว
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
หลังจากติดตั้งไลบรารีแล้ว เราจะโหลดโมเดลและทดสอบ
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 )
- ความแม่นยำในข้อมูลการทดสอบ: 92.13%
- ROC AUC จากข้อมูลการทดสอบ: 0.921
เมทริกซ์ความสับสน [336706 20522] [ 36227 327591]
ระดับ | ความแม่นยำ | จำ | คะแนน f1 | สนับสนุน |
---|---|---|---|---|
0 | 0.9049 | 0.9397 | 0.9219 | 357228 |
1 | 0.9384 | 0.9030 | 0.9204 | 363818 |
ข้อมูล ลิงก์ชุดข้อมูลที่มีป้ายกำกับประกอบด้วยแถวข้อมูลที่สร้างขึ้น 3605229 แถว: Data
หลังจากติดตั้งไลบรารีแล้ว เราจะโหลดโมเดลและทดสอบ
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 )
- ความแม่นยำในข้อมูลการทดสอบ: 91.32%
- ROC AUC จากข้อมูลการทดสอบ: 0.913
เมทริกซ์ความสับสน [27113 3311] [ 1968 28457]
ระดับ | ความแม่นยำ | จำ | คะแนน f1 | สนับสนุน |
---|---|---|---|---|
0 | 0.9323 | 0.8912 | 0.9113 | 30424 |
1 | 0.8958 | 0.9353 | 0.9151 | 30425 |
ลิงก์ไปยังชุดข้อมูลที่สร้างขึ้นซึ่งมีข้อมูล 304244 แถว โดยมีป้ายกำกับ: Data
หลังจากติดตั้งไลบรารีแล้ว เราจะโหลดโมเดลและทดสอบ
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 )
ลิงก์ไปยังชุดข้อมูล -mi ที่มีป้ายกำกับที่สร้างขึ้นซึ่งมีข้อมูล 9507636 แถว: Data
- ความแม่นยำในข้อมูลการทดสอบ: 95.41%
- ROC AUC จากข้อมูลการทดสอบ: 0.954
เมทริกซ์ความสับสน [910361 40403] [ 46972 903792]
ระดับ | ความแม่นยำ | จำ | คะแนน f1 | สนับสนุน |
---|---|---|---|---|
0 | 0.9509 | 0.9575 | 0.9542 | 950764 |
1 | 0.9572 | 0.9506 | 0.9539 | 950764 |
ความจริงที่ว่าไม่มีการศึกษาเกี่ยวกับคำต่อท้าย และ mi ในวรรณคดีทำให้ความคิดริเริ่มของโครงการเพิ่มขึ้น
เราฝึกอบรมโมเดลที่เราสร้างขึ้นด้วยโครงข่ายประสาทเทียม LSTM สามชั้นพร้อมข้อมูลความรู้สึกเชิงบวกและเชิงลบประมาณ 260,000 รายการ เราได้เพิ่มเลเยอร์การฝังลงในโครงข่ายประสาทเทียมของเราด้วยคำว่าเวกเตอร์ที่เราสร้างขึ้นแบบสุ่ม เราได้รับคะแนนความแม่นยำ 94.57% จากแบบจำลองที่เราฝึกมา 10 ยุค
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
หลังจากติดตั้งไลบรารีแล้ว เราจะโหลดโมเดลด้วย Keras
from keras . models import load_model
model = load_model ( 'hack_model.h5' ) # modeli yüklüyoruz
เราสร้างอินพุตทดสอบ
#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 ]
เราโทเค็นและช่องว่างภายในสำหรับอินพุตทดสอบ
#tokenize
tokens = turkish_tokenizer . texts_to_sequences ( texts )
#padding
tokens_pad = pad_sequences ( tokens , maxlen = max_tokens )
แบบจำลองจะทำนายว่าอารมณ์ใดที่อินพุตเหล่านี้อยู่ใกล้
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
ลิงก์ไปยังชุดข้อมูลบวก-ลบที่มีป้ายกำกับซึ่งมีข้อมูล 260,000 แถว: Data
ในแบบจำลองที่เราสร้างขึ้นด้วยโครงข่ายประสาทเทียม LSTM สามชั้น เราติดป้ายกำกับข้อมูลที่เราได้รับจาก Twitter หนังสือพิมพ์ และวิกิพีเดียประมาณ 2504900 รายการว่าเป็นทางการ (ราบรื่น) และไม่เป็นทางการ (ไม่ราบรื่น) และฝึกอบรมโครงข่ายประสาทเทียมของเรา เราได้เพิ่มเลเยอร์การฝังลงในโครงข่ายประสาทเทียมของเราด้วยคำว่าเวกเตอร์ที่เราสร้างขึ้นแบบสุ่ม เราได้รับคะแนนความแม่นยำ 95.37% จากแบบจำลองที่เราฝึกมา 10 ยุค
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
หลังจากติดตั้งไลบรารีแล้ว เราจะโหลดโมเดลด้วย Keras
from keras . models import load_model
model = load_model ( 'MODEL_FORMAL.h5' ) # modeli yüklüyoruz
เราสร้างอินพุตทดสอบ
# 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 ]
เราโทเค็นและช่องว่างภายในสำหรับอินพุตทดสอบ
#tokenize
tokens = tokenizer . texts_to_sequences ( texts )
#padding
tokens_pad = pad_sequences ( tokens , maxlen = max_tokens )
แบบจำลองจะทำนายว่าอารมณ์ใดที่อินพุตเหล่านี้อยู่ใกล้
#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
ลิงก์ชุดข้อมูลอย่างเป็นทางการที่มีป้ายกำกับซึ่งมีข้อมูลสร้าง 1204900 แถว: ข้อมูล ลิงก์ชุดข้อมูลทางการที่มีป้ายกำกับซึ่งมีข้อมูล 3934628 แถวที่สร้าง: ข้อมูล
เราฝึกอบรมโมเดล SVM linearSVC, MultinomialNB, LogisticRegression, RandomForestClassifier ด้วยชุดข้อมูลที่มีข้อมูล 27350 ที่ติดป้ายกำกับด้วยอารมณ์ที่แตกต่างกัน 6 แบบ (ความกลัว: ความกลัว ความสุข: ความยินดี ความโศกเศร้า: ความเศร้า ความรังเกียจ: ความรังเกียจ ความโกรธ: ความโกรธ ความประหลาดใจ: ความประหลาดใจ) ก่อนการสร้างแบบจำลอง เราใช้ tfidf vectorizer และรายการคำหยุดภาษาตุรกีเพื่อสร้างเวกเตอร์คำในข้อมูล ในบรรดาโมเดลเหล่านี้ เราได้รับอัตราความแม่นยำสูงสุดด้วยโมเดล LinearSVC
แบบอย่าง | ความแม่นยำ |
---|---|
LinearSVC | 0.80 |
การถดถอยโลจิสติก | 0.79 |
พหุนามNB | 0.78 |
RandomForestลักษณนาม | 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
หลังจากโหลดไลบรารีแล้ว เราจะโหลดและทดสอบโมเดลด้วย 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' ]
เราขอชุดข้อมูลที่เราใช้สำหรับโมเดลนี้จาก TREMODATA นอกจากนี้ ลิงก์ไดรฟ์ที่มีชุดข้อมูลนี้อยู่: ข้อมูล
คุณสามารถแสดงโมเดลในอินเทอร์เฟซได้โดยใช้ Flask API ที่คุณสร้างขึ้นในสภาพแวดล้อมเสมือน ห้องสมุดที่จำเป็นสำหรับสิ่งนี้:
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
คุณสามารถเชื่อมต่อโมเดลของคุณกับฟรอนต์เอนด์ได้โดยการเรียกใช้ไฟล์ app.py
ในส่วนแบ็กเอนด์ เราใช้โมดูล Normalization ของ Zemberek สำหรับตัวแก้ไขตามกฎ นอกจากนี้ เรายังใช้โมดูลการวิเคราะห์คำอย่างไม่เป็นทางการของ Zemberek เพื่อดูข้อความในเวอร์ชันที่เป็นทางการมากขึ้นในส่วนหลัง
เพื่อให้โมเดลเครื่องตรวจตัวสะกดแบบ Deep Learning เรียนรู้ข้อผิดพลาดในการสะกดคำ อาจจำเป็นต้องสร้างข้อมูลในรูปแบบของประโยคที่ถูกต้องหรือเวอร์ชันที่ไม่ถูกต้องของประโยค เราสร้างฟังก์ชันที่มีเสียงดังซึ่งบิดเบือนคำที่เหมาะสมโดยระบุข้อผิดพลาดในการสะกดทั่วไปในภาษาตุรกีและใช้งาน ดังนั้นเราจึงสามารถรับข้อมูลที่สกปรกสำหรับการสร้างแบบจำลองได้ คุณสามารถค้นหาฟังก์ชันต่างๆ ได้ในไฟล์ Noice_Adder_Functions.ipynb
คุณสามารถใช้ชุดข้อมูล Wikipedia ตุรกีที่ล้างแล้วจำนวน 2364897 บรรทัดในการศึกษา NLP ของตุรกีใด ๆ :) ชุดข้อมูล 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/