2016-03-21 16 views
1

私は、ユーザーから自然言語の入力を受け取り、テーブルに格納するDjangoフレームワークを使用して設計したシンプルなインターフェイスを用意しています。djangoフレームワークでJavaコードを使用する

また、名前付きエンティティ認識を実行するためにcTAKESライブラリを使用してJavaで構築したパイプラインがあります。つまり、ユーザーが送信したテキスト入力を受け取り、関連するUMLSタグで注釈を付けます。

私がしたいことは、ユーザーから与えられた入力を受け取り、それをjava-cTAKESパイプラインに送り、注釈付きの出力をデータベースに戻すことです。

私はこのウェブ開発面ではかなり新しいので、この意味でのスクリプトの統合については何も見つかりません。ですから、誰かが私を有用なリソースに導いたり、一般的な正しい方向に向けると非常に役立ちます。

========================= UPDATE:

わかりましたので、私はサブプロセスがそのモジュールであることを考え出しました私は、この文脈で使用したいと私は、ドキュメントに基づいていくつかの簡単なコードを実装しようとしているが、私は私が何をしようとしているの簡単な概要

Exception Type: OSError 
Exception Value: [Errno 2] No such file or directory 
Exception Location: /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py in _execute_child, line 1335. 

を取得しています:

はこれがありますコード私はビューにあります。その目的は、モデルのフォームからテキスト入力を受け取り、POSTをDBに渡し、その入力をスクリプト内に渡します。このスクリプトは、DBの別の列に格納されたXMLファイルを生成します。私は非常にdjangoには新しかったので、これは単純な修正だと申し訳ありませんが、参考になったdjangoのサブプロセスに関するドキュメントは見つかりませんでした。

def queries_create(request): 
    if not request.user.is_authenticated(): 
     return render(request, 'login_error.html') 


    form = QueryForm(request.POST or None) 
    if form.is_valid(): 
     instance = form.save(commit=False) 
     instance.save() 
     p=subprocess.Popen([request.POST['post'], './path/to/run_pipeline.sh']) 
     p.save() 

    context = { 

     "title":"Create", 
     "form": form, 

    } 
    return render(request, "query_form.html", context) 

モデルのコードスニペット:

class Query(models.Model): 
    problem/intervention = models.TextField() 

    updated = models.DateTimeField(auto_now=True, auto_now_add=False) 
    timestamp = models.DateTimeField(auto_now=False, auto_now_add=True) 

UPDATE 2: オーケーコードは、もはやしかし、私は今取得しています

def queries_create(request): 
    if not request.user.is_authenticated(): 
     return render(request, 'login_error.html') 


    form = QueryForm(request.POST or None) 
    if form.is_valid(): 
     instance = form.save(commit=False) 
     instance.save() 
     p = subprocess.Popen(['path/to/run_pipeline.sh'], stdin=subprocess.PIPE,  
     stdout=subprocess.PIPE) 
     (stdoutdata, stderrdata) = p.communicate() 
     instance.processed_data = stdoutdata 
     instance.save() 

    context = { 

     "title":"Create", 
     "form": form, 

    } 
    return render(request, "query_form.html", context) 

以下のようにサブプロセスコードを変更することにより、破壊されていないので、 "メインクラスのパイプラインを見つけたり読み込めませんでした.CtakesPipeline"は、スクリプトがこの作業ディレクトリのシェルからうまく動作するのでわかりません。これは私がサブプロセスで呼び出そうとしているスクリプトです。

#!/bin/bash 

INPUT=$1 
OUTPUT=$2 
CTAKES_HOME="full/path/to/CtakesClinicalPipeline/apache-ctakes-3.2.2" 
UMLS_USER="####" 
UMLS_PASS="####" 
CLINICAL_PIPELINE_JAR="full/path/to/CtakesClinicalPipeline/target/ 
CtakesClinicalPipeline-0.0.1-SNAPSHOT.jar" 

[[ $CTAKES_HOME == "" ]] && CTAKES_HOME=/usr/local/apache-ctakes-3.2.2 

CTAKES_JARS="" 
for jar in $(find ${CTAKES_HOME}/lib -iname "*.jar" -type f) 
do 
    CTAKES_JARS+=$jar 
    CTAKES_JARS+=":" 
done 

current_dir=$PWD 
cd $CTAKES_HOME 

java -Dctakes.umlsuser=${UMLS_USER} -Dctakes.umlspw=${UMLS_PASS} -cp  
${CTAKES_HOME}/desc/:${CTAKES_HOME}/resources/:${CTAKES_JARS%?}: 
${current_dir}/${CLINICAL_PIPELINE_JAR} -  
-Dlog4j.configuration=file:${CTAKES_HOME}/config/log4j.xml -Xms512M -Xmx3g 
pipeline.CtakesPipeline $INPUT $OUTPUT 

cd $current_dir 

私はこのエラーを解決する方法についてはわかりませんので、何か助けに感謝します。

+1

私はcTAKESに精通していないので、これは無知な質問である場合はお詫び申し上げます。既存のマシンでこのJavaサービスを既に実行していて、Webアプリケーションからデータをパイプしたいのですか? WebアプリケーションとJavaアプリケーションの両方をデプロイしますか? – souldeux

+1

私は、Webアプリケーションの一部としてパイプラインを配備しようとしています。私は内部的にJavaスクリプトを使いたい。 – jdv12

答えて

2

あなたが正しく理解している場合は、request.POST ['post']の値をプログラムrun_pipeline.shにパイプし、その出力をインスタンスのフィールドに保存したいとします。

  1. あなたはsubprocess.Popenを間違って呼び出しています。それがなければならない:

    p = subprocess.Popen(['/path/to/run_pipeline.sh'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)

  2. そして例えば、データを保存した入力に渡し、出力

    (stdoutdata, stderrdata) = p.communicate()

  3. を読み取りますあなたのインスタンス

    instance.processed_data = stdoutdata instance.save()

の分野では、私はあなたが最初のPythonシェルでの作業サブプロセスへの呼び出しを取得し、あなたのDjangoのアプリでそれを統合することを確認してください示唆しています。

要求に(潜在的に長時間実行可能な)サブプロセスを作成することは、実際には悪いことであり、多くの問題を引き起こす可能性があることに注意してください。ベストプラクティスは、長時間実行されているタスクをジョブキューに委任することです。 Djangoの場合、おそらく最も一般的にはCeleryが使用されます。しかし、少しのセットアップが必要です。

+1

こんにちは、助けてくれてありがとう!私は今これを働かせようと努力しています。しかし、私がbashスクリプトを実行しようとしているコードはjavaであり、 "メインクラスを見つけたりロードできませんでした"というエラーが表示されます。これはサブプロセスのパラメータと関係していますか? – jdv12

+1

あなたのクラスパスに問題があるようです。 Pythonスクリプトを実行しているのと同じ作業ディレクトリでスクリプトを呼び出すのに使う正確なコマンドを実行できますか? –

+1

ええ、私はちょうどそれとその正常に動作しようとしました。私はそれがメインクラスを見つけることができないジャンゴアプリケーションを介して実行しようとするときにのみ。 – jdv12

関連する問題