- 乌米特·耶尔马兹 @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% |
谷歌文档 | 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/