- Ümit Yılmaz @ylmz-dev
- 부스라 괴크멘 @newsteps8
우리의 목표는 터키 NLP 문헌의 다양한 문제를 해결하고, 독특한 접근 방식을 제시하며, 문헌 연구의 결함을 제거할 수 있는 오픈 소스 철자법 지원/검사기를 만드는 것입니다. 사용자가 작성한 텍스트의 맞춤법 오류를 딥러닝 접근 방식으로 해결하고, 텍스트에 대한 의미 분석을 수행하여 이러한 맥락에서 발생하는 오류를 실현하고 수정합니다.
비록 철자 오류를 정정하는 문헌에는 많은 라이브러리가 있지만 그 중 어느 것도 의미론적 맥락에서 발생한 오류를 정정할 수 있는 능력을 갖고 있지 않았습니다. 이러한 오류의 예로는 -da/-de, -ki, -mi 등이 있으며, 접속사와 접미사를 함께 사용하거나 별도로 작성해야 합니다. 우리의 작업은 완전히 독특하며 문헌의 다른 어떤 사례보다 훨씬 더 나은 성능을 발휘합니다. 모델로는 1DCNN, GRU, LSTM RNN을 테스트하였고, 가장 성능이 좋은 모델로는 2-layer Bidirection LSTM을 선택하였고, 베이지안 검색 최적화 기법을 통해 해당 매개변수를 최적의 값에 도달시켰다.
공식 언어와 비공식 언어 모두에서 모델 성능에 대한 좋은 결과를 일반화하고 제공하기 위해 세 가지 다른 데이터 세트가 결합되었습니다. 이는 OPUS 자막 데이터세트, TSCORPUS Wikipedia 데이터세트 및 TSCORPUS 신문 데이터세트입니다.
우리 연구에서는 8,500만 개 이상의 데이터 행이 처리되었습니다. 전처리 과정에서 인접 접미사를 단어와 분리하고 "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% |
구글 문서 | 34% |
마이크로소프트 오피스 | 29% |
ITU | 0% |
천칭자리 사무실 | 0% |
Boğaziçi 대학에서 만든 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개의 데이터 행을 포함하는 데이터 레이블이 지정된 데이터세트 링크: 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 |
304,244개의 데이터 행을 포함하고 라벨이 붙은 데이터 세트에 대한 링크: 데이터
라이브러리를 설치한 후 모델을 로드하고 테스트합니다.
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 )
9507636개의 데이터 행을 포함하는 생성된 레이블이 지정된 -mi 데이터세트에 대한 링크: 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 접미사에 대한 연구가 없다는 사실은 프로젝트의 독창성을 증가시킵니다.
우리는 약 260,000개의 긍정적 및 부정적 레이블이 지정된 감정 데이터를 사용하여 3계층 LSTM 신경망으로 만든 모델을 훈련했습니다. 우리는 무작위로 생성한 단어 벡터를 사용하여 신경망에 임베딩 레이어를 추가했습니다. 우리는 10개의 에포크로 훈련한 모델에서 94.57%의 정확도 점수를 달성했습니다.
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
3계층 LSTM 신경망으로 만든 모델에서 우리는 트위터, 신문, 위키피디아에서 받은 데이터 중 약 2504900개를 공식(부드러움) 및 비공식(부드럽지 않음)으로 분류하고 신경망을 훈련했습니다. 우리는 무작위로 생성한 단어 벡터를 사용하여 신경망에 임베딩 레이어를 추가했습니다. 우리는 10개의 에포크로 훈련한 모델에서 95.37%의 정확도 점수를 달성했습니다.
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개의 데이터 행을 포함하는 레이블이 있는 비공식 데이터세트 링크: 데이터
우리는 6가지 감정(공포: 공포, 행복: 기쁨, 슬픔: 슬픔, 혐오: 혐오, 분노: 분노, 놀라움: 놀라움)으로 라벨이 지정된 27350개의 데이터가 포함된 데이터 세트를 사용하여 SVM 선형SVC, MultinomialNB, LogisticRegression, RandomForestClassifier 모델을 훈련했습니다. 모델링하기 전에 tfidf 벡터화 도구와 터키어 중지 단어 목록을 사용하여 데이터의 단어를 벡터화했습니다. 이 모델 중에서 우리는 LinearSVC 모델로 가장 높은 정확도를 달성했습니다.
모델 | 정확성 |
---|---|
선형SVC | 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에서 이 모델에 사용한 데이터 세트를 요청했습니다. 또한 이 데이터세트가 위치한 드라이브 링크: Data
가상 환경에서 생성한 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 파일을 실행하여 모델을 프런트엔드에 연결할 수 있습니다.
백엔드에서는 규칙 기반 교정기에 Zemberek의 정규화 모듈을 사용했습니다. 또한 우리는 Zemberek의 비공식 단어 분석 모듈을 사용하여 백엔드에 있는 텍스트의 보다 공식적인 버전을 확인했습니다.
딥러닝 기반 맞춤법 검사기 모델이 맞춤법 오류를 학습하려면 올바른 문장이나 잘못된 버전의 문장 형태로 데이터를 생성해야 할 수도 있습니다. 우리는 터키어에서 흔히 발생하는 철자 오류를 식별하고 이를 사용하여 적절한 단어를 왜곡하는 시끄러운 기능을 만들었습니다. 따라서 모델링을 위한 더티 데이터를 얻을 수 있습니다. Noice_Adder_Functions.ipynb 파일에서 함수를 찾을 수 있습니다.
모든 터키어 NLP 연구에서 2364897줄의 정리된 터키어 Wikipedia 데이터세트를 사용할 수 있습니다. :) 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/