构建文本识别应用
概述
在本指南中,您将学习如何创建和运行一个文本识别应用程序。您将使用 Python、scikit-learn 和自然语言工具包 (NLTK) 来构建该应用程序。然后,您将设置环境并使用 Docker 运行该应用程序。
该应用程序使用 NLTK 的 SentimentIntensityAnalyzer 分析用户输入文本的情感。它允许用户输入文本,然后对文本进行处理以确定其情感,将其分类为积极或消极。此外,它还根据预定义的数据集显示其情感分析模型的准确度和详细的分类报告。
先决条件
- 您已安装最新版本的 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/03_text_classification.py 文件中。在文本或代码编辑器中打开 03_text_classification.py,以便在接下来的步骤中探索其内容。
导入所需的库。
import nltk from nltk.sentiment import SentimentIntensityAnalyzer from sklearn.metrics import accuracy_score, classification_report from sklearn.model_selection import train_test_split import sslnltk:一个流行的用于自然语言处理 (NLP) 的 Python 库。SentimentIntensityAnalyzer:nltk中用于情感分析的组件。accuracy_score,classification_report:来自 scikit-learn 的函数,用于评估模型。train_test_split:scikit-learn 中的函数,用于将数据集分割为训练集和测试集。ssl:用于处理下载nltk数据时可能出现的 SSL 证书问题。
处理 SSL 证书验证。
try: _create_unverified_https_context = ssl._create_unverified_context except AttributeError: pass else: ssl._create_default_https_context = _create_unverified_https_context这个代码块是一个变通方法,适用于某些环境中通过 NLTK 下载数据可能因 SSL 证书验证问题而失败的情况。它告诉 Python 在 HTTPS 请求中忽略 SSL 证书验证。
下载 NLTK 资源。
nltk.download('vader_lexicon')vader_lexicon是SentimentIntensityAnalyzer用于情感分析的词典。定义用于测试的文本和相应的标签。
texts = [...] labels = [0, 1, 2, 0, 1, 2]本节定义了一个小的数据集,包含文本及其相应的标签(0 表示积极,1 表示消极,2 表示垃圾信息)。
拆分测试数据。
X_train, X_test, y_train, y_test = train_test_split(texts, labels, test_size=0.2, random_state=42)这部分将数据集划分为训练集和测试集,其中 20% 的数据作为测试集。由于此应用程序使用预训练模型,因此不会训练模型。
设置情感分析。
sia = SentimentIntensityAnalyzer()此代码初始化
SentimentIntensityAnalyzer以分析文本的情感。为测试数据生成预测和分类。
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]这部分为测试集中的每个文本生成情感分数,并根据阈值将其分类为积极或消极。
评估模型。
accuracy = accuracy_score(y_test, vader_classifications) report_vader = classification_report(y_test, vader_classifications, zero_division='warn')这部分计算预测的准确度和分类报告。
指定主执行块。
if __name__ == "__main__":这个 Python 惯用法确保了以下代码块仅在该脚本是主程序时运行。它提供了灵活性,允许该脚本既可以作为独立程序运行,也可以作为导入的模块使用。
创建一个无限循环以进行连续输入。
while True: input_text = input("Enter the text for classification (type 'exit' to end): ") if input_text.lower() == 'exit': print("Exiting...") break这个 while 循环会无限运行,直到被明确中断。它允许用户连续输入文本进行实体识别,直到他们决定退出。
分析文本。
input_text_score = sia.polarity_scores(input_text)["compound"] input_text_classification = 0 if input_text_score > threshold else 1打印 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'}")创建
requirements.txt。示例应用程序已包含requirements.txt文件,用于指定应用程序导入的必要软件包。在代码或文本编辑器中打开requirements.txt来查看其内容。# 01 sentiment_analysis nltk==3.6.5 ... # 03 text_classification scikit-learn==1.3.2 ...文本分类应用程序需要
nltk和scikit-learn这两个模块。
探索应用程序环境
您将使用 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 /appWORKDIR设置 Docker 镜像中的当前工作目录。通过将其设置为/app,您可以确保 Dockerfile 中的所有后续命令(如COPY和RUN)都在此目录中执行。这也有助于组织您的 Docker 镜像,因为所有与应用程序相关的文件都包含在一个特定目录中。将 requirements 文件复制到镜像中。
COPY requirements.txt /appCOPY命令将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 的小型英语语言模型。虽然此应用程序不需要它,但为了与可能使用此 Dockerfile 的其他 NLP 应用程序兼容而包含它。将应用程序代码复制到镜像中。
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 守护进程以启用构建。它包括指定目录中的所有文件和子目录。
有关更多详细信息,请参阅 docker build CLI 参考。
Docker 在构建镜像时会向您的控制台输出多条日志。您会看到它下载并安装依赖项。根据您的网络连接情况,这可能需要几分钟时间。Docker 确实有缓存功能,因此后续构建可能会更快。完成后,控制台将返回到提示符。
将镜像作为容器运行。
在终端中,运行以下命令。
$ 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 风格的行尾](/desktop/troubleshoot-and-support/troubleshoot/topics/#Unexpected-syntax-errors-use-Unix-style-line endings-for-files-in-containers)。容器启动后,您将在控制台中看到以下内容。
Enter the text for classification (type 'exit' to end):测试应用程序。
输入一些文本以进行文本分类。
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 运行该应用程序。
相关信息
后续步骤
探索更多自然语言处理指南。