- ユミット・ユルマズ @ylmz-dev
- ビュシュラ・ギョクメン @newsteps8
私たちの目的は、トルコ語 NLP 文献のさまざまな問題を解決し、独自のアプローチを提案し、文献内の研究の欠陥を取り除くことができるオープンソースのスペル サポーター/チェッカーを作成することです。ユーザーが書いたテキストのスペルミスを深層学習アプローチで解決し、テキストの意味分析を実行することでこのコンテキストで発生したエラーを認識して修正します。
文献にはスペルミスを修正するライブラリが多数ありますが、意味論的なコンテキストで発生したエラーを修正する機能を備えたライブラリはありませんでした。このようなエラーの例としては、-da/-de、-ki、-mi などがあります。これらは、接続詞や接尾語で個別にまたは隣接して記述する必要があります。私たちの研究は完全にユニークであり、文献にある他のどの例よりもはるかに優れています。 1DCNN、GRU、LSTM RNN がモデルとしてテストされ、2 層双方向 LSTM が最もパフォーマンスの高いモデルとして選択され、そのパラメーターはベイジアン検索最適化手法で最適な値に到達しました。
一般化して、公式言語と非公式言語の両方でモデルのパフォーマンスに優れた結果を提供するために、3 つの異なるデータセットが結合されました。これらは、OPUS Subtitle データセット、TSCORPUS Wikipedia データセット、TSCORPUS 新聞データセットです。
私たちの調査では、8,500 万行を超えるデータが処理されました。前処理として、単語から隣接する接尾辞を切り離し、「X」に置き換えました。個別の接尾辞も「X」に置き換えられています。このようにして、同じ文内に複数の接尾辞がある場合でも、モデルがより正確な結果を与えることを目的としています。前処理後、別々の接尾辞を含む文には 0 のラベルが付けられ、隣接する接尾辞を含む文には 1 のラベルが付けられました。次に、モデルの誤った学習を防ぐために、ランダムなアンダーサンプリングによって過剰な 0 および 1 ラベルの数が削減されました。その結果、モデルは接尾辞の書き方を間違いではなく正しく学習しました。作成されたデータセットの 20% がテスト データとして使用され、10% が検証データとして使用されました。データ フォルダー内の CSV 形式のすべてのデータセット、または以下の見出しの下にあるドライブ リンクからアクセスできます。
pre_trained_weights フォルダー内の重みを使用してモデルを直接ロードしてテストできます。または、独自のデータ、または私たちが共有するデータとトレーニング ノートブックを使用して作成したモデルを使用して、独自の補正者をトレーニングすることもできます。
次の見出しの下で、パフォーマンスの結果、比較、モデルによって区別された文の例、およびデータセットのドライブ リンクを見つけることができます。
Python 3.6+
git clone 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% |
ITU | 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 )
9507636 行のデータを含む、作成されたラベル付き -mi データセットへのリンク: データ
- テストデータの精度: 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 行のデータを含むラベル付きのポジティブ/ネガティブ データセットへのリンク: データ
3 層 LSTM ニューラル ネットワークで作成したモデルでは、Twitter、新聞、Wikipedia から受け取った約 2504,900 のデータを公式 (滑らか) と非公式 (滑らかではない) としてラベル付けし、ニューラル ネットワークをトレーニングしました。ランダムに作成した単語ベクトルを使用して、ニューラル ネットワークに埋め込み層を追加しました。 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 行のデータを含むラベル付きの非公式データセット リンク: データ
SVMのlinearSVC、MultinomialNB、LogisticRegression、RandomForestClassifierモデルを、6つの異なる感情(Fear:恐怖、Happy:喜び、Sadness:悲しみ、Disgust:嫌悪感、Anger:怒り、Suprise:驚き)でラベル付けされた27350のデータを含むデータセットでトレーニングしました。モデリングの前に、tfidf ベクタライザーとトルコ語のストップワード リストを使用して、データ内の単語をベクトル化しました。これらのモデルの中で、LinearSVC モデルが最も高い精度を達成しました。
モデル | 正確さ |
---|---|
リニアSVC | 0.80 |
ロジスティック回帰 | 0.79 |
多項NB | 0.78 |
RandomForestClassifier | 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 ファイルを実行すると、モデルをフロントエンドに接続できます。
バックエンドでは、ルールベースの補正に Zemberek の Normalization モジュールを使用しました。さらに、Zemberek の Informal Word Analysis モジュールを使用して、バックエンド内のテキストのより正式なバージョンを確認しました。
深層学習ベースのスペルチェッカー モデルがスペル エラーを学習するには、正しい文または文の誤ったバージョンの形式でデータを生成する必要がある場合があります。私たちは、トルコ語でよくあるスペルミスを特定して使用することで、適切な単語を歪めるノイズの多い関数を作成しました。したがって、モデリング用のダーティ データを取得できます。関数はファイル Noice_Adder_Functions.ipynb にあります。
2364897 行のクリーン化されたトルコ語 Wikipedia データセットは、トルコ語の 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/