建置文字辨識應用程式

概觀

在本指南中,您將學習如何建立和執行文字辨識應用程式。您將使用 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

    此區塊是用於某些環境的因應措施,在這些環境中,透過 NLTK 下載資料可能會因 SSL 憑證驗證問題而失敗。它告訴 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
    
    ...

    文字分類應用程式需要 `nltk` 和 `scikit-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 中的所有後續命令(例如 `COPY` 和 `RUN`)都在此目錄中執行。這也有助於組織您的 Docker 映像,因為所有與應用程式相關的檔案都包含在特定目錄中。

  3. 將需求檔案複製到映像中。

    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:这会分配一个伪终端 (pseudo-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 运行应用程序。

相关信息

後續步驟

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