我已经安装了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没有人通过这样的修改分叉语法网或打算这样做吗?
答案 0 :(得分: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模块似乎不会有问题。你可以打电话。
这两个脚本都使用Tensorflow的tf.app.flags API(在此SO问题中描述:What's the purpose of tf.app.flags in TensorFlow?),因此必须将这些脚本重构为常规参数,如tf.app.flags
是一个进程级单例。
所以是的,你只需要做一些工作来使这些可调用的Python API :)
答案 1 :(得分:3)
我在云服务器上成功运行了它们。我想分享一些观点:
构建docker
sudo docker build - < ./Dockerfile
构建syntaxnet时可能会出现一些错误,只需按照./Docker文件手动构建docker,它就很容易理解。
下载预先训练的模型
syntaxnet的模型是here,例如中文模型 http://download.tensorflow.org/models/parsey_universal/Chinese.zip
位于here
的dragnn模型将它们解压缩到文件夹中 例如./synataxnet_data,所以你有像./synataxnet_data/Chinese
运行并测试
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.测试结果和问题
从我的中文模型测试来看,语法网络很慢,处理一个查询需要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。