構建命名實體識別應用
概述
本指南將引導您構建和執行一個命名實體識別 (NER) 應用程式。您將使用 Python 和 spaCy 構建該應用程式,然後使用 Docker 設定環境並執行該應用程式。
該應用程式處理輸入文字,以識別和列印命名實體,如人名、組織或地點。
先決條件
- 您已安裝最新版本的 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/02_name_entity_recognition.py` 檔案中。在接下來的步驟中,用文字或程式碼編輯器開啟 `02_name_entity_recognition.py` 以瀏覽其內容。
匯入所需的庫。
import spacy
這一行匯入了 `spaCy` 庫。`spaCy` 是一個在 Python 中用於自然語言處理 (NLP) 的流行庫。
載入語言模型。
nlp = spacy.load("en_core_web_sm")
這裡,`spacy.load` 函式載入一個語言模型。`en_core_web_sm` 模型是一個小型的英語語言模型。您可以將此模型用於各種 NLP 任務,包括分詞、詞性標註和命名實體識別。
指定主執行塊。
if __name__ == "__main__":
這個 Python 慣用法確保了以下程式碼塊僅在該指令碼是主程式時執行。它提供了靈活性,允許該指令碼既可以作為獨立程式執行,也可以作為匯入的模組使用。
建立一個無限迴圈以進行連續輸入。
while True:
這個 while 迴圈會無限執行,直到被明確中斷。它允許使用者不斷輸入文字進行實體識別,直到他們決定退出。
獲取使用者輸入。
input_text = input("Enter the text for entity recognition (type 'exit' to end): ")
這一行提示使用者輸入文字。然後程式將對這段文字進行實體識別。
定義退出條件。
if input_text.lower() == 'exit': print("Exiting...") break
如果使用者輸入了某些內容,程式會將輸入轉換為小寫並與 `exit` 進行比較。如果匹配,程式會列印 **正在退出...** 並跳出 while 迴圈,從而有效地結束程式。
執行命名實體識別。
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"實體: {ent.text}, 型別: {ent.label_}")`:對於每個實體,它會打印出實體文字及其型別(如 PERSON、ORG 或 GPE)。
建立 `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 參考。
指定基礎映象。
FROM python:3.8-slim
此命令為構建奠定了基礎。`python:3.8-slim` 是 Python 3.8 映象的輕量級版本,針對大小和速度進行了最佳化。使用這個 slim 映象可以減小 Docker 映象的總體積,從而實現更快的下載和更小的安全漏洞攻擊面。這對於可能不需要完整標準 Python 映象的基於 Python 的應用程式特別有用。
設定工作目錄。
WORKDIR /app
`WORKDIR` 設定了 Docker 映象內當前的工作目錄。透過將其設定為 `/app`,您可以確保 Dockerfile 中的所有後續命令(如 `COPY` 和 `RUN`)都在此目錄中執行。這也有助於組織您的 Docker 映象,因為所有與應用程式相關的檔案都包含在一個特定目錄中。
將 requirements 檔案複製到映象中。
COPY requirements.txt /app
`COPY` 命令將 `requirements.txt` 檔案從您的本地機器傳輸到 Docker 映象中。此檔案列出了應用程式所需的所有 Python 依賴項。將其複製到容器中,可以讓下一個命令 (`RUN pip install`) 在映象環境中安裝這些依賴項。
在映象中安裝 Python 依賴項。
RUN pip install --no-cache-dir -r requirements.txt
這一行使用 `pip`(Python 的包安裝程式)來安裝 `requirements.txt` 中列出的包。`--no-cache-dir` 選項停用了快取,透過不儲存不必要的快取資料來減小 Docker 映象的大小。
執行其他命令。
RUN python -m spacy download en_core_web_sm
此步驟專門針對需要 spaCy 庫的 NLP 應用程式。它會下載 `en_core_web_sm` 模型,這是一個用於 spaCy 的小型英語語言模型。
將應用程式程式碼複製到映象中。
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 02_name_entity_recognition.py
以下是對該命令的分解:
docker run
: 這是用於從 Docker 映象執行新容器的主要命令。-it
: 這是兩個選項的組合:-i
或--interactive
: 即使未附加,也保持標準輸入 (STDIN) 開啟。它使容器能夠在前臺執行並保持互動。-t
或--tty
: 這會分配一個偽 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 風格的行尾](/desktop/troubleshoot-and-support/troubleshoot/topics/#Unexpected-syntax-errors-use-Unix-style-line endings-for-files-in-containers)。
容器啟動後,您將在控制檯中看到以下內容。
Enter the text for entity recognition (type 'exit' to end):
測試應用程式。
輸入一些資訊以獲得命名實體識別。
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 設定環境並執行該應用程式。
相關資訊
後續步驟
探索更多自然語言處理指南。