14

我已经安装了 syntaxnet,并且能够使用提供的演示脚本运行解析器。理想情况下,我想直接从 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 完成)。

我怎样才能直接调用 python API,而不通过 shell 脚本、标准 I/O 等?

编辑 -为什么这不像打开 syntaxnet/demo.sh 并阅读它那么容易?

这个 shell 脚本调用了两个 python 脚本(parser_eval 和 conll2tree),它们被编写为 python 脚本,并且不能导入到 python 模块中而不会导致多个错误。仔细观察会产生额外的类似脚本的层和本机代码。为了在 python 上下文中运行整个事情,需要重构这些上层。没有人对语法网进行这样的修改或打算这样做吗?

4

4 回答 4

4

总而言之,重构 demo.sh 运行的两个脚本(https://github.com/tensorflow/models/blob/master/syntaxnet/syntaxnet/parser_eval.pyhttps: //github.com/tensorflow/models/blob/master/syntaxnet/syntaxnet/conll2tree.py)到一个 Python 模块中,该模块公开一个您可以调用的 Python API。

两个脚本都使用 Tensorflow 的 tf.app.flags API(在此 SO 问题中描述:What's the purpose of tf.app.flags in TensorFlow?),因此必须将它们重构为常规参数,就像tf.app.flags流程级别一样单身人士。

所以,是的,你只需要做一些工作就可以将这些作为 Python API 调用 :)

于 2016-10-02T09:08:53.067 回答
4

这里有一个用于syntaxnetdragnn的 Rest API 。

我已经在我的云服务器上成功运行了它们。我想分享的几点:

  1. 构建码头工人

    sudo docker build -< ./Dockerfile

    构建语法网络时可能会出现一些错误,只需按照 ./Dockerfile 并手动构建 docker,很容易遵循。

  2. 下载预训练模型

    syntaxnet 的模型在这里,例如中文模型 http://download.tensorflow.org/models/parsey_universal/Chinese.zip

    dragnn 模型位于此处

    将它们解压缩到文件夹中,例如 ./synataxnet_data,这样你就有了类似 ./synataxnet_data/Chinese 的东西

  3. 运行和测试

    3.1 语法网

    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.测试结果及问题

根据我对中文模型的测试,syntaxnet 很慢,处理一个查询需要 3 秒,而一批 50 个查询需要 9 秒。加载模型有固定成本。

对于dragnn模型,速度很快,但是我对解析结果不满意(只能用中文测试)。

PS:我不喜欢 synataxnet 的工作方式,比如使用 bazel 和从标准输入读取数据,如果你想自定义它,你可以在这里找到一些信息

其他有帮助的资源 https://github.com/dsindex/syntaxnet/blob/master/README_api.md

于 2017-07-04T10:07:37.550 回答
2

将 SyntaxNet 与您自己的代码集成的最佳方法是将其作为 Web 服务。我这样做是为了解析葡萄牙语文本。

我首先使用 SyntaxNet 和 Tensorflow 服务来调整现有的 Docker 容器,只为葡萄牙语运行,以保持低内存。它运行速度非常快,并且很容易与您的代码集成。

我写了一篇关于它的博客文章,您可以轻松地将其调整为任何其他语言:

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

于 2017-09-05T09:55:38.053 回答
1

据我所知,目前推荐的从 python 使用 syntaxnet 的方法是通过DRAGNN

于 2017-05-01T02:02:56.650 回答