本文記錄如何在使用uv
管理python項目dependencies時,把spaCy
的模型也納入其中.
spaCy
一、spaCy簡介
spaCy是一個開源的自然語言處理(NLP)庫,它主要用于處理文本數據。它支持多種語言,包括英語、中文等。它是由Explosion AI公司開發的,以簡單易用和高性能著稱。
二、主要功能
- 分詞(Tokenization)
- spaCy可以將文本分割成單詞、標點符號等基本單元,這是文本處理的基礎步驟。例如,對于句子“I love natural language processing.”,它會將其分割為[“I”, “love”, “natural”, “language”, “processing”, “.”]等token。
- 詞性標注(Part - of - Speech Tagging)
- 它能夠識別文本中每個單詞的詞性。比如在句子“He quickly ran to the store.”中,“He”是代詞(PRON),“quickly”是副詞(ADV),“ran”是動詞(VERB),“to”是介詞(ADP),“the”是冠詞(DET),“store”是名詞(NOUN)。
- 依存句法分析(Dependency Parsing)
- spaCy可以分析句子的結構,確定單詞之間的依存關系。例如在句子“The cat sat on the mat.”中,它能確定“cat”是主語(nsubj),“sat”是謂語(ROOT),“on”是介詞(prep),“mat”是賓語(pobj)等依存關系,這對于理解句子的語義結構很有幫助。
- 命名實體識別(Named Entity Recognition,NER)
- 它能夠識別文本中的命名實體,如人名、地名、組織名、日期等。比如在文本“Steve Jobs was the CEO of Apple Inc. in 2000.”中,它能夠識別出“Steve Jobs”是人名,“Apple Inc.”是組織名,“2000”是日期。
- 文本分類(Text Classification)
- spaCy支持對文本進行分類任務,例如情感分析(判斷文本是正面情感、負面情感還是中性情感)或者主題分類(判斷文本屬于哪個主題類別,如體育、科技等)。
- 實體鏈接(Entity Linking)
- 它可以將文本中識別的實體與知識庫中的實體進行鏈接。例如,將文本中提到的“埃菲爾鐵塔”鏈接到維基百科中對應的“埃菲爾鐵塔”條目,這樣可以更好地理解實體的詳細信息。
問題描述
sapCy在使用的時候,需要下載目標語言的模型,如果以英文為例就是en_core_web_sm
, 中文可以是zh_core_web_lg
,可以用如下腳本下載
# download en_core_web_sm
python -m spacy download en_core_web_sm# download zh_core_web_lg
python -m spacy download zh_core_web_lg
問題出現在用uv
進行依賴管理的場景下,因為這些下載的模型沒有被加入到依賴列表中,每次重新進行uv sync
操作后,就會丟失這些依賴. 雖然這些模型實際上也是一個依賴包,但是不在官方的registry中,不能直接y用uv add
這種方式進行安裝.
解決方案
命令行參數
因為是uv sync
時造成了模型刪除,那么就是uv嚴格對照依賴列表中的各個依賴項進行處理,把不在其中的都移除了. 根據這個思路,可以用明亮行參數來改變這個行為
uv sync --inexact
這樣操作即可. 但這個方案有缺點,因為不會自動下載model,在新的環境中執行spaCy相關任務會報錯.
手動聲明依賴
這個方案是筆者最終采納的方案,把模型的下載路徑手動寫到依賴中,這樣不僅可以不被刪除,而且在新環境中還會自動下載
dependencies = ["en-core-web-sm @ https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-3.8.0/en_core_web_sm-3.8.0-py3-none-any.whl","zh-core-web-lg @ https://github.com/explosion/spacy-models/releases/download/zh_core_web_lg-3.8.0/zh_core_web_lg-3.8.0-py3-none-any.whl"
]
注意修改為自己所需的版本即可.