- Юмит Йылмаз @ylmz-dev
- Бюшра Гекмен @newsteps8
Наша цель — создать средство поддержки/проверки орфографии с открытым исходным кодом, которое сможет решить множество различных проблем в турецкой литературе по НЛП, предложить уникальные подходы и устранить недостатки исследований в литературе. Исправлять орфографические ошибки в текстах, написанных пользователями, с помощью подхода глубокого обучения, а также осознавать и исправлять ошибки, возникающие в этом контексте, путем выполнения семантического анализа текстов.
Хотя в литературе существует множество библиотек, исправляющих орфографические ошибки, ни одна из них не имела возможности исправлять ошибки, возникшие в семантическом контексте. Примерами таких ошибок являются -da/-de, -ki и -mi, которые необходимо писать раздельно или рядом в союзах и суффиксах. Наша работа совершенно уникальна и работает намного лучше, чем любой другой пример в литературе. В качестве моделей были протестированы 1DCNN, GRU, LSTM RNN, а 2-слойная двунаправленная LSTM была выбрана как наиболее производительная модель, а ее параметры были достигнуты до оптимальных значений с помощью метода байесовской поисковой оптимизации.
Три разных набора данных были объединены, чтобы обобщить и обеспечить хорошие результаты в работе модели как на формальных, так и на неформальных языках. Это набор данных OPUS Subtitle, набор данных TSCORPUS Wikipedia и набор данных газет TSCORPUS.
В нашем исследовании было обработано более 85 миллионов строк данных. В ходе предварительной обработки соседние суффиксы были отделены от слов и заменены на «X». Отдельные суффиксы также заменены на «X». Таким образом, модель будет давать более точные результаты, даже если в одном предложении имеется более одного суффикса. После предварительной обработки предложения, содержащие отдельные суффиксы, были помечены как 0, а предложения, содержащие соседние суффиксы, были помечены как 1. Затем избыточное количество меток 0 и 1 было уменьшено путем случайной недостаточной выборки, чтобы предотвратить неправильное обучение модели. В результате модель научилась правильно писать суффиксы, а не ошибаться. 20% созданных наборов данных использовались в качестве тестовых данных, а 10% — в качестве данных проверки. Вы можете получить доступ ко всем наборам данных в формате csv в папке данных или по ссылкам на диске под заголовками ниже.
Вы можете загружать и тестировать модели непосредственно с весами в папке pre_trained_weights. Или вы можете обучить свой собственный корректор, используя свои собственные данные или данные, которыми мы делимся, и модели, которые вы создаете с помощью обучающих тетрадей.
Вы можете найти результаты производительности, сравнения, примеры предложений, различающихся моделями, а также ссылки на наборы данных под следующими заголовками.
Питон 3.6+
git-клон 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 сложных предложениях, созданных Университетом Богазичи. Связанная статья
Используемая методология совершенно оригинальна и основана на подходе, отличном от других исследований в литературе. Разница в результатах производительности доказывает точность подхода.
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 строк созданных данных: Данные
После установки библиотек загружаем модель и тестируем ее.
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 строки данных, с надписью: Данные.
После установки библиотек загружаем модель и тестируем ее.
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 строк данных: Данные
- Точность тестовых данных: 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 |
Отсутствие исследований суффиксов the и 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 строк данных: Данные
В модели, которую мы создали с помощью трехслойной нейронной сети LSTM, мы пометили примерно 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, LogisticRepression, RandomForestClassifier с набором данных, содержащим 27350 данных, помеченных 6 различными эмоциями (Страх: Страх, Счастье: Радость, Печаль: Печаль, Отвращение: Отвращение, Гнев: Гнев, Удивление: Удивление). Перед моделированием мы использовали векторизатор tfidf и список стоп-слов на турецком языке для векторизации слов в данных. Среди этих моделей мы достигли наивысшего уровня точности с помощью модели LinearSVC.
Модель | Точность |
---|---|
ЛинейныйSVC | 0,80 |
Логистическая регрессия | 0,79 |
МногочленныйNB | 0,78 |
Классификатор случайного леса | 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.
В серверной части мы использовали модуль нормализации Земберека для корректора на основе правил. Кроме того, мы использовали модуль анализа неформальных слов Земберека, чтобы увидеть более формальные версии текстов в серверной части.
Чтобы модели проверки орфографии на основе глубокого обучения могли распознавать орфографические ошибки, может потребоваться создание данных в виде правильных предложений или неправильных версий предложений. Мы создали шумные функции, которые искажают правильные слова, выявляя распространенные орфографические ошибки в турецком языке и используя их. Таким образом, мы можем получить грязные данные для моделирования. Вы можете найти функции в файле Noice_Adder_Functions.ipynb.
Вы можете использовать очищенный набор данных турецкой Википедии из 2364897 строк в любом турецком исследовании НЛП :) Набор данных Википедии
- 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/