团队成员
- Ümit Yılmaz @ylmz-dev
- Büşra Gökmen @newsteps8
FIXY
我们的目标是创建一个开源的写作辅助/检查工具,它能够同时解决土耳其语自然语言处理文献中的多个不同问题,提出独特的方法,并弥补文献中研究的不足。我们希望通过深度学习方法解决用户文本中的拼写错误,同时对文本进行语义分析,以识别和纠正在这一背景下出现的错误。
语义拼写纠正
尽管文献中有许多纠正拼写错误的库,但没有一个能够纠正语义上下文中出现的错误。这类错误中最重要的是连词和后缀的情况,如-da/-de、-ki和-mi,它们应该分开或连在一起写。我们的研究完全独特,表现远远优于文献中的所有其他示例。我们尝试了1DCNN、GRU和LSTM RNN等模型,最终选择了表现最佳的双向LSTM模型,并使用贝叶斯搜索优化技术将参数优化到最佳值。
为了使模型在正式和非正式语言中都能表现良好并具有泛化能力,我们合并了三个不同的数据集。这些数据集包括OPUS字幕数据集、TSCORPUS维基百科数据集和TSCORPUS报纸数据集。
在我们的研究中,处理了超过8500万行的数据。在预处理阶段,我们将连接的后缀与单词分开,并用"X"替换。分开的后缀也用"X"替换。这样做是为了使模型在同一句子中出现多个后缀的情况下也能给出更准确的结果。预处理后,包含分开后缀的句子标记为0,包含连接后缀的句子标记为1。然后,为了防止模型学习错误,我们通过随机欠采样减少了数量较多的0和1标签。最终,模型学会了如何正确书写后缀,而不是学习错误。创建的数据集中,20%用作测试数据,10%用作验证数据。您可以在data文件夹中或通过以下标题下的drive链接访问所有CSV格式的数据集。
您可以使用pre_trained_weights文件夹中的权重直接加载并测试模型。或者,您也可以使用我们共享的数据或您自己的数据,以及您创建的模型,通过train笔记本来训练您自己的纠正器。
您可以在以下标题下分别找到性能结果、比较、模型区分的句子示例以及数据集的drive链接。
要求
Python 3.6+
安装项目
git clone https://github.com/Fixy-TR/fixy.git
DEEPCHECKER库
https://pypi.org/project/DeepChecker/
https://github.com/Fixy-TR/DeepChecker
您可以直接通过pip安装我们发布的用于DE-DA、KI和MI纠正的DeepChecker库。
安装库:
pip install DeepChecker
可用的函数及其用法:
Correct函数返回句子的正确形式。 Check函数返回句子通过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")) # 将输出正确形式
print(check_de("bu yaz bizimkiler de tatile gelecek") # 将输出sigmoid值
DE/-DA的文献比较
研究 | 准确率 |
---|---|
Fixy | 87% |
博斯普鲁斯大学 | 78% |
Google Docs | 34% |
Microsoft Office | 29% |
ITU | 0% |
Libra Office | 0% |
使用博斯普鲁斯大学创建的100个难句进行测试。相关文章
所使用的方法完全原创,与文献中的其他研究采用了不同的方法。性能结果的差异证明了该方法的正确性。
DE-DA、KI和MI所需的库
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
DE-DA纠正器
安装库后,我们加载模型并进行测试。
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的结果表示应该分开写后缀。
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行标记-ki数据集的链接: 数据
KI修正器
安装库后,我们加载模型并进行测试。
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的结果表示应该分开写后缀。
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行标记-ki数据集的链接: 数据
MI-MI-MU-MÜ修正器
安装库后,我们加载模型并进行测试。
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的结果表示应该分开写后缀。
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 |
文献中未发现关于ki和mi后缀的研究,这增加了项目的原创性。
语义文本分析
土耳其语情感分析
我们使用三层LSTM神经网络构建模型,用约26万条标记为正面和负面的情感数据进行训练。我们将随机生成的词向量与嵌入层一起添加到神经网络中。经过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') # 加载模型
创建测试输入。
#测试评论(输入)
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]
对测试输入进行分词和填充
#分词
tokens = turkish_tokenizer.texts_to_sequences(texts)
#填充
tokens_pad = pad_sequences(tokens, maxlen=max_tokens)
模型预测这些输入更接近哪种情感
for i in model.predict(tokens_pad):
if i < 0.5:
print("负面")#发表了负面评论
else
print("正面")#发表了正面评论
负面
负面
负面
正面
负面
正面
正面
创建的包含26万行标记为正面-负面的数据集链接: 数据
土耳其语正式-非正式文本分析
我们使用三层LSTM神经网络创建了一个模型,对从Twitter、报纸和维基百科收集的约2,504,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') # 加载模型
创建测试输入。
# 创建测试输入
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]
对测试输入进行分词和填充
#分词
tokens = tokenizer.texts_to_sequences(texts)
#填充
tokens_pad = pad_sequences(tokens, maxlen=max_tokens)
模型预测这些输入更接近哪种情感
#预测测试数据
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
包含1,204,900行标记为正式的数据集链接: 数据 包含3,934,628行标记为非正式的数据集链接: 数据
土耳其语情感文本分析
我们使用一个包含27,350条数据的数据集,这些数据被标记为6种不同的情感(恐惧、快乐、悲伤、厌恶、愤怒、惊讶),训练了SVM linearSVC、MultinomialNB、LogisticRegression和RandomForestClassifier模型。在建模之前,我们使用tfidf向量化器和土耳其语停用词列表对数据中的词进行向量化。在这些模型中,LinearSVC模型获得了最高的准确率。
模型准确率比较
模型 | 准确率 |
---|---|
LinearSVC | 0.80 |
LogisticRegression | 0.79 |
MultinomialNB | 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加载模型并进行测试。
# 加载模型并测试
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获取了用于此模型的数据集。此数据集的drive链接:数据
fixy_app(Flask API)
您可以使用虚拟环境中创建的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文件中找到这些函数。
清理后的维基百科数据集
您可以在任何土耳其语NLP研究中使用这个包含2,364,897行的清理后的土耳其语维基百科数据集:) 维基百科数据集