2016-08-22 7 views
12

私はsyntaxnetをインストールしました。付属のデモスクリプトを使ってパーサを実行することができました。理想的には、私はPythonから直接実行したいと思います。 私が見つけた唯一のコードは、このでした:Syntaxnet/Parsey McParseface python API

完全な災害である
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で行われるべきで呼び出します)。

シェルスクリプト、標準I/Oなどを経由せずに、Python APIを直接呼び出す方法はありますか?

EDIT-syntaxnet/demo.shを開いて読むのはなぜ簡単ではないのですか?

このシェルスクリプトは、pythonスクリプトとして書かれた2つのpythonスクリプト(parser_evalとconll2tree)を呼び出し、複数のエラーを引き起こすことなくpythonモジュールにインポートすることはできません。近くに見ると、スクリプトに似たレイヤーとネイティブコードが追加されます。これらの上位層は、Pythonコンテキストですべてを実行するためにリファクタリングする必要があります。そのような変更を加えた誰かがsyntaxnetをフォークしたことはありませんか?

+0

ヒント:オープンsyntaxnet/demo.shファイルを、それを読んで。 – RAVI

+0

@RAVIはまだ誰もしていないのですか? – zvisofer

+0

demo.shを開こうとしましたか?非常に小さなシェルスクリプトです。これは、parser_evalとconll2treeを使用します。必要なパラメータを使用してこれらのファイルをインポートして呼び出すことができます。 – RAVI

答えて

5

2つのスクリプト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モジュールで実行します。

どちらのスクリプトは、(このSO質問に、ここで説明:What's the purpose of tf.app.flags in TensorFlow?)Tensorflowのtf.app.flagsのAPIを使用するので、それらはtf.app.flagsは、プロセスレベルのシングルトンであるとして、通常の引数に出てリファクタリングしなければならないであろう。

ええ、あなただけのPythonのAPIとしてこれらを呼び出し可能にするために仕事をする必要があると思います:)

+1

これは他人によって行われたものではなく、すでにオンラインで利用可能であるという事実をご存じですか? – zvisofer

+0

@zvisofer:いいえ、 "Syntaxnet Python API"を検索すると、このGHの問題が見つかりました。https://github.com/tensorflow/models/issues/148 ...「自分でやってください」と言っているようです。 – AKX

1

私が言うことができるものからだから、パイソンからsyntaxnetを使用するには、現在推奨の方法は、DRAGNN経由です。

3

syntaxnetdragnnの両方にレストAPIがあります。

私はそれらをクラウドサーバーで正常に実行しました。私は共有したいいくつかのポイント:

  1. ビルドドッキングウィンドウ

    sudoのドッキングウィンドウのビルド - ビルドsyntaxnetは、ちょうど./Dockerfileに従うと、ドッキングウィンドウを構築する際< ./Dockerfile

    いくつかのエラーが発生することがあります手動で、それは簡単に従うことができます。 syntaxnetため

  2. ダウンロードの事前訓練を受けたモデル

    モデルは、例えばhere

    はそう、例えば./synataxnet_data フォルダにそれらを解凍位置dragnnのための中国のモデル http://download.tensorflow.org/models/parsey_universal/Chinese.zip

    モデル、hereですあなたのようなものがあります。/ synataxnet_data /中国

  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 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.test結果と問題

から、私の中国語モデルでテストすると、シンタックスネットは遅く、1つのクエリを処理するのに3秒、50のクエリをバッチするのに9秒かかる。モデルを読み込むための固定コストがあります。

dragnnモデルでは高速ですが、解析結果(中国語のテストのみ)に満足できません。

PS:私はbazelを使用して、あなたはそれをカスタマイズしたい場合は、標準入力からデータを読み込むような方法のsynataxnetの作品を、好きではない、あなたは https://github.com/dsindex/syntaxnet/blob/master/README_api.md

を助ける here

その他のリソースをいくつかの情報を見つけることができます

1

SyntaxNetを独自のコードと統合する最善の方法は、それをWebサービスとして持つことです。ポルトガル語のテキストを解析するために私はそれをしました。

私は、ポスタルのためだけに実行するSyntaxNetとTensorflowを提供する既存のDocker Containerを、メモリを低く抑えるように調整し始めました。これは非常に速く実行され、コードとの統合が容易です。

私はそれについてのブログ記事をやった、あなたは簡単に他の言語に適応させることができます。

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