如何构建一个Flask语言检测系统

129 阅读3分钟

构建一个Flask语言检测系统

今天有超过一千种语言在使用,不同母语的人之间的沟通是至关重要的。这就是为什么像谷歌这样的公司正在将自然语言处理(NLP)应用到他们的产品中,如Chrome浏览器的语言检测,以给用户带来流畅的体验。

语言检测是自然语言处理(NLP)中的一项任务,它可以识别给定文本或短语的语言并提供其翻译。

在这篇文章中,我们将使用Python和Kaggle的语言检测数据集建立一个语言检测模型。此外,我们将使用Flask,一个易于使用的Python微型网络框架来测试和部署该模型。

前提条件

要跟上这篇文章,读者应该具备以下条件。

  • 有机器学习的基本知识。
  • 在他们的机器上安装了Python和[Jupyter Notebook]。
  • [Flask]框架的基础知识。

建立语言检测模型

要开展这个项目,最好先建立一个开发环境。

设置开发环境

第一步将是创建一个项目文件夹和一个虚拟环境来处理项目的依赖关系。

运行下面的命令来创建项目的文件夹。

mkdir langdetect
cd langdetect

在新创建的文件夹langdetect ,创建一个虚拟环境,并使用以下命令激活它。

py -m venv .env #create a virtual environment named .env
cd .env/Scripts/activate # activate the environment

接下来,在langdetect 文件夹中创建一个新文件,languagedetection.ipynb 。然后,用Jupyter Notebook打开该文件。

导入库

我们需要导入库,如下面的片段所示。

import numpy as np
import pandas as pd
import seaborn as sns
import re          #(regular expression)
import matplotlib.pyplot as plt
import warnings
warnings.simplefilter("ignore")

接下来,使用下面的代码片断读取数据集。

df= pd.read_csv("Language Detection.csv")
df.head()

我们需要检查数据集中的语言数量。使用下面的代码片断来进行该操作。

df["Language"].value_counts()

我们的数据集有17种语言。英语、法语、西班牙语、葡萄牙语、意大利语、俄语、瑞典语、马拉雅拉姆语、荷兰语、阿拉伯语、土耳其语、德语、泰米尔语、丹麦语、卡纳达语、希腊语和印度语。

数据预处理

在这里,我们将把数据转化为模型所需的可用格式。

首先,将数据分成因变量和自变量。我们将使用X 作为自变量(特征),y 作为因变量(标签/目标)。

X = df["Text"]
y = df["Language"]

接下来,我们将使用LabelEncoder() ,对标签**(语言**)进行编码。

编码是将分类数据转换为数字数据的过程。编码是必要的,这样可以使数据很容易被装入模型并提高其性能。

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
y = le.fit_transform(y)

在下一步,我们需要对我们的特征**(文本**)进行预处理,如下图所示。

text_list = []

# iterating through all the text
for text in X:         
    text = re.sub(r'[!@#$(),n"%^*?:;~`0-9]', ' ', text)      # removes all the symbols and numbers
    text = re.sub(r'[[]]', ' ', text)   
    text = text.lower()          # converts all the text to lower case
    text_list.append(text)       # appends the text to the text_list

然后,我们通过使用CountVectorizer() 方法的Bag of Words模型对我们的特征**(Text**)进行编码。

词袋是一种用于将文本转化为向量的方法,它允许模型访问一个词在文档中出现的次数。总之,它将一个短语或一个句子表示为一个单词袋(容器),而不考虑单词的结构或模式。

from sklearn.feature_extraction.text import CountVectorizer
cv = CountVectorizer() 
X = cv.fit_transform(text_list).toarray() # tokenize a collection of text documents and store it
                                            #in an array
X.shape # check the shape of the data

建立数据模型

一旦我们完成了对数据的处理,我们需要将数据分成训练集和测试集。使用下面的片段,将数据分成训练集和测试集。

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size = 0.80, random_state=32)

到这时,我们需要训练模型。我们将使用MultinomialNB 分类器,它最适合于对离散特征进行分类。使用下面的代码片断,应用MultinomialNB 分类器来训练你的模型。

from sklearn.naive_bayes import MultinomialNB  
model = MultinomialNB()
model.fit(X_train, y_train)

一旦训练完成,我们需要使用测试集来预测模型的输出。

y_pred = model.predict(X_test)
y_pred

模型评估

建模后,使用下面的代码片断评估模型的性能。

from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
acc = accuracy_score(y_test, y_pred)
cm = confusion_matrix(y_test, y_pred)
print("Accuracy is :",acc)

结果很好,如下图所示。

accuracy

使用该模型进行推断

我们现在将尝试使用我们的模型来预测一个句子的语言。当提供句子时,模型应该输出该句子的语言。

def predict(txt):
     lang = cv.transform([txt]).toarray() # convert text to bag of words model (Vector)
     language = model.predict(lang) # predict the language
     language = le.inverse_transform(language) # find the language corresponding with the predicted value
     print ("The language is in", language[0]) # printing the language

predict('I went home yesterday')  # Call the function

如下图所示,我们预测的输出是 "英语"。

output

我们现在可以使用Pickle 保存模型,如下图所示。

import pickle
pickle.dump(model, open('model.pkl','wb'))

建模过程结束后,我们将使用Flask部署模型。

使用Flask部署模型

在部署之前,我们需要安装Flask框架包。

pip install flask

然后,我们需要创建以下文件。

  • model.pkl - 要使用的保存的模型。
  • apps.py - 连接网页和模型。
  • index.html- 显示网页。
  • style.css - 要对HTML页面进行样式设计。

index.html 文件中,添加以下片段。

<!DOCTYPE  html>
<html  >
    <head>
        <meta  charset="UTF-8">
        <title>Language Detection</title>

        <link  href='https://fonts.googleapis.com/css?family=Pacifico'  rel='stylesheet'  type='text/css'>
        <link  href='https://fonts.googleapis.com/css?family=Arimo'  rel='stylesheet'  type='text/css'>
        <link  href='https://fonts.googleapis.com/css?family=Hind:300'  rel='stylesheet'  type='text/css'>
        <link  href='https://fonts.googleapis.com/css?family=Open+Sans+Condensed:300'  rel='stylesheet'  type='text/css'>
        <link  rel="stylesheet"  href="{{ url_for('static', filename='css/style.css') }}">

    </head>
    <body>
        <div  class="login">
        <h1>What Language is this?</h1>
        <!-- User Input -->
            <form  action="{{ url_for('predict')}}"method="post">
                <input  type="text"  name="text"  placeholder="Text"  required="required"  />
                <button  type="submit"  class="btn btn-primary btn-block btn-large">Predict</button>
            </form>
        <br>
        <br>
        {{ prediction_text }}
        </div>
    </body>
</html>

style.css 文件上做以下修改,以设计网页的样式,然后通过添加以下代码段,用apps.py 文件将网页与模型连接起来。

import pandas as pd
from flask import Flask, request, render_template
import pickle
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.preprocessing import LabelEncoder
import re

cv = CountVectorizer()
le = LabelEncoder()

app = Flask(__name__)

@app.route('/')
def home():
    return render_template('index.html')

@app.route('/predict',methods=['POST'])
def predict():
    
    # Read data
    df = pd.read_csv("Language Detection.csv")

    # feature and label extraction
    X = df["Text"]
    y = df["Language"]

    # Label encoding
    from sklearn.preprocessing import LabelEncoder
    le = LabelEncoder()
    y = le.fit_transform(y)

    # cleaning the data
    text_list = []

    # iterating through all the text
    for text in X:         
        text = re.sub(r'[!@#$(),n"%^*?:;~`0-9]', ' ', text) 
        text = re.sub(r'[[]]', ' ', text)   
        text = text.lower()
        text_list.append(text)
    
    
    # Encode the feature(text)

    from sklearn.feature_extraction.text import CountVectorizer
    cv = CountVectorizer() 
    X = cv.fit_transform(text_list).toarray() 
                                            
    # split the dataset
    from sklearn.model_selection import train_test_split
    X_train, X_test, y_train, y_test = train_test_split(X, y, train_size = 0.80, random_state=32)

    # Model Training
    from sklearn.naive_bayes import MultinomialNB  
    model = MultinomialNB()
    model.fit(X_train, y_train)

    if request.method == 'POST':
        txt = request.form['text']
        t_o_b = cv.transform([txt]).toarray()
        language = model.predict(t_o_b) 
        corr_language = le.inverse_transform(language) 
    
        output = corr_language[0]

    return render_template('index.html', prediction='Language is in {}'.format(output))

if __name__ == "__main__":
    app.run(debug=True)

完成上述修改后,使用以下命令运行网络服务器,看看模型的工作情况。

python apps.py

home page

在上述任何一种语言中输入一个单词,然后点击预测按钮,查看结果。下面的一个例子是一个短语*"Hur mår du "的结果。*

results

结论

我们已经建立了一个语言检测模型,并使用Flask进行了部署。如上所述,这些知识可以应用于其他NLP项目,如欺诈和仇恨言论检测。