建置一個文字識別應用程式

概覽

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

    此區塊是一個針對某些環境的變通方法,在這些環境中,由於 SSL 憑證驗證問題,透過 NLTK 下載資料可能會失敗。它告訴 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 是一個文字文件,其中包含您在命令列上執行以組裝映像檔的所有指令。映像檔 (image) 是一個唯讀範本,其中包含建立 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. 將需求檔案複製到映像檔中。

    COPY requirements.txt /app

    COPY 指令將 requirements.txt 檔案從您的本機機器傳輸到 Docker 映像檔中。此檔案列出了應用程式所需的所有 Python 相依套件。將其複製到容器中,讓下一個指令 (RUN pip install) 可以在映像檔環境內安裝這些相依套件。

  4. 在映像檔中安裝 Python 相依套件。

    RUN pip install --no-cache-dir -r requirements.txt

    此行使用 Python 的套件安裝程式 pip 來安裝 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. 設定進入點 (Entry point)。

    ENTRYPOINT ["/app/entrypoint.sh"]

    ENTRYPOINT 指令將容器配置為執行 entrypoint.sh 作為其預設可執行檔。這意味著當容器啟動時,它會自動執行該腳本。

    您可以透過在程式碼或文字編輯器中開啟 entrypoint.sh 腳本來探索它。由於範例包含多個應用程式,該腳本讓您可以指定容器啟動時要執行哪個應用程式。

執行應用程式

若要使用 Docker 執行應用程式

  1. 建置映像檔。

    在終端機中,於 Dockerfile 所在的目錄內執行下列指令。

    $ docker build -t basic-nlp .
    

    以下是該指令的詳細解析

    • docker build:這是用於從 Dockerfile 和內容 (context) 建置 Docker 映像檔的主要指令。內容通常是指定位置的一組檔案,通常是包含 Dockerfile 的目錄。
    • -t basic-nlp:這是用於標記映像檔的選項。-t 旗標代表標籤 (tag)。它會為映像檔指定名稱,在此例中為 basic-nlp。標籤是稍後參考映像檔的方便方式,特別是在將它們推送到登錄檔或執行容器時。
    • .:這是指令的最後一部分,指定建置內容。句點 (.) 表示目前目錄。Docker 將在此目錄中尋找 Dockerfile。建置內容(在此例中為目前目錄)會發送到 Docker 常駐程式 (daemon) 以進行建置。它包含指定目錄中的所有檔案和子目錄。

    如需更多詳細資料,請參閱 docker build CLI 參考

    Docker 在建置映像檔時會向您的主控台輸出多則日誌。您會看到它下載並安裝相依套件。根據您的網路連線狀況,這可能需要幾分鐘的時間。Docker 確實有快取功能,因此後續的建置速度可能會更快。完成後,主控台將會回到提示字元。

  2. 將映像檔作為容器執行。

    在終端機中,執行下列指令。

    $ 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):
    
  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 執行該應用程式。

相關資訊

下一步

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

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