Диаграмма с высокой точностью с моделями для 11 языков, внедренных в Python. Основываясь на разборе избирательных округов с самостоятельным энкодером из ACL 2018, с дополнительными изменениями, описанными в многоязычных избирательных округах с самопринятым и предварительным обучением.
Новый февраль 2021 года: версия 0.2.0 Нейронного анализатора Беркли в настоящее время вышла, с более качественными предварительно обученными моделями для всех языков. В выводе теперь используется Pytorch вместо Tensorflow (тренировка всегда была только 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-поддержку и версиями Pytorch только для CPU; Benepar автоматически будет использовать GPU, если он будет доступен для Pytorch.
Рекомендуемый способ использования Benepar - это интеграция со Spacy. При использовании Spacy вам следует установить модель Spacy для вашего языка. Для английского команда установки:
$ python -m spacy download en_core_web_mdМодель Spacy используется только для сегментации токенизации и предложений. Если анализ, специфичный для языка, не требуется, вы также можете отказаться от модели для конкретной языка и вместо этого использовать многоязычную модель, которая только выполняет токенизацию и сегментацию. Одна такая модель, недавно добавленная в 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 : строковое представление дерева Parse для данного промежутка.Span._.constituents : итератор над объектами Span для подзаконников в предварительном зарегистрировании дерева разбора.Span._.parent : родительский Span в дереве Parse.Span._.children : итератор над детским Span в дереве Parse.Token._.parent Token._.labels Token._.parse_string Эти методы поднимут исключение при вызове пролета, который не является составляющей в дереве анализа. Таких ошибок можно избежать, пройдя дерево анализа, начиная с уровня предложения (итерация над 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 ])Некоторые модели анализаторов также позволяют ввод текста Unicode для отладки/интерактивного использования, но передача необработанных текстовых строк сильно не рекомендуется для любого приложения, где имеет значение точность анализа.
>> > parser . parse ( '"Fly safely."' ) # For debugging/interactive use only. При анализе с необработанным текстом мы рекомендуем вместо этого использовать Spacy и benepar.BeneparComponent . Причина в том, что модели анализатора не поставляются с токенизатором или сплиттером предложений, и некоторые модели могут не включать тегистр частичной речи. Инструментарий должен использоваться для заполнения этих компонентов трубопровода, и Spacy превосходит NLTK во всех этих областях (иногда с большим отрывом).
Следующие обученные модели анализатора доступны. Чтобы использовать интеграцию Spacy, вам также необходимо установить модель Spacy для соответствующего языка.
| Модель | Язык | Информация |
|---|---|---|
benepar_en3 | Английский | 95,40 F1 на пересмотренном наборе тестового набора WSJ. Данные обучения используют пересмотренную токенизацию и синтаксическую аннотацию, основанные на тех же рекомендациях, что и английские веб -банк и Ontonotes, которые лучше соответствуют современной практике токенизации в таких библиотеках, как Spacy. На основе T5-Small. |
benepar_en3_large | Английский | 96.29 F1 на пересмотренном тестовом наборе WSJ. Данные обучения используют пересмотренную токенизацию и синтаксическую аннотацию, основанные на тех же рекомендациях, что и английские веб -банк и Ontonotes, которые лучше соответствуют современной практике токенизации в таких библиотеках, как Spacy. На основе T5-Large. |
benepar_zh2 | китайский | 92.56 F1 на испытательном наборе CTB 5.1. Использование с Spacy позволяет анализировать поддержание от необработанного текста, но API NLTK поддерживает только анализ предыдущих предложений. Основано на китайском электро-180G-широте. |
benepar_ar2 | арабский | 90.52 F1 на SPMRL2013/2014 Тестовый набор. Только поддерживает использование API NLTK для анализа ранее токеновых предложений. Расположение от необработанного текста и интеграции Spacy не поддерживается. На основе XLM-R. |
benepar_de2 | немецкий | 92.10 F1 на SPMRL2013/2014 Тестовый набор. На основе XLM-R. |
benepar_eu2 | Баск | 93,36 F1 на SPMRL2013/2014 Тестовый набор. Использование со Spacy сначала требует реализации басской поддержки в Spacy. На основе XLM-R. |
benepar_fr2 | Французский | 88.43 F1 на SPMRL2013/2014 Тестовый набор. На основе XLM-R. |
benepar_he2 | иврит | 93,98 F1 на SPMRL2013/2014 Тестовый набор. Только поддерживает использование API NLTK для анализа ранее токеновых предложений. Расположение от необработанного текста и интеграции Spacy не поддерживается. На основе XLM-R. |
benepar_hu2 | венгерский | 96.19 F1 на тестовом наборе SPMRL2013/2014. Использование со Spacy требует венгерской модели для Spacy. NLTK API поддерживает только анализ ранее токенизированных предложений. На основе XLM-R. |
benepar_ko2 | корейский | 91.72 F1 на SPMRL2013/2014 Тестовый набор. Может использоваться с моделью сегментации предложений Spacy (требует Spacy v3.0). NLTK API поддерживает только анализ ранее токенизированных предложений. На основе XLM-R. |
benepar_pl2 | Лак | 97.15 F1 на тестовом наборе SPMRL2013/2014. На основе XLM-R. |
benepar_sv2 | Шведский | 92.21 F1 на SPMRL2013/2014 Тестовый набор. Может использоваться с моделью сегментации предложений Spacy (требует Spacy v3.0). На основе XLM-R. |
benepar_en3_wsj | Английский | Подумайте о использовании benepar_en3 или benepar_en3_large вместо этого . 95.55 F1 на каноническом испытательном наборе WSJ, используемом на десятилетиях публикаций по анализу избирательных округов английского языка. На основе Берт-широко-раскрытого. Мы считаем, что пересмотренные рекомендации по аннотации, используемые для обучения benepar_en3 / benepar_en3_large , более подходящими для использования в нижнем потоке, потому что они лучше обрабатывают язык в веб -тексте и более соответствуют современным практикам в анализе зависимостей и таких библиотеках, как Spacy. Тем не менее, мы предоставляем модель benepar_en3_wsj для случаев, когда использование пересмотренных соглашений о деревах не подходит, например, как сравнительный анализ различных моделей в одном и том же наборе данных. |
Обучение требует клонирования этого репозитория от GitHub. В то время как код модели в src/benepar распределен в пакете benepar на PYPI, сценарии обучения и оценки непосредственно под src/ нет.
benepar , в том числе: NLTK 3.2, структуру горелки 0,4, трансформаторы 4.3.0 или совместимые.make внутри в справочнике EVALB/ для составления исполняемого файла evalb . Это будет вызвано из Python для оценки. Если обучение на наборах данных SPMRL, вам нужно будет запустить, make внутри в справочнике EVALB_SPMRL/ . Новая модель может быть обучена с помощью командного python src/main.py train ... Некоторые из доступных аргументов:
| Аргумент | Описание | По умолчанию |
|---|---|---|
--model-path-base | Путь для использования для сохранения моделей | N/a |
--evalb-dir | Путь к каталогу оценки | 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 | Эвристика для угадывания необработанного текста из описанно токенизированных файлов деревьев. См. load_trees() в src/treebanks.py | Правила по умолчанию для языков, кроме арабского, китайского и иврита |
--subbatch-max-tokens | Максимальное количество токенов для обработки параллельно во время обучения (полная партия может не вписаться в память GPU) | 2000 |
--parallelize | Распределить предварительно обученные модели (например, T5) слои по нескольким графическим процессорам. | Используйте не более одного графического процессора |
--batch-size | Количество примеров на обновление обучения | 32 |
--checks-per-epoch | Количество оценок развития на эпоху | 4 |
--numpy-seed | Numpy случайное семя | Случайный |
--use-pretrained | Используйте предварительно обученный энкодер | Не используйте предварительно обученный энкодер |
--pretrained-model | Модель для использования, если --use-pretrained использование. Может быть путь или идентификатор модели из концентратора модели Huggingface | bert-base-uncased |
--predict-tags | Добавляет компонент тега и вспомогательные потери | Не предсказывайте теги |
--use-chars-lstm | Использовать изученные представления слова Чарльста | Не используйте Charlstm |
--use-encoder | Используйте ученые трансформаторные слои поверх предварительно обученной модели или Charlstm | Не используйте дополнительные слои трансформатора |
--num-layers | Количество слоев трансформатора для использования, если --use-encoder | 8 |
--encoder-max-len | Максимальная длина предложения (словами) допускается для дополнительных слоев трансформаторов | 512 |
Дополнительные аргументы доступны для других гиперпараметров; См. make_hparams() в src/main.py . Они могут быть указаны в командной строке, таких как --num-layers 2 (для численных параметров), --no-XXX --predict-tags (для логических параметров, которые по умолчанию в Fals к истинному).
Для каждой оценки разработки F-оценка на наборе разработки вычисляется и сравнивается с предыдущими лучшими. Если текущая модель лучше, предыдущая модель будет удалена, а текущая модель будет сохранена. Новое имя файла будет получено из предоставленной базы путей модели и F-показателя Development.
До обучения анализатора вам сначала необходимо получить соответствующие учебные данные. Мы предоставляем инструкции о том, как обрабатывать стандартные наборы данных, такие как 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/ |
--test-path | Путь к тестированию деревьев | data/23.auto.clean |
--test-path-text | Дополнительная неразрушающая токенизация тестовых данных | Угадайте сырой текст; Смотрите --text-processing |
--text-processing | Эвристика для угадывания необработанного текста из описанно токенизированных файлов деревьев. См. load_trees() в src/treebanks.py | Правила по умолчанию для языков, кроме арабского, китайского и иврита |
--test-path-raw | Альтернативный путь к тестированию деревьев, который используется только для Evalb (используется для дважды проверить, что оценка по предварительно обработанным деревьям не содержит никаких ошибок) | Сравните с деревьями из --test-path |
--subbatch-max-tokens | Максимальное количество токенов для обработки параллельно (графический процессор не имеет достаточно памяти для обработки полного набора данных в одну партию) | 500 |
--parallelize | Распределить предварительно обученные модели (например, T5) слои по нескольким графическим процессорам. | Используйте не более одного графического процессора |
--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 гораздо меньшего размера. Мы используем это для наших официальных выпусков модели, потому что это хлопот для распределения весов модели, которые имеют размеры 2 ГБ+. При использовании опции --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 также имеет test подкоманду, которая примерно похожа на python src/main.py test , за исключением того, что он поддерживает экспортируемые модели и имеет несколько разные флаги. Мы можем запустить следующую команду, чтобы убедиться, что наш английский анализатор с использованием Bert-Large-Undersed действительно достигает 95,55 F1 на каноническом наборе тестирования WSJ:
python src/export.py test --model-path benepar_en3_wsj --test-path data/wsj/test_23.LDC99T42
См. EXPERIMENTS.md для инструкций о том, как воспроизводить эксперименты, зарегистрированные в наших статьях ACL 2018 и 2019 года.
Если вы используете это программное обеспечение для исследования, пожалуйста, укажите наши статьи следующим образом:
@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",
}
Код в этом хранилище и части этого чтения основан на https://github.com/mitchellstern/minimal-pan-parserer