- 烏米特耶爾馬茲 @ylmz-dev
- Büşra Gökmen @newsteps8
我們的目標是創建一個開源的拼字支援器/檢查器,可以解決土耳其 NLP 文獻中的許多不同問題,提出獨特的方法並消除文獻中研究的缺陷。透過深度學習方法解決使用者編寫的文本中的拼字錯誤,並透過對文本進行語義分析來認識和糾正在這種情況下發生的錯誤。
儘管文獻中有許多庫可以糾正拼字錯誤,但它們都沒有能力糾正語義上下文中發生的錯誤。此類錯誤的例子包括 -da/-de、-ki 和 -mi,它們必須單獨書寫或以連接詞和後綴形式相鄰書寫。我們的工作是完全獨特的,並且比文獻中的任何其他例子表現得更好。以1DCNN、GRU、LSTM RNN作為模型進行測試,選擇2層雙向LSTM作為表現最好的模型,並透過貝葉斯搜尋最佳化技術使其參數達到最佳值。
組合了三個不同的資料集,以便概括並提供正式和非正式語言模型表現的良好結果。這些是 OPUS 字幕資料集、TSCORPUS 維基百科資料集和 TSCORPUS 報紙資料集。
我們的研究處理了超過 8500 萬行資料。作為預處理,相鄰的後綴從單字中分離出來並替換為“X”。單獨的後綴也已替換為“X”。這樣,即使同一句子中存在多個後綴,模型也能給出更準確的結果。預處理後,包含單獨後綴的句子標記為0,包含相鄰後綴的句子標記為1。然後,透過隨機欠採樣減少多餘的 0 和 1 標籤數量,以防止模型學習錯誤。結果,模型學會如何正確書寫後綴,而不是錯誤。創建的數據集的 20% 用作測試數據,10% 用作驗證數據。您可以存取資料資料夾中或從以下標題下的磁碟機連結中以 csv 格式存取的所有資料集。
您可以直接使用 pre_trained_weights 資料夾中的權重載入和測試模型。或者,您可以使用您自己的資料或我們共享的資料以及您使用訓練筆記本建立的模型來訓練您自己的校正器。
您可以在以下標題下找到效能結果、比較、模型區分的句子範例以及資料集的磁碟機連結。
Python 3.6+
git 克隆 https://github.com/Fixy-TR/fixy.git
要安裝該庫:
pip install DeepChecker
您可以使用的功能及其用途:
正確的函數傳回句子的正確版本。檢查函數表示來自句子的 sigmoid 函數的值。接近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 神經網路和大約 260000 個正面和負面標記的情緒資料來訓練我們創建的模型。我們使用隨機創建的詞向量將嵌入層添加到神經網路中。我們訓練了 10 個 epoch 的模型,準確率達到了 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
連結到包含 260000 行資料的標記正負資料集:數據
在我們使用三層 LSTM 神經網路創建的模型中,我們將從 Twitter、報紙和維基百科收到的大約 2504900 個資料標記為正式(平滑)和非正式(不平滑),並訓練我們的神經網路。我們使用隨機創建的詞向量將嵌入層添加到神經網路中。經過 10 個 epoch 訓練的模型獲得了 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 行資料的標籤的非正式資料集連結:資料
我們使用包含27350 個標記有6 種不同情緒(恐懼:恐懼、快樂:喜悅、悲傷:悲傷、厭惡:厭惡、憤怒:憤怒、驚喜:驚訝)的數據的數據集訓練了SVM LinearSVC、MultinomialNB、LogisticRegression、 RandomForestClassifier 模型。在建模之前,我們使用 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 請求了用於該模型的資料集。另外,這個資料集所在的驅動連結: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 行的土耳其維基百科資料集 :) 維基百科資料集
- 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/