構建文字識別應用程式

概述

在本指南中,您將學習如何建立和執行文字識別應用程式。您將使用 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:一個流行的用於自然語言處理 (NLP) 的 Python 庫。
    • 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
    
    ...

    文字分類應用程式需要 nltkscikit-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 中所有後續命令(如 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 的小型英語語言模型。雖然對於此應用程式不需要,但它被包含進來,以與可能使用此 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: 這將分配一個偽終端,基本上模擬一個終端,例如命令提示符或 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 設定環境並執行應用程式。

相關資訊

下一步

探索更多 自然語言處理指南