構建命名實體識別應用程式

概述

本指南將引導您構建和執行命名實體識別 (NER) 應用程式。您將使用 Python 和 spaCy 構建應用程式,然後使用 Docker 設定環境並執行應用程式。

該應用程式處理輸入文字以識別和列印命名實體,例如人、組織或地點。

先決條件

  • 您已安裝最新版本的 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/02_name_entity_recognition.py 檔案中。在以下步驟中,在文字或程式碼編輯器中開啟 02_name_entity_recognition.py 以探索其內容。

  1. 匯入所需的庫。

    import spacy

    這行程式碼匯入 spaCy 庫。spaCy 是 Python 中一個流行的庫,用於自然語言處理 (NLP)。

  2. 載入語言模型。

    nlp = spacy.load("en_core_web_sm")

    這裡,spacy.load 函式載入語言模型。en_core_web_sm 模型是一個小型英語語言模型。您可以使用此模型完成各種 NLP 任務,包括分詞、詞性標註和命名實體識別。

  3. 指定主執行塊。

    if __name__ == "__main__":

    此 Python 慣例確保以下程式碼塊僅在該指令碼是主程式時執行。它提供了靈活性,使指令碼既可以作為獨立程式執行,也可以作為匯入的模組執行。

  4. 建立一個用於連續輸入的無限迴圈。

       while True:

    此 while 迴圈會無限期地執行,直到它被顯式地中斷。它允許使用者不斷地輸入要進行實體識別的文字,直到他們決定退出。

  5. 獲取使用者輸入。

    input_text = input("Enter the text for entity recognition (type 'exit' to end): ")

    這行程式碼提示使用者輸入文字。程式將對該文字執行實體識別。

  6. 定義退出條件。

    if input_text.lower() == 'exit':
       print("Exiting...")
       break

    如果使用者輸入內容,程式會將輸入轉換為小寫並將其與 exit 進行比較。如果匹配,程式會列印 Exiting... 並退出 while 迴圈,有效地結束程式。

  7. 執行命名實體識別。

    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)。
  8. 建立 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 參考

  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 的小型英語語言模型。

  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 02_name_entity_recognition.py
    

    以下是命令的分解

    • docker run:這是用於從 Docker 映象執行新容器的主要命令。
    • -it:這是兩個選項的組合
      • -i--interactive:即使沒有附加,這也將保持標準輸入 (STDIN) 開啟。它使容器能夠在前臺執行並保持互動性。
      • -t--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 樣式的行尾

    容器啟動後,您將在控制檯中看到以下內容。

    Enter the text for entity recognition (type 'exit' to end):
    
  3. 測試應用程式。

    輸入一些資訊以獲取命名實體識別。

    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 設定環境並執行應用程式。

相關資訊

下一步

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