构建文本识别应用程序

概述

在本指南中,您将学习如何创建和运行文本识别应用程序。您将使用 Python、scikit-learn 和自然语言工具包 (NLTK) 构建应用程序。然后,您将使用 Docker 设置环境并运行应用程序。

该应用程序使用 NLTK 的 SentimentIntensityAnalyzer 分析用户输入文本的情绪。它允许用户输入文本,然后对其进行处理以确定其情绪,将其分类为正面或负面。此外,它还根据预定义的数据集显示其情绪分析模型的准确性和详细的分类报告。

先决条件

  • 您已安装最新版本的Docker Desktop。Docker 定期添加新功能,本指南的某些部分可能仅适用于最新版本的 Docker Desktop。
  • 您拥有一个Git客户端。本节中的示例使用基于命令行的 Git 客户端,但您可以使用任何客户端。

获取示例应用程序

  1. 打开终端,并使用以下命令克隆示例应用程序的存储库。

    $ git clone https://github.com/harsh4870/Docker-NLP.git
    
  2. 验证您是否克隆了存储库。

    您应该在 Docker-NLP 目录中看到以下文件。

    01_sentiment_analysis.py
    02_name_entity_recognition.py
    03_text_classification.py
    04_text_summarization.py
    05_language_translation.py
    entrypoint.sh
    requirements.txt
    Dockerfile
    README.md

浏览应用程序代码

文本分类应用程序的源代码位于 Docker-NLP/03_text_classification.py 文件中。在文本或代码编辑器中打开 03_text_classification.py,按照以下步骤浏览其内容。

  1. 导入所需的库。

    import nltk
    from nltk.sentiment import SentimentIntensityAnalyzer
    from sklearn.metrics import accuracy_score, classification_report
    from sklearn.model_selection import train_test_split
    import ssl
    • nltk:一个流行的 Python 自然语言处理 (NLP) 库。
    • SentimentIntensityAnalyzernltk 中用于情感分析的组件。
    • accuracy_scoreclassification_report:来自 scikit-learn 的用于评估模型的函数。
    • train_test_split:来自 scikit-learn 的用于将数据集拆分为训练集和测试集的函数。
    • ssl:用于处理下载 nltk 数据时可能出现的 SSL 证书问题。
  2. 处理 SSL 证书验证。

    try:
        _create_unverified_https_context = ssl._create_unverified_context
    except AttributeError:
        pass
    else:
        ssl._create_default_https_context = _create_unverified_https_context

    此代码块是针对某些环境的解决方法,在这些环境中,由于 SSL 证书验证问题,通过 NLTK 下载数据可能会失败。它告诉 Python 忽略 HTTPS 请求的 SSL 证书验证。

  3. 下载 NLTK 资源。

    nltk.download('vader_lexicon')

    vader_lexiconSentimentIntensityAnalyzer 用于情感分析的词典。

  4. 定义用于测试的文本和相应的标签。

    texts = [...]
    labels = [0, 1, 2, 0, 1, 2]

    此部分定义了一个小型文本数据集及其相应的标签(0 代表正面,1 代表负面,2 代表垃圾邮件)。

  5. 拆分测试数据。

    X_train, X_test, y_train, y_test = train_test_split(texts, labels, test_size=0.2, random_state=42)

    此部分将数据集拆分为训练集和测试集,其中 20% 的数据作为测试集。由于此应用程序使用预训练模型,因此它不会训练模型。

  6. 设置情感分析。

    sia = SentimentIntensityAnalyzer()

    此代码初始化 SentimentIntensityAnalyzer 以分析文本的情感。

  7. 为测试数据生成预测和分类。

    vader_predictions = [sia.polarity_scores(text)["compound"] for text in X_test]
    threshold = 0.2
    vader_classifications = [0 if score > threshold else 1 for score in vader_predictions]

    此部分为测试集中的每个文本生成情感分数,并根据阈值将其分类为正面或负面。

  8. 评估模型。

    accuracy = accuracy_score(y_test, vader_classifications)
    report_vader = classification_report(y_test, vader_classifications, zero_division='warn')

    此部分计算预测的准确性和分类报告。

  9. 指定主执行块。

    if __name__ == "__main__":

    此 Python 习惯用法确保以下代码块仅在此脚本为主程序时运行。它提供了灵活性,允许脚本既可以作为独立程序运行,也可以作为导入的模块运行。

  10. 创建一个无限循环以进行连续输入。

       while True:
        input_text = input("Enter the text for classification (type 'exit' to end): ")
    
          if input_text.lower() == 'exit':
             print("Exiting...")
             break

    此 while 循环无限期运行,直到显式中断。它允许用户持续输入文本进行实体识别,直到他们决定退出。

  11. 分析文本。

            input_text_score = sia.polarity_scores(input_text)["compound"]
            input_text_classification = 0 if input_text_score > threshold else 1
  12. 打印 VADER 分类报告和情感分析。

            print(f"Accuracy: {accuracy:.2f}")
            print("\nVADER Classification Report:")
            print(report_vader)
    
            print(f"\nTest Text (Positive): '{input_text}'")
            print(f"Predicted Sentiment: {'Positive' if input_text_classification == 0 else 'Negative'}")
  13. 创建 requirements.txt。示例应用程序已包含 requirements.txt 文件以指定应用程序导入的必要包。在代码或文本编辑器中打开 requirements.txt 以浏览其内容。

    # 01 sentiment_analysis
    nltk==3.6.5
    
    ...
    
    # 03 text_classification
    scikit-learn==1.3.2
    
    ...

    文本分类应用程序需要 nltkscikit-learn 模块。

浏览应用程序环境

您将使用 Docker 在容器中运行应用程序。Docker 允许您容器化应用程序,为运行应用程序提供一致且隔离的环境。这意味着应用程序将在其 Docker 容器中按预期运行,而不管底层系统的差异。

要在容器中运行应用程序,需要一个 Dockerfile。Dockerfile 是一个文本文档,其中包含您将在命令行上调用的所有命令以组装镜像。镜像是一个只读模板,其中包含创建 Docker 容器的说明。

示例应用程序已包含一个 Dockerfile。在代码或文本编辑器中打开 Dockerfile 以浏览其内容。

以下步骤解释了 Dockerfile 的每个部分。有关更多详细信息,请参阅Dockerfile 参考

  1. 指定基础镜像。

    FROM python:3.8-slim

    此命令为构建奠定了基础。python:3.8-slim 是 Python 3.8 镜像的轻量级版本,针对大小和速度进行了优化。使用此精简镜像可减小 Docker 镜像的整体大小,从而加快下载速度并减少安全漏洞的攻击面。这对于基于 Python 的应用程序特别有用,在这种应用程序中,您可能不需要完整的标准 Python 镜像。

  2. 设置工作目录。

    WORKDIR /app

    WORKDIR 设置 Docker 镜像中的当前工作目录。将其设置为 /app,您可以确保 Dockerfile 中的后续所有命令(如 COPYRUN)都在此目录中执行。这也有助于组织您的 Docker 镜像,因为所有与应用程序相关的文件都包含在特定目录中。

  3. 将 requirements 文件复制到镜像中。

    COPY requirements.txt /app

    COPY 命令将 requirements.txt 文件从您的本地计算机传输到 Docker 镜像中。此文件列出了应用程序所需的所有 Python 依赖项。将其复制到容器中允许下一个命令 (RUN pip install) 在镜像环境中安装这些依赖项。

  4. 在镜像中安装 Python 依赖项。

    RUN pip install --no-cache-dir -r requirements.txt

    此行使用 pip(Python 的包安装程序)来安装 requirements.txt 中列出的包。--no-cache-dir 选项禁用缓存,这可以通过不存储不必要的缓存数据来减小 Docker 镜像的大小。

  5. 运行其他命令。

    RUN python -m spacy download en_core_web_sm

    此步骤特定于需要 spaCy 库的 NLP 应用程序。它下载 en_core_web_sm 模型,这是一个用于 spaCy 的小型英语语言模型。虽然此应用程序不需要此模型,但出于与可能使用此 Dockerfile 的其他 NLP 应用程序的兼容性,它包含在内。

  6. 将应用程序代码复制到镜像中。

    COPY *.py /app
    COPY entrypoint.sh /app

    这些命令将您的 Python 脚本和 entrypoint.sh 脚本复制到镜像的 /app 目录中。这至关重要,因为容器需要这些脚本才能运行应用程序。entrypoint.sh 脚本特别重要,因为它决定了应用程序如何在容器中启动。

  7. 设置entrypoint.sh脚本的权限。

    RUN chmod +x /app/entrypoint.sh

    此命令修改entrypoint.sh的文件权限,使其可执行。此步骤对于确保Docker容器可以运行此脚本以启动应用程序是必要的。

  8. 设置入口点。

    ENTRYPOINT ["/app/entrypoint.sh"]

    ENTRYPOINT指令将容器配置为运行entrypoint.sh作为其默认可执行文件。这意味着当容器启动时,它会自动执行该脚本。

    您可以通过在代码或文本编辑器中打开它来浏览entrypoint.sh脚本。由于示例包含多个应用程序,因此该脚本允许您指定容器启动时要运行的应用程序。

运行应用程序

使用Docker运行应用程序

  1. 构建镜像。

    在终端中,在Dockerfile所在的目录内运行以下命令。

    $ docker build -t basic-nlp .
    

    以下是命令的分解

    • docker build:这是用于根据Dockerfile和上下文构建Docker镜像的主要命令。上下文通常是一组指定位置的文件,通常是包含Dockerfile的目录。
    • -t basic-nlp:这是标记镜像的选项。-t标志代表标签。它为镜像分配一个名称,在本例中为basic-nlp。标签是稍后引用镜像的便捷方法,尤其是在将它们推送到注册表或运行容器时。
    • .:这是命令的最后一部分,它指定构建上下文。句点 (.) 表示当前目录。Docker 将在此目录中查找 Dockerfile。构建上下文(在本例中为当前目录)将发送到 Docker 守护程序以启用构建。它包括指定目录中的所有文件和子目录。

    更多详情,请参见docker build CLI 参考

    Docker 在构建镜像时会向您的控制台输出多个日志。您会看到它下载并安装依赖项。根据您的网络连接,这可能需要几分钟时间。Docker 确实具有缓存功能,因此后续构建可以更快。完成后,控制台将返回提示符。

  2. 将镜像作为容器运行。

    在终端中,运行以下命令。

    $ docker run -it basic-nlp 03_text_classification.py
    

    以下是命令的分解

    • docker run:这是用于根据Docker镜像运行新容器的主要命令。
    • -it:这是两个选项的组合
      • -i--interactive:即使未附加,此选项也会保持标准输入 (STDIN) 打开。它允许容器在前景中保持运行并具有交互性。
      • -t--tty:这将分配一个伪 TTY,基本上模拟一个终端,例如命令提示符或 shell。它可以让您与容器内的应用程序进行交互。
    • basic-nlp:这指定了用于创建容器的 Docker 镜像的名称。在本例中,它是使用 docker build 命令创建的名为 basic-nlp 的镜像。
    • 03_text_classification.py:这是您想要在 Docker 容器内运行的脚本。它被传递给 entrypoint.sh 脚本,该脚本在容器启动时运行它。

    更多详情,请参见docker run CLI 参考

    注意

    对于 Windows 用户,运行容器时可能会出现错误。验证entrypoint.sh中的行尾是LF (\n) 而不是CRLF (\r\n),然后重新构建镜像。更多详情,请参见避免意外的语法错误,为容器中的文件使用 Unix 风格的行尾

    容器启动后,您将在控制台中看到以下内容。

    Enter the text for classification (type 'exit' to end):
    
  3. 测试应用程序。

    输入一些文本以获取文本分类。

    Enter the text for classification (type 'exit' to end): I love containers!
    Accuracy: 1.00
    
    VADER Classification Report:
                  precision    recall  f1-score   support
    
               0       1.00      1.00      1.00         1
               1       1.00      1.00      1.00         1
    
        accuracy                           1.00         2
       macro avg       1.00      1.00      1.00         2
    weighted avg       1.00      1.00      1.00         2
    
    Test Text (Positive): 'I love containers!'
    Predicted Sentiment: Positive
    

总结

在本指南中,您学习了如何构建和运行文本分类应用程序。您学习了如何使用 Python 和 scikit-learn 和 NLTK 构建应用程序。然后,您学习了如何设置环境并使用 Docker 运行应用程序。

相关信息

后续步骤

探索更多自然语言处理指南