API-интерфейс Syntaxnet/Parsey McParseface python

Я установил синтаксическую сеть и могу запустить парсер с предоставленной демонстрацией script. В идеале я хотел бы запустить его прямо из 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, не просматривая сценарии оболочки, стандартный ввод-вывод и т.д.

EDIT - Почему это не так просто, как открытие synaxnet/demo.sh и чтение его?

Эта оболочка script вызывает два сценария python (parser_eval и conll2tree), которые написаны как скрипты python и не могут быть импортированы в модуль python без возникновения нескольких ошибок. Более пристальный взгляд дает дополнительные script -подобные слои и собственный код. Эти верхние уровни необходимо реорганизовать, чтобы запустить все это в контексте python. Разве никто не разветвлял синтаксис с такой модификацией или намеревался сделать это?

Ответ 1

В целом, это не похоже на реорганизацию двух сценариев 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, который вы можете вызвать.

Оба сценария используют Tensorflow tf.app.flags API (описанный здесь в этом вопросе SO: Какова цель tf.app.flags в TensorFlow?), поэтому они должны быть реорганизованы на регулярные аргументы, так как tf.app.flags является одноточечным уровнем уровня процесса.

Так что да, вам просто нужно будет сделать работу, чтобы сделать их вызываемыми как API Python:)

Ответ 2

Здесь есть API-интерфейс Restore для syntaxnet и dragnn.

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

  • построить докер

    sudo docker build - <./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 dragnn

    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, например, использование базы данных и чтение данных из stdin, если вы хотите ее настроить, вы можете найти некоторую информацию здесь

Другие ресурсы, которые помогают https://github.com/dsindex/syntaxnet/blob/master/README_api.md

Ответ 3

Из того, что я могу сказать, рекомендуемый в настоящее время способ использования синтаксиса из python - это DRAGNN.

Ответ 4

Лучший способ интегрировать SyntaxNet с вашим собственным кодом - это использовать его как веб-сервис. Я сделал это, чтобы разобрать португальский текст.

Я начал с адаптации существующего контейнера Docker с сервисом SyntaxNet и Tensorflow, чтобы работать только на португальском, чтобы поддерживать низкую память. Он работает очень быстро и легко интегрируется с вашим кодом.

Я сделал сообщение в блоге об этом, и вы можете легко адаптировать его к любому другому языку:

http://davidsbatista.net/blog/2017/07/22/SyntaxNet-API-Portuguese/