构建命名实体识别应用

概述

本指南将引导您构建和运行一个命名实体识别 (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` 进行比较。如果匹配,程序会打印 **正在退出...** 并跳出 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"实体: {ent.text}, 类型: {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 镜像的轻量级版本,针对大小和速度进行了优化。使用这个 slim 镜像可以减小 Docker 镜像的总体积,从而实现更快的下载和更小的安全漏洞攻击面。这对于可能不需要完整标准 Python 镜像的基于 Python 的应用程序特别有用。

  2. 设置工作目录。

    WORKDIR /app

    `WORKDIR` 设置了 Docker 镜像内当前的工作目录。通过将其设置为 `/app`,您可以确保 Dockerfile 中的所有后续命令(如 `COPY` 和 `RUN`)都在此目录中执行。这也有助于组织您的 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` 标志代表 tag(标签)。它为镜像分配一个名称,本例中为 `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: 这会分配一个伪 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 风格的行尾](/desktop/troubleshoot-and-support/troubleshoot/topics/#Unexpected-syntax-errors-use-Unix-style-line endings-for-files-in-containers)。

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

    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 设置环境并运行该应用程序。

相关信息

后续步骤

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

© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.