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