构建命名实体识别应用程序

概述

本指南将引导您构建和运行命名实体识别 (NER) 应用程序。您将使用 Python 和 spaCy 构建应用程序,然后使用 Docker 设置环境并运行应用程序。

该应用程序处理输入文本以识别和打印命名实体,例如人、组织或地点。

先决条件

  • 您已安装最新版本的 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/02_name_entity_recognition.py 文件中。在以下步骤中,在文本或代码编辑器中打开 02_name_entity_recognition.py 以探索其内容。

  1. 导入所需的库。

    import spacy

    这行代码导入 spaCy 库。spaCy 是 Python 中一个流行的库,用于自然语言处理 (NLP)。

  2. 加载语言模型。

    nlp = spacy.load("en_core_web_sm")

    这里,spacy.load 函数加载语言模型。en_core_web_sm 模型是一个小型英语语言模型。您可以使用此模型完成各种 NLP 任务,包括分词、词性标注和命名实体识别。

  3. 指定主执行块。

    if __name__ == "__main__":

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

  4. 创建一个用于连续输入的无限循环。

       while True:

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

  5. 获取用户输入。

    input_text = input("Enter the text for entity recognition (type 'exit' to end): ")

    这行代码提示用户输入文本。程序将对该文本执行实体识别。

  6. 定义退出条件。

    if input_text.lower() == 'exit':
       print("Exiting...")
       break

    如果用户输入内容,程序会将输入转换为小写并将其与 exit 进行比较。如果匹配,程序会打印 Exiting... 并退出 while 循环,有效地结束程序。

  7. 执行命名实体识别。

    doc = nlp(input_text)
    
    for ent in doc.ents:
       print(f"Entity: {ent.text}, Type: {ent.label_}")
    • doc = nlp(input_text):这里,nlp 模型处理用户输入的文本。这将创建一个 Doc 对象,其中包含各种 NLP 属性,包括识别的实体。
    • for ent in doc.ents::此循环遍历文本中找到的实体。
    • print(f"Entity: {ent.text}, Type: {ent.label_}"):对于每个实体,它都会打印实体文本及其类型(如 PERSON、ORG 或 GPE)。
  8. 创建 requirements.txt

    示例应用程序已经包含 requirements.txt 文件,以指定应用程序导入的必要软件包。在代码或文本编辑器中打开 requirements.txt 以探索其内容。

    # 02 named_entity_recognition
    spacy==3.7.2
    
    ...

    命名识别应用程序仅需要 spacy 软件包。

探索应用程序环境

您将使用 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 的小型英语语言模型。

  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 02_name_entity_recognition.py
    

    以下是命令的分解

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

    有关更多详细信息,请参阅 docker run CLI 参考

    注意

    对于 Windows 用户,您在运行容器时可能会收到错误。验证 entrypoint.sh 中的行尾是否为 LF (\n),而不是 CRLF (\r\n),然后重建镜像。有关更多详细信息,请参阅 避免意外的语法错误,为容器中的文件使用 Unix 样式的行尾

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

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

    输入一些信息以获取命名实体识别。

    Enter the text for entity recognition (type 'exit' to end): Apple Inc. is planning to open a new store in San Francisco. Tim Cook is the CEO of Apple.
    
    Entity: Apple Inc., Type: ORG
    Entity: San Francisco, Type: GPE
    Entity: Tim Cook, Type: PERSON
    Entity: Apple, Type: ORG
    

总结

本指南演示了如何构建和运行命名实体识别应用程序。您了解了如何使用 Python 和 spaCy 构建应用程序,然后使用 Docker 设置环境并运行应用程序。

相关信息

下一步

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