API синтаксиса / Parsey McParseface Python
Я установил синтаксис и могу запустить анализатор с помощью предоставленного демо-сценария. В идеале я хотел бы запустить его прямо из Python. Единственный код, который я нашел, был таким:
import subprocess
import os
os.chdir(r"../models/syntaxnet")
subprocess.call([
"echo 'Bob brought the pizza to Alice.' | syntaxnet/demo.sh"
], shell = True)
что является полной катастрофой - неэффективно и чрезмерно сложно (вызов python из python должен выполняться с помощью python).
Как я могу вызывать API-интерфейсы Python напрямую, без использования сценариев оболочки, стандартного ввода-вывода и т. Д.?
РЕДАКТИРОВАТЬ - Почему это не так просто, как открыть синтаксис / demo.sh и прочитать его?
Этот сценарий оболочки вызывает два сценария Python (parser_eval и conll2tree), которые написаны как сценарии Python и не могут быть импортированы в модуль Python без появления нескольких ошибок. При ближайшем рассмотрении вы получите дополнительные скриптовые слои и нативный код. Эти верхние уровни должны быть реорганизованы для запуска всего этого в контексте Python. Разве никто не разветвлял синтаксис с такой модификацией или не собирался это делать?
4 ответа
В общем, не похоже, что было бы проблемой реорганизовать два сценария, запускаемых demo.sh ( https://github.com/tensorflow/models/blob/master/syntaxnet/syntaxnet/parser_eval.py и https://github.com/tensorflow/models/blob/master/syntaxnet/syntaxnet/conll2tree.py) в модуль Python, который предоставляет API-интерфейс Python, который вы можете вызвать.
Оба сценария используют API Tensorflow tf.app.flags (описанный здесь в этом SO-вопросе: какова цель использования tf.app.flags в TensorFlow?), Поэтому их придется реорганизовать в обычные аргументы, как tf.app.flags
это синглтон уровня процесса.
Так что да, вам просто нужно сделать работу, чтобы сделать их вызываемыми как Python API:)
Здесь есть API отдыха как для синтаксиса, так и для dragnn.
Я успешно запустил их на своем облачном сервере. Некоторые моменты, которыми я хочу поделиться:
построить докер
сборка sudo docker -<./Dockerfile
Некоторые ошибки могут возникать при сборке синтаксиса, просто следуйте./Dockerfile и соберите докер вручную, это легко выполнить.
скачать предварительно обученную модель
модель для синтаксиса здесь, например, китайская модель http://download.tensorflow.org/models/parsey_universal/Chinese.zip
модель для Dragnn находится здесь
разархивируйте их в папки, например./synataxnet_data, чтобы у вас было что-то вроде./synataxnet_data/Chinese
запустить и проверить
3.1 Synataxnet
run docker run -p 9000:9000 -v ./synataxnet_data/:/models ljm625/syntaxnet-rest-api test curl -X POST -d '{ "strings": [["今天天气很好","猴子爱吃 桃子"]] }' -H "Content-Type: application/json" http://xxx.xxx.xxx.xxx:9000/api/v1/query/Chinese
3,2 драгн
run sudo docker run -p 9001:9000 -v ./dragnn_data:/models ljm625/syntaxnet-rest-api:dragnn test http://Yourip:9001/api/v1/use/Chinse curl -X POST -d '{ "strings": ["今天 天气 很好","猴子 爱 吃 桃子"],"tree":true }' -H "Content-Type: application/json" http://xxx.xx.xx.xx:9001/api/v1/query
4. Результаты испытаний и проблемы
Из моего тестирования с китайской моделью, синтаксис медленный, он тратит 3 секунды на обработку одного запроса и 9 секунд на пакет из 50 запросов. Существует фиксированная стоимость загрузки модели.
Для модели dragnn это быстро, но я не удовлетворен результатом анализа (только тест на китайском).
PS: мне не нравится, как работает synataxnet, как, например, использование bazel и чтение данных из stdin. Если вы хотите настроить его, вы можете найти некоторую информацию здесь
Другой ресурс, который помогает https://github.com/dsindex/syntaxnet/blob/master/README_api.md
Лучший способ интегрировать SyntaxNet с вашим собственным кодом - это использовать его в качестве веб-службы. Я сделал это, чтобы разобрать португальский текст.
Я начал с адаптации существующего Docker-контейнера с серверами SyntaxNet и Tensorflow, чтобы он работал только на португальском языке, чтобы поддерживать низкий уровень памяти. Он работает очень быстро, и его легко интегрировать с вашим кодом.
Я сделал сообщение в блоге об этом, и вы можете легко адаптировать его к любому другому языку:
http://davidsbatista.net/blog/2017/07/22/SyntaxNet-API-Portuguese/
Из того, что я могу сказать, рекомендуемый в настоящее время способ использования синтаксиса из python - через DRAGNN.