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.

Я успешно запустил их на своем облачном сервере. Некоторые моменты, которыми я хочу поделиться:

  1. построить докер

    сборка sudo docker -<./Dockerfile

    Некоторые ошибки могут возникать при сборке синтаксиса, просто следуйте./Dockerfile и соберите докер вручную, это легко выполнить.

  2. скачать предварительно обученную модель

    модель для синтаксиса здесь, например, китайская модель http://download.tensorflow.org/models/parsey_universal/Chinese.zip

    модель для Dragnn находится здесь

    разархивируйте их в папки, например./synataxnet_data, чтобы у вас было что-то вроде./synataxnet_data/Chinese

  3. запустить и проверить

    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.

Другие вопросы по тегам