构建命名实体识别应用
概览
本指南将引导你构建并运行一个命名实体识别 (NER) 应用。你将使用 Python 和 spaCy 构建该应用,然后使用 Docker 设置环境并运行该应用。
该应用处理输入文本以识别并打印命名实体,例如人名、组织或地点。
前提条件
- 你已安装最新版本的 Docker Desktop。Docker 定期添加新功能,本指南的某些部分可能仅适用于最新版本的 Docker Desktop。
- 你拥有 Git 客户端。本节中的示例使用命令行 Git 客户端,但你可以使用任何客户端。
获取示例应用
打开终端,使用以下命令克隆示例应用的仓库。
$ git clone https://github.com/harsh4870/Docker-NLP.git
验证你已克隆仓库。
你应该在
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
,按照以下步骤探索其内容。
导入所需的库。
import spacy
此行导入
spaCy
库。spaCy
是 Python 中用于自然语言处理 (NLP) 的流行库。加载语言模型。
nlp = spacy.load("en_core_web_sm")
此处,
spacy.load
函数加载一个语言模型。en_core_web_sm
模型是一个小型英语语言模型。你可以使用此模型执行各种 NLP 任务,包括分词、词性标注和命名实体识别。指定主执行块。
if __name__ == "__main__":
这个 Python 惯例确保以下代码块仅在脚本是主程序时运行。它提供了灵活性,允许脚本既可作为独立程序运行,也可作为导入的模块使用。
创建一个无限循环以持续输入。
while True:
此 while 循环会无限期运行,直到明确中断。它允许用户持续输入文本进行实体识别,直到他们决定退出。
获取用户输入。
input_text = input("Enter the text for entity recognition (type 'exit' to end): ")
此行提示用户输入文本。然后,程序将对该文本执行实体识别。
定义退出条件。
if input_text.lower() == 'exit': print("Exiting...") break
如果用户输入内容,程序会将其转换为小写并与
exit
进行比较。如果匹配,程序会打印 Exiting... 并跳出 while 循环,从而有效终止程序。执行命名实体识别。
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)。
创建
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 参考。
指定基础镜像。
FROM python:3.8-slim
此命令为构建奠定基础。
python:3.8-slim
是 Python 3.8 镜像的轻量级版本,针对大小和速度进行了优化。使用此 slim 镜像可减小 Docker 镜像的总大小,从而加快下载速度并减少安全漏洞的攻击面。这对于基于 Python 的应用特别有用,因为你可能不需要完整的标准 Python 镜像。设置工作目录。
WORKDIR /app
WORKDIR
设置 Docker 镜像内的当前工作目录。通过将其设置为/app
,可以确保 Dockerfile 中的所有后续命令(如COPY
和RUN
)在此目录中执行。这也有助于组织你的 Docker 镜像,因为所有与应用相关的文件都包含在特定目录中。将 requirements 文件复制到镜像中。
COPY requirements.txt /app
COPY
命令将requirements.txt
文件从你的本地机器传输到 Docker 镜像中。此文件列出了应用所需的所有 Python 依赖项。将其复制到容器中,可让下一个命令(RUN pip install
)在镜像环境中安装这些依赖项。在镜像中安装 Python 依赖项。
RUN pip install --no-cache-dir -r requirements.txt
此行使用 Python 的包安装程序
pip
安装requirements.txt
中列出的软件包。--no-cache-dir
选项禁用缓存,通过不存储不必要的缓存数据来减小 Docker 镜像的大小。运行其他命令。
RUN python -m spacy download en_core_web_sm
此步骤是需要 spaCy 库的 NLP 应用特有的。它下载
en_core_web_sm
模型,这是 spaCy 的小型英语语言模型。将应用代码复制到镜像中。
COPY *.py /app COPY entrypoint.sh /app
这些命令将你的 Python 脚本和
entrypoint.sh
脚本复制到镜像的/app
目录中。这至关重要,因为容器需要这些脚本来运行应用。entrypoint.sh
脚本特别重要,因为它决定了应用如何在容器内启动。为
entrypoint.sh
脚本设置权限。RUN chmod +x /app/entrypoint.sh
此命令修改
entrypoint.sh
的文件权限,使其可执行。此步骤是必要的,以确保 Docker 容器可以运行此脚本来启动应用。设置入口点。
ENTRYPOINT ["/app/entrypoint.sh"]
ENTRYPOINT
指令将容器配置为将其默认可执行文件设置为entrypoint.sh
。这意味着当容器启动时,它会自动执行该脚本。你可以通过在代码编辑器或文本编辑器中打开
entrypoint.sh
脚本来探索其内容。由于示例包含多个应用,该脚本允许你在容器启动时指定要运行的应用。
运行应用
使用 Docker 运行应用
构建镜像。
在终端中,在
Dockerfile
所在的目录中运行以下命令。$ docker build -t basic-nlp .
以下是该命令的细分
docker build
: 这是用于从 Dockerfile 和上下文构建 Docker 镜像的主要命令。上下文通常是指定位置的一组文件,通常是包含 Dockerfile 的目录。-t basic-nlp
: 这是标记镜像的选项。-t
标志代表 tag(标签)。它为镜像分配一个名称,本例中为basic-nlp
。标签是以后引用镜像的便捷方式,尤其是在将其推送到注册表或运行容器时。.
: 这是命令的最后一部分,指定构建上下文。句点 (.
) 表示当前目录。Docker 将在此目录中查找 Dockerfile。构建上下文(在本例中为当前目录)被发送到 Docker daemon 以启用构建。它包括指定目录中的所有文件和子目录。
有关更多详细信息,请参阅docker build CLI 参考。
Docker 会在构建镜像时向控制台输出多个日志。你会看到它下载并安装依赖项。根据你的网络连接,这可能需要几分钟。Docker 确实具有缓存功能,因此后续构建会更快。构建完成后,控制台将返回提示符。
以容器形式运行镜像。
在终端中,运行以下命令。
$ 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):
测试应用。
输入一些信息以进行命名实体识别。
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 设置环境并运行该应用。
相关信息
下一步
探索更多自然语言处理指南。