Pythonに実装された11の言語のモデルを備えた高精度のパーサー。 ACL 2018からの自己attentiveエンコーダーとの選挙区の解析に基づいており、多言語選挙区で自己触たちと事前トレーニングを伴う追加の変更が記述されています。
新しい2021年2月:バークレーニューラルパーサーのバージョン0.2.0は現在、すべての言語の高品質の事前訓練モデルを備えています。推論は、Tensorflowの代わりにPytorchを使用するようになりました(トレーニングは常にPytorchのみです)。 Python 2.7および3.5のドロップサポート。事前訓練を受けたモデルの選択に基づいて、トレーニングと独自のパーサーの使用に関する最新のサポートが含まれています。
主に独自の解析モデルのトレーニングに興味がある場合は、このREADMEのトレーニングセクションにスキップしてください。
パーサーをインストールするには、コマンドを実行します。
$ pip install benepar注:Benepar 0.2.0は、以前のバージョンよりも大きなアップグレードであり、まったく新しい品質のパーサーモデルが付属しています。アップグレードする準備ができていない場合は、BeneParバージョンを以前のリリース(0.1.3)にピン留めすることができます。
Python 3.6(または新しい)およびPytorch 1.6(または新しい)が必要です。 PytorchのGPU対応バージョンとCPUのみのバージョンを選択する方法については、Pytorch Webサイトを参照してください。 GPUがPytorchで利用可能である場合、Beneparは自動的に使用します。
Beneparを使用する推奨される方法は、Spacyとの統合です。スペイシーを使用している場合は、言語にスペイシーモデルをインストールする必要があります。英語の場合、インストールコマンドは次のとおりです。
$ python -m spacy download en_core_web_mdスペイシーモデルは、トークン化と文のセグメンテーションにのみ使用されます。解析を超えた言語固有の分析が不要な場合は、言語固有のモデルをめぐることも、代わりにトークン化とセグメンテーションのみを実行する多言語モデルを使用することもできます。 Spacy 3.0に新たに追加されたそのようなモデルの1つは、英語、ドイツ語、韓国語、ポーランド語、スウェーデン語で機能するはずです(ただし、中国語のセグメンテーションをサポートしていないように見えるため、中国語ではありません)。
解析モデルは、コマンドを使用して個別にダウンロードする必要があります。
>> > import benepar
>> > benepar . download ( 'benepar_en3' )モデルの完全なリストについては、以下の使用可能なモデルセクションを参照してください。
Beneparを使用する推奨される方法は、スペイシーとの統合を通じてです。
>> > import benepar , spacy
>> > nlp = spacy . load ( 'en_core_web_md' )
>> > if spacy . __version__ . startswith ( '2' ):
nlp . add_pipe ( benepar . BeneparComponent ( "benepar_en3" ))
else :
nlp . add_pipe ( "benepar" , config = { "model" : "benepar_en3" })
>> > doc = nlp ( "The time for action is now. It's never too late to do something." )
>> > sent = list ( doc . sents )[ 0 ]
>> > print ( sent . _ . parse_string )
( S ( NP ( NP ( DT The ) ( NN time )) ( PP ( IN for ) ( NP ( NN action )))) ( VP ( VBZ is ) ( ADVP ( RB now ))) (. .))
>> > sent . _ . labels
( 'S' ,)
>> > list ( sent . _ . children )[ 0 ]
The time for action Spacyは公式選挙区の解析APIを提供しないため、すべての方法は拡張名空間Span._およびToken._からアクセス可能です。
次の拡張プロパティが利用可能です。
Span._.labels :指定されたスパンのラベルのタプル。解析ツリーに単位チェーンがある場合、スパンには複数のラベルがある場合があります。Span._.parse_string :特定のスパンの解析ツリーの文字列表現。Span._.constituents :解析ツリーの予約注文トラバーサルでのサブコンシテーションのSpanオブジェクト上のイテレーター。Span._.parent :親は解析ツリーのSpan 。Span Span._.childrenToken._.labels 、 Token._.parse_string 、 Token._.parentこれらの方法は、解析ツリーの構成要素ではないスパンで呼び出されると、例外を提起します。このようなエラーは、文レベル( doc.sentsを反復する)または個々のTokenオブジェクトを使用することにより、パーセツリーを通過することで回避できます。
NLTKインターフェイスもあります。NLTKインターフェイスは、トークン化されたデータセットとツリーバンクで使用するため、またはパーサーをすでに(最小)トークン化と文の分割を実行しているNLPパイプラインに統合する場合です。生のテキストから始まる解析の場合、代わりにSpacyとbenepar.BeneparComponent使用することを強くお勧めします。
NLTKでのサンプルの使用法:
>> > import benepar
>> > parser = benepar . Parser ( "benepar_en3" )
>> > input_sentence = benepar . InputSentence (
words = [ '"' , 'Fly' , 'safely' , '.' , '"' ],
space_after = [ False , True , False , False , False ],
tags = [ '``' , 'VB' , 'RB' , '.' , "''" ],
escaped_words = [ '``' , 'Fly' , 'safely' , '.' , "''" ],
)
>> > tree = parser . parse ( input_sentence )
>> > print ( tree )
( TOP ( S ( `` `` ) ( VP ( VB Fly ) ( ADVP ( RB safely ))) (. .) ( '' '' ))) benepar.InputSentenceのすべてのフィールドが必要なわけではありませんが、少なくとも1つのwordsとescaped_wordsを指定する必要があります。パーサーは、欠落しているフィールドの値を推測しようとします。
>> > input_sentence = benepar . InputSentence (
words = [ '"' , 'Fly' , 'safely' , '.' , '"' ],
)
>> > parser . parse ( input_sentence ) parse_sentsを使用して、複数の文を解析します。
>> > input_sentence1 = benepar . InputSentence (
words = [ 'The' , 'time' , 'for' , 'action' , 'is' , 'now' , '.' ],
)
>> > input_sentence2 = benepar . InputSentence (
words = [ 'It' , "'s" , 'never' , 'too' , 'late' , 'to' , 'do' , 'something' , '.' ],
)
>> > parser . parse_sents ([ input_sentence1 , input_sentence2 ])一部のパーサーモデルでは、デバッグ/インタラクティブな使用のためのUnicodeテキスト入力も許可されていますが、解析の精度が重要なアプリケーションでは、生のテキスト文字列を渡すことは強く落胆します。
>> > parser . parse ( '"Fly safely."' ) # For debugging/interactive use only.生のテキストから解析するときは、代わりにSpacyとbenepar.BeneparComponentを使用することをお勧めします。その理由は、パーサーモデルにトークナー剤や文のスプリッターで出荷されないため、一部のモデルには、スピーチの一部のタガーも含まれていない可能性があります。これらのパイプラインコンポーネントを埋めるためにツールキットを使用する必要があり、スペイシーはこれらすべての領域でNLTKを上回ります(場合によっては大きなマージンで)。
次の訓練されたパーサーモデルが利用可能です。 Spacy統合を使用するには、適切な言語のSPACYモデルをインストールする必要もあります。
| モデル | 言語 | 情報 |
|---|---|---|
benepar_en3 | 英語 | 改訂されたWSJテストセットの95.40 F1。トレーニングデータは、Spacyのような図書館の最新のトークン化慣行によく一致する方が、英語のWeb TreebankやOntonotesと同じガイドラインに基づいて、改訂されたトークン化と構文注釈を使用します。 T5-Smallに基づいています。 |
benepar_en3_large | 英語 | 改訂されたWSJテストセットの96.29 F1。トレーニングデータは、Spacyのような図書館の最新のトークン化慣行によく一致する方が、英語のWeb TreebankやOntonotesと同じガイドラインに基づいて、改訂されたトークン化と構文注釈を使用します。 T5-Largeに基づいています。 |
benepar_zh2 | 中国語 | CTB 5.1テストセットの92.56 F1。 Spacyでの使用により、生のテキストからの解析がサポートされますが、NLTK APIは以前にトークンした文章の解析のみをサポートしています。中国のエレクトラ-180g-largeに基づいています。 |
benepar_ar2 | アラビア語 | SPMRL2013/2014テストセットの90.52 F1。 NLTK APIを使用して、以前にトークンした文章を解析するためのサポートのみをサポートします。生のテキストとスペイシーの統合からの解析はサポートされていません。 XLM-Rに基づいています。 |
benepar_de2 | ドイツ語 | SPMRL2013/2014テストセットの92.10 F1。 XLM-Rに基づいています。 |
benepar_eu2 | バスク | SPMRL2013/2014テストセットの93.36 F1。 Spacyでの使用には、最初にバスクのサポートを実装する必要があります。 XLM-Rに基づいています。 |
benepar_fr2 | フランス語 | SPMRL2013/2014テストセットの88.43 F1。 XLM-Rに基づいています。 |
benepar_he2 | ヘブライ語 | 93.98 F1 on SPMRL2013/2014テストセット。 NLTK APIを使用して、以前にトークンした文章を解析するためのサポートのみをサポートします。生のテキストとスペイシーの統合からの解析はサポートされていません。 XLM-Rに基づいています。 |
benepar_hu2 | ハンガリー | SPMRL2013/2014テストセットの96.19 F1。スペイシーでの使用には、スペイシーのハンガリー人モデルが必要です。 NLTK APIは、以前にトークンした文章のみをサポートしています。 XLM-Rに基づいています。 |
benepar_ko2 | 韓国語 | SPMRL2013/2014テストセットの91.72 F1。 Spacyの多言語文のセグメンテーションモデルで使用できます(Spacy v3.0が必要です)。 NLTK APIは、以前にトークンした文章のみをサポートしています。 XLM-Rに基づいています。 |
benepar_pl2 | 研磨 | SPMRL2013/2014テストセットの97.15 F1。 XLM-Rに基づいています。 |
benepar_sv2 | スウェーデン語 | 92.21 SPMRL2013/2014テストセットのF1。 Spacyの多言語文のセグメンテーションモデルで使用できます(Spacy v3.0が必要です)。 XLM-Rに基づいています。 |
benepar_en3_wsj | 英語 | 代わりにbenepar_en3またはbenepar_en3_largeの使用を検討してください。 95.55 F1標準的なWSJテストセットでは、出版物を解析する数十年の英語選挙区に使用されています。 Bert-Large-Uncasedに基づいています。 benepar_en3 / benepar_en3_largeトレーニングに使用される改訂された注釈ガイドラインは、Webテキストの言語使用をよりよく処理するため、下流の使用に適しており、Spacyのような依存解析やライブラリの最新の実践とより一致していると考えています。それにもかかわらず、同じデータセットのさまざまなモデルをベンチマークするなど、改訂されたツリーバンキングコンベンションを使用することが適切ではない場合に、 benepar_en3_wsjモデルを提供します。 |
トレーニングには、GitHubからこのリポジトリをクローニングする必要があります。 src/beneparのモデルコードはPypiのbeneparパッケージに配布されていますが、 src/の直接のトレーニングおよび評価スクリプトはそうではありません。
beneparパッケージで必要なすべての依存関係には、NLTK 3.2、Torch-struct 0.4、Transformers 4.3.0、または互換性があります。EVALB/ディレクトリ内をmakeして、 evalb実行可能ファイルをコンパイルします。これは、評価のためにPythonから呼び出されます。 SPMRLデータセットでトレーニングする場合は、代わりにEVALB_SPMRL/ディレクトリ内でmakeする必要があります。コマンドpython src/main.py train ...を使用して新しいモデルをトレーニングできます。利用可能な議論のいくつかは次のとおりです。
| 口論 | 説明 | デフォルト |
|---|---|---|
--model-path-base | モデルの保存に使用するパスベース | n/a |
--evalb-dir | EvalBディレクトリへのパス | EVALB/ |
--train-path | 木のトレーニングへの道 | data/wsj/train_02-21.LDC99T42 |
--train-path-text | トレーニングデータのオプションの非破壊トークン化 | 生のテキストを推測します。 --text-processing参照してください |
--dev-path | 開発ツリーへの道 | data/wsj/dev_22.LDC99T42 |
--dev-path-text | 開発データのオプションの非破壊トークン化 | 生のテキストを推測します。 --text-processing参照してください |
--text-processing | デスクトルでトークン化されたツリーファイルから生のテキストを推測するためのヒューリスティック。 src/treebanks.pyのload_trees()を参照してください | アラビア語、中国語、ヘブライ語以外の言語のデフォルトルール |
--subbatch-max-tokens | トレーニング中に並行して処理するトークンの最大数(完全なバッチはGPUメモリに収まらない場合があります) | 2000 |
--parallelize | 事前に訓練されたモデル(T5)レイヤーを複数のGPUに分配します。 | 最大で1つのGPUを使用します |
--batch-size | トレーニングアップデートごとの例の数 | 32 |
--checks-per-epoch | エポックあたりの開発評価の数 | 4 |
--numpy-seed | numpyランダムシード | ランダム |
--use-pretrained | 事前に訓練されたエンコーダーを使用します | 事前に訓練されたエンコーダーを使用しないでください |
--pretrained-model | 使用するモデル--use-pretrainedが渡されます。 HuggingfaceモデルのハブからのパスまたはモデルIDである可能性があります | bert-base-uncased |
--predict-tags | パーサーにスピーチの一部のタグ付けコンポーネントと補助損失を追加します | タグを予測しないでください |
--use-chars-lstm | 学習したCharlstmワード表現を使用します | Charlstmを使用しないでください |
--use-encoder | 事前に訓練されたモデルまたはCharlstmの上に学習した変圧器層を使用する | 余分な変圧器層を使用しないでください |
--num-layers | 使用する変圧器層の数--use-encoderが渡されます | 8 |
--encoder-max-len | 最大文の長さ(言葉で)余分な変圧器層を許可する | 512 |
他のハイパーパラメーターでは追加の引数が利用できます。 src/main.pyのmake_hparams()参照してください。これらは、 --num-layers 2 (数値パラメーター用)、 --predict-tags (falseにデフォルトであるブールパラメーターの場合)、または--no-XXX (デフォルトのブールパラメーターの場合)などのコマンドラインで指定できます。真)。
開発評価ごとに、開発セットのFスコアが計算され、以前のベストと比較されます。現在のモデルが優れている場合、以前のモデルが削除され、現在のモデルが保存されます。新しいファイル名は、提供されたモデルパスベースと開発Fスコアから派生します。
パーサーをトレーニングする前に、最初に適切なトレーニングデータを取得する必要があります。 PTB、CTB、SMPRL 2013/2014の共有タスクデータなどの標準データセットを処理する方法についての指示を提供します。英語のWSJデータの指示に従って、次のコマンドを使用して、デフォルトのハイパーパラメーターを使用して英語のパーサーをトレーニングできます。
python src/main.py train --use-pretrained --model-path-base models/en_bert_base
優れたハイパーパラメーターの選択の例については、 EXPERIMENTS.md参照してください。
保存されたモデルは、コマンドpython src/main.py test ...次の引数を使用して、テストコーパスで評価できます。
| 口論 | 説明 | デフォルト |
|---|---|---|
--model-path | 保存されたモデルのパス | n/a |
--evalb-dir | EvalBディレクトリへのパス | EVALB/ |
--test-path | ツリーをテストするパス | data/23.auto.clean |
--test-path-text | テストデータのオプションの非破壊トークン化 | 生のテキストを推測します。 --text-processing参照してください |
--text-processing | デスクトルでトークン化されたツリーファイルから生のテキストを推測するためのヒューリスティック。 src/treebanks.pyのload_trees()を参照してください | アラビア語、中国語、ヘブライ語以外の言語のデフォルトルール |
--test-path-raw | EvalBのみに使用されるツリーをテストするための代替パス(前処理されたツリーに対する評価にはバグが含まれていないことを再確認するために使用されます) | --test-pathからの木と比較してください |
--subbatch-max-tokens | 並列で処理するトークンの最大数(GPUには、1つのバッチで完全なデータセットを処理するのに十分なメモリがありません) | 500 |
--parallelize | 事前に訓練されたモデル(T5)レイヤーを複数のGPUに分配します。 | 最大で1つのGPUを使用します |
--output-path | 予測された木を書き込むパス(stdoutに"-"を使用)。 | 予測された木を保存しないでください |
--no-predict-tags | evalBを実行するときに、金の部分的な品目タグを使用します。これは出版物の標準であり、このフラグを省略すると、誤って高いF1スコアが得られる場合があります。 | 利用可能な場合は、evalBに予測されるスピーチの一部のタグを使用します |
例として、次のコマンドを使用して訓練されたモデルを評価できます。
python src/main.py test --model-path models/en_bert_base_dev=*.pt
beneparパッケージは、 benepar_en3のようなモデル名をmodels/en_bert_base_dev_dev=95.67.ptなどのパスに置き換えることにより、保存されたチェックポイントを直接使用できます。ただし、単一ファイルのチェックポイントをリリースするには、いくつかの欠点があります。
src/export.pyを使用して、チェックポイントファイルをトレーニングされたモデルに関するすべてをカプセル化するディレクトリに変換します。例えば、
python src/export.py export
--model-path models/en_bert_base_dev=*.pt
--output-dir=models/en_bert_base
エクスポートするときは、モデルの重みをわずかに調整する--compressオプションもあり、出力ディレクトリをはるかに小さなサイズのzipアーカイブに圧縮できます。これは、公式モデルリリースに使用します。これは、サイズが2GB+のモデル重量を配布するのが面倒だからです。 --compressオプションを使用する場合は、圧縮が実際に解析精度に最小限の影響を与えることを確認するために、テストセットを指定することをお勧めします。開発データはトレーニング中のモデル選択基準にすでに使用されているため、検証のために開発データを使用することは推奨されません。
python src/export.py export
--model-path models/en_bert_base_dev=*.pt
--output-dir=models/en_bert_base
--test-path=data/wsj/test_23.LDC99T42
src/export.pyスクリプトには、エクスポートされたモデルをサポートし、フラグがわずかに異なることを除いて、 python src/main.py testにほぼ似たtestサブコマンドもあります。次のコマンドを実行して、Bert-Large-Uncasedを使用して英語のパーサーが実際に標準的なWSJテストセットで95.55 F1を達成していることを確認できます。
python src/export.py test --model-path benepar_en3_wsj --test-path data/wsj/test_23.LDC99T42
ACL 2018および2019の論文で報告された実験を再現する方法については、 EXPERIMENTS.md参照してください。
このソフトウェアを調査に使用する場合は、次のように論文を引用してください。
@inproceedings{kitaev-etal-2019-multilingual,
title = "Multilingual Constituency Parsing with Self-Attention and Pre-Training",
author = "Kitaev, Nikita and
Cao, Steven and
Klein, Dan",
booktitle = "Proceedings of the 57th Annual Meeting of the Association for Computational Linguistics",
month = jul,
year = "2019",
address = "Florence, Italy",
publisher = "Association for Computational Linguistics",
url = "https://www.aclweb.org/anthology/P19-1340",
doi = "10.18653/v1/P19-1340",
pages = "3499--3505",
}
@inproceedings{kitaev-klein-2018-constituency,
title = "Constituency Parsing with a Self-Attentive Encoder",
author = "Kitaev, Nikita and
Klein, Dan",
booktitle = "Proceedings of the 56th Annual Meeting of the Association for Computational Linguistics (Volume 1: Long Papers)",
month = jul,
year = "2018",
address = "Melbourne, Australia",
publisher = "Association for Computational Linguistics",
url = "https://www.aclweb.org/anthology/P18-1249",
doi = "10.18653/v1/P18-1249",
pages = "2676--2686",
}
このリポジトリとこのREADMEの一部のコードは、https://github.com/mitchellstern/minimal-span-parserに基づいています