파이썬에서 구현 된 11 개 언어의 모델을 갖춘 고 진수 파서. ACL 2018의 자체 항목 인코더로 구성된 선거구 구문 분석을 기반으로, 자체 소지 및 사전 훈련으로 다국어 선거구 구문 분석에 추가적인 변경 사항이 설명되어 있습니다.
2021 년 2 월 : 버클리 신경 파서의 버전 0.2.0은 이제 모든 언어에 대한 고품질의 미리 훈련 된 모델로 출시되었습니다. 추론은 이제 Tensorflow 대신 pytorch를 사용합니다 (훈련은 항상 pytorch only). 파이썬 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 웹 사이트를 참조하십시오. Benepar는 Pytorch에서 사용할 수있는 경우 GPU를 자동으로 사용합니다.
Benepar를 사용하는 권장 방법은 Spacy와의 통합을 통한 것입니다. Spacy를 사용하는 경우 언어에 대한 Spacy 모델을 설치해야합니다. 영어의 경우 설치 명령은 다음과 같습니다.
$ python -m spacy download en_core_web_md스파크 모델은 토큰 화 및 문장 분할에만 사용됩니다. 구문 분석 이외의 언어 별 분석이 필요하지 않은 경우 언어 별 모델을 포기하고 대신 토큰 화 및 세분화 만 수행하는 다중 언어 모델을 사용할 수 있습니다. Spacy 3.0에 새로 추가 된 이러한 모델 중 하나는 영어, 독일어, 한국, 폴란드어 및 스웨덴어에서 작동해야합니다 (중국어 단어 세분화를 지원하지 않기 때문에 중국은 아님).
구문 분석 모델은 명령을 사용하여 별도로 다운로드해야합니다.
>> > import benepar
>> > benepar . download ( 'benepar_en3' )전체 모델 목록은 아래에 사용 가능한 모델 섹션을 참조하십시오.
Benepar를 사용하는 권장 방법은 Spacy와의 통합입니다.
>> > 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._.children : 구문 분석 트리의 아동에 대한 Span .Token._.labels , Token._.parse_string , Token._.parent : 이들은 토큰을 포함하는 길이 1 스팬에서 해당 메소드를 호출하는 것과 동일하게 행동합니다. 이 방법은 구문 분석 트리의 구성 요소가 아닌 스팬을 요구할 때 예외가 발생합니다. 이러한 오류는 문장 수준에서 시작하여 ( doc.sents 통해 반복) 또는 개별 Token 객체와 함께 구문 분석 트리를 가로 지르면 피할 수 있습니다.
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 의 모든 필드가 필요하지는 않지만 적어도 하나의 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 ])일부 파서 모델은 또한 디버깅/대화식 사용을위한 유니 코드 텍스트 입력을 허용하지만, 원시 텍스트 문자열을 통과하는 것은 구문 분석 정확도가 중요한 응용 프로그램에 대해 강력하게 권장하지 않습니다 .
>> > parser . parse ( '"Fly safely."' ) # For debugging/interactive use only. 원시 텍스트에서 구문 분석 할 때 Spacy와 benepar.BeneparComponent 대신 사용하는 것이 좋습니다. 그 이유는 파서 모델이 토큰 화기 또는 문장 스플리터와 함께 배송되지 않기 때문에 일부 모델에는 부품 태그가 포함되지 않을 수 있습니다. 이러한 파이프 라인 구성 요소를 채우는 데 툴킷을 사용해야하며 Spacy는 이러한 모든 영역에서 NLTK를 능가합니다 (때로는 큰 마진).
다음 훈련 된 파서 모델을 사용할 수 있습니다. Spacy 통합을 사용하려면 적절한 언어에 대한 Spacy 모델을 설치해야합니다.
| 모델 | 언어 | 정보 |
|---|---|---|
benepar_en3 | 영어 | 개정 된 WSJ 테스트 세트의 95.40 F1. 교육 데이터는 English Web TreeBank 및 Ontonotes와 동일한 지침을 기반으로 수정 된 토큰 화 및 구문 주석을 사용하여 Spacy와 같은 라이브러리의 현대 토큰화 관행과 더 잘 일치합니다. T5-Small을 기반으로합니다. |
benepar_en3_large | 영어 | 개정 된 WSJ 테스트 세트의 96.29 F1. 교육 데이터는 English Web TreeBank 및 Ontonotes와 동일한 지침을 기반으로 수정 된 토큰 화 및 구문 주석을 사용하여 Spacy와 같은 라이브러리의 현대 토큰화 관행과 더 잘 일치합니다. T5-LARGE를 기반으로합니다. |
benepar_zh2 | 중국인 | CTB 5.1 테스트 세트의 92.56 F1. Spacy와 함께 사용하면 원시 텍스트에서 구문 분석을 지원하지만 NLTK API는 이전에 토큰 된 문장을 구문 분석하는 것만 지원합니다. 중국 Electra-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와 함께 사용하려면 먼저 Spacy에서 바스크 지원을 구현해야합니다. XLM-R을 기반으로합니다. |
benepar_fr2 | 프랑스 국민 | SPMRL2013/2014 테스트 세트의 88.43 F1. XLM-R을 기반으로합니다. |
benepar_he2 | 헤브라이 사람 | SPMRL2013/2014 테스트 세트의 93.98 F1. 이전에 토큰 화 된 문장을 구문 분석하기 위해 NLTK API를 사용하는 것만 지원합니다. 원시 텍스트 및 스파크 통합의 구문 분석은 지원되지 않습니다. XLM-R을 기반으로합니다. |
benepar_hu2 | 헝가리 인 | SPMRL2013/2014 테스트 세트의 96.19 F1. Spacy와 함께 사용하려면 Spacy를위한 헝가리 모델이 필요합니다. 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 | 스웨덴어 | SPMRL2013/2014 테스트 세트의 92.21 F1. Spacy의 다중 언어 문장 세분화 모델 (Spacy v3.0 필요)과 함께 사용할 수 있습니다. XLM-R을 기반으로합니다. |
benepar_en3_wsj | 영어 | 대신 benepar_en3 또는 benepar_en3_large 사용하는 것을 고려하십시오 . 수십 년의 영어 선거구 구문 분석 간행물에 사용되는 표준 WSJ 테스트 세트에 대한 95.55 F1. Bert-large-incased를 기반으로합니다. 우리는 benepar_en3 / benepar_en3_large 교육에 사용되는 수정 된 주석 지침이 웹 텍스트에서 언어 사용량을 더 잘 처리하기 때문에 다운 스트림 사용에 더 적합하며 Spacy와 같은 의존성 구문 분석 및 라이브러리의 현대적인 관행과 더 일치하기 때문입니다. 그럼에도 불구하고, 우리는 동일한 데이터 세트에서 다른 모델을 벤치마킹하는 것과 같이 수정 된 트리 뱅킹 규칙을 사용하는 것이 적절하지 않은 경우에 benepar_en3_wsj 모델을 제공합니다. |
훈련을 위해서는이 저장소를 Github에서 복제해야합니다. src/benepar 의 모델 코드는 PYPI의 benepar 패키지에 배포되지만 교육 및 평가 스크립트는 src/ 바로 아래에 있습니다.
benepar 패키지에 필요한 모든 종속성.EVALB/ Directory 내부를 make 하여 evalb 실행 파일을 컴파일하십시오. 이것은 평가를 위해 Python에서 호출됩니다. SPMRL 데이터 세트에 대한 교육이 있으면 대신 EVALB_SPMRL/ 디렉토리 내부 make 해야합니다. python src/main.py train ... 명령을 사용하여 새로운 모델을 교육 할 수 있습니다. 사용 가능한 주장 중 일부는 다음과 같습니다.
| 논쟁 | 설명 | 기본 |
|---|---|---|
--model-path-base | 저장 모델에 사용할 경로 기반 | N/A |
--evalb-dir | Evalb Directory의 경로 | 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 | 다수의 GPU에 미리 훈련 된 모델 (예 : T5) 층을 배포합니다. | 최대 하나의 GPU를 사용하십시오 |
--batch-size | 교육 업데이트 당 예수 | 32 |
--checks-per-epoch | 에포크 당 개발 평가 수 | 4 |
--numpy-seed | Numpy Random Seed | 무작위의 |
--use-pretrained | 미리 훈련 된 인코더를 사용하십시오 | 미리 훈련 된 인코더를 사용하지 마십시오 |
--pretrained-model | --use-pretrained 경우 사용하는 모델이 전달됩니다. Huggingface 모델 허브의 경로 또는 모델 ID 일 수 있습니다. | bert-base-uncased |
--predict-tags | 파서에 부품 태그 태깅 구성 요소 및 보조 손실을 추가합니다. | 태그를 예측하지 마십시오 |
--use-chars-lstm | 학습 된 charlstm 단어 표현을 사용하십시오 | Charlstm을 사용하지 마십시오 |
--use-encoder | 미리 훈련 된 모델 또는 charlstm 위에 학습 된 변압기 층을 사용하십시오. | 여분의 변압기 층을 사용하지 마십시오 |
--num-layers | if --use-encoder 전달되는 경우 사용할 변압기 층 수 | 8 |
--encoder-max-len | 최대 문장 길이 (단어) 추가 변압기 층이 허용됩니다. | 512 |
다른 하이퍼 파라미터에 대한 추가 주장은 이용 가능합니다. src/main.py 의 make_hparams() 참조하십시오. --num-layers 2 (숫자 매개 변수의 경우), --predict-tags (기본적으로 거짓으로 기본적으로) 또는 --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 Directory의 경로 | 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는 한 배치에서 전체 데이터 세트를 처리하기에 충분한 메모리가 없습니다) | 500 |
--parallelize | 다수의 GPU에 미리 훈련 된 모델 (예 : T5) 층을 배포합니다. | 최대 하나의 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를 사용하여 영어 파서가 실제로 Canonical 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를 기반으로합니다.