Manning大神牽頭,斯坦福開源Python版NLP庫Stanza:涵蓋66種語言
對于斯坦福 NLP 庫,我們一定不會陌生,但是這一庫主要基于 Java。近日,Christopher Manning 所在的斯坦福 NLP 組開源了 Python 版的工具包——Stanza,讓 Python 生態系統又增添了一員 NLP 大將。
我們都知道斯坦福 NLP 組的開源工具——這是一個包含了各種 NLP 工具的代碼庫。近日,他們公開了 Python 版本的工具,名為 Stanza。該庫有 60 多種語言的模型,可進行命名實體識別等 NLP 任務。一經開源,便引起了社區的熱議。李飛飛就在推特上點贊了這個項目。
目前,該項目可直接從 pip 進行安裝。
項目地址:https://github.com/stanfordnlp/stanza
現有模型和支持的 NLP 任務
Stanza 包含了 60 多種語言模型,在 Universal Dependencies v2.5 數據集上進行了預訓練。這些模型包括簡體、繁體、古文中文,英語、法語、西班牙語、德語、日語、韓語、阿拉伯語等,甚至還有北薩米語等不太常見的語言。
除了語言模型外,Stanza 還支持了數十種語言的敏敏實體識別模型。完整列表如下:
據 Stanza 的論文介紹,Stanza 涵蓋了多個自然語言處理任務,如分詞、詞性標注、依存句法分析、命名實體識別等。此外,它還提供了 Pyhton 界面,用來和我們熟悉的 Stanford CoreNLP 庫進行交互,從而擴展了已有的功能。
另外值得注意的是,Stanza 是完全基于神經網絡 pipeline 的。研究者在 112 個數據集上進行了預訓練,但使用的是同一個模型架構。他們發現,同樣一個神經網絡架構可以泛化得很好。網絡在所有語言上的性能都很好。整個神經網絡 pipeline 都是通過 PyTorch 實現的。
運行 Stanza
神經網絡 pipeline 入門
要運行首個 Stanza pipeline,只需要在 python 解釋器 z 中進行操作:
- >>> import stanza
- >>> stanza.download('en') # This downloads the English models for the neural pipeline# IMPORTANT: The above line prompts you before downloading, which doesn't work well in a Jupyter notebook.# To avoid a prompt when using notebooks, instead use: >>> stanza.download('en', force=True)
- >>> nlp = stanza.Pipeline() # This sets up a default neural pipeline in English
- >>> doc = nlp("Barack Obama was born in Hawaii. He was elected president in 2008.")
- >>> doc.sentences[0].print_dependencies()
而最后一條指令將輸出當時輸入字符串中第一個句子中的詞(或是 Stanza 中表示的 Document),以及在該句的 Universal Dependencies parse(其「head」部分)中控制該詞的索引,以及詞之前的依賴關系。輸出如下:
- ('Barack', '4', 'nsubj:pass')
- ('Obama', '1', 'flat')
- ('was', '4', 'aux:pass')
- ('born', '0', 'root')
- ('in', '6', 'case')
- ('Hawaii', '4', 'obl')
- ('.', '4', 'punct')
入門指南里會有更多詳細信息。
訪問 Java Stanford Core NLP 軟件
除了神經 Pipeline,該軟件包還包括一個官方包,用于使用 Python 代碼訪問 Java Stanford CoreNLP 軟件。
初始設置:
- 下載 Stanford CoreNLP 以及想要使用的語言模型;
- 將模型放入分配的文件夾中;
- 通過設置 CORENLP_HOME 環境變量(如在*nix 中):export CORENLP_HOME=/path/to/stanford-corenlp-full-2018-10-05 告訴 Python 代碼 Stanford CoreNLP 所在的位置。
文檔中會有全面的示例,展示如何通過 Stanza 使用 CoreNLP,并從中獲取注釋。
訓練 Neural Pipeline 模型
當前為所用的 Universal Dependencies 庫 V2.5 提供模型,并為幾種廣泛使用的語言提供 NER 模型。
批量處理最大化 Pipeline 速度
為了最大程度地提供速度方面的性能,必須針對成批的文檔運行 Pipeline。每一次單在一個句子上運行一個 for 循環將 fei'c 非常慢,目前解決方法是將文檔連在一起,每個文檔見用空行(及兩個換行符nn)進行分割。分詞器將在句子中斷時去識別空白行。
訓練自己的 neural pipelines
該庫中所有神經模塊都可以使用自己的數據進行訓練。如 Tokenizer、multi-word token(MWT)擴展器、POS/特征標記器等。目前,不支持通過 pipeline 進行模型訓練,因此需要克隆 git 存儲庫并從源代碼中運行訓練。
以下為訓練神經 pipeline 的示例,可以看到項目中提供了各種 bash 腳本來簡化 scripts 目錄中的訓練過程。訓練模型運行以下指令:
- bash scripts/run_${module}.sh ${corpus} ${other_args}
其中 ${module} 是 tokenize, mwt, pos, lemma,depparse 之一,是主體的全名; ${corpus} 是訓練腳本所允許的其他參數。
例如,可以使用以下指令在 UD_English-EWT 語料庫上訓練時批量處理大小為 32,而終止率為 0.33:
- bash scripts/run_tokenize.sh UD_English-EWT --batch_size 32 --dropout 0.33
注意對于 dependency parser, 還需要在訓練/開發數據中為使用的 POS 標簽類型指定 gold|predicted:
- bash scripts/run_depparse.sh UD_English-EWT gold
如果使用了 predicted,訓練后的標記器模型會首先在訓練/開發數據上運行以便生成預測的標記。
默認情況下,模型文件將在訓練期間保存到 save_models 目錄(也可以使用 save_dir 參數進行更改)。
架構和與現有庫的對比
Stanza 的論文提供了整個代碼庫的架構。可以看到,它以原始文本為輸入,能夠直接輸出結構化的結果。
tanza 的神經網絡部分架構。除了神經網絡 pipeline 以外,Stanza 也有一個 Python 客戶端界面,和 Java 版的 Stanford CoreNLP 進行交互。
于此同時,論文還將 Stanza 和現有的 NLP 工具,如 spaCy 等進行了對比??梢钥吹剑琒tanza 是目前涵蓋語言數量最多,達到 SOTA 且完全基于神經網絡框架的庫。
和現有 NLP 庫的對比。
最后,研究者還將 Stanza 上 NLP 任務的性能和現有的基線進行對比,發現 Stanza 大部分情況下都超過了 SOTA。
和已有基線性能的對比??梢钥吹?,Stanza 在多個語言多個任務中都實現了 SOTA。