Syntaxnet / Parsey McParseface python API

时间:2016-08-22 09:04:16

标签: python nlp syntaxnet parsey-mcparseface

我已经安装了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上下文中运行整个事物。 Hasn没有人通过这样的修改分叉语法网或打算这样做吗?

4 个答案:

答案 0 :(得分: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 API的Python模块似乎不会有问题。你可以打电话。

这两个脚本都使用Tensorflow的tf.app.flags API(在此SO问题中描述:What's the purpose of tf.app.flags in TensorFlow?),因此必须将这些脚本重构为常规参数,如tf.app.flags是一个进程级单例。

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

答案 1 :(得分:3)

这里有syntaxnetdragnn的Rest API。

我在云服务器上成功运行了它们。我想分享一些观点:

  1. 构建docker

    sudo docker build - < ./Dockerfile

    构建syntaxnet时可能会出现一些错误,只需按照./Docker文件手动构建docker,它就很容易理解。

  2. 下载预先训练的模型

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

    位于here

    的dragnn模型

    将它们解压缩到文件夹中 例如./synataxnet_data,所以你有像./synataxnet_data/Chinese

  3. 这样的东西。
  4. 运行并测试

    3.1 Synataxnet

    var list=['382813587410259968','881413399304863744'];
    var content=[];
    var dataj;
    list.forEach(function(value,callback){
    Twitter.get('statuses/oembed', { id:value},  function (err, data, response) {
    if(err)
    {callback(err,null,null);}
    dataj=data.html.toString;
    callback(null,dataj,null);
            });
    function func(dataj)
    {
    content.push(dataj);
    console.log(content);
    }
    });
    

    3.2 dragnn

    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
    

    4.测试结果和问题

  5. 从我的中文模型测试来看,语法网络很慢,处理一个查询需要3秒钟,一批50个查询需要9秒钟。加载模型有固定的成本。

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

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

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

答案 2 :(得分:2)

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

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

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

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

答案 3 :(得分:1)

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