2012-10-16 60 views
0

我想从java程序中调用CRF ++工具包。我键入以下内容:从java项目运行CRF ++时出错

Process process = runtime.exec("/home/toshiba/Bureau/CRF++-0.54/.libs/lt-crf_learn /home/toshiba/Bureau/CRF++-0.54/example/atb/template /home/toshiba/Bureau/CRF++-0.54/example/atb/tr_java.data"); 
process.waitFor(); 

不过,我有以下错误:

CRF++: Yet Another CRF Tool Kit 
Copyright (C) 2005-2009 Taku Kudo, All rights reserved. 

Usage: /home/toshiba/Bureau/CRF++-0.54/.libs/lt-crf_learn [options] files 
-f, --freq=INT    use features that occuer no less than INT(default 1) 
-m, --maxiter=INT   set INT for max iterations in LBFGS routine(default 10k) 
-c, --cost=FLOAT   set FLOAT for cost parameter(default 1.0) 
-e, --eta=FLOAT    set FLOAT for termination criterion(default 0.0001) 
-C, --convert    convert text model to binary model 
-t, --textmodel    build also text model file for debugging 
-a, --algorithm=(CRF|MIRA) select training algorithm 
-p, --thread=INT   number of threads(default 1) 
-H, --shrinking-size=INT set INT for number of iterations variable needs to be  optimal before considered for shrinking. (default 20) 
-v, --version    show the version and exit 
-h, --help     show this help and exit 

我想知道如果任何人能帮助我吗?

+0

是... /模板文件还是目录?你可以试试只有后者的文件吗?我想你搞砸了命令行参数。你有没有尝试从壳运行相同的? – Fildor

+0

../template是一个文件。 – amibar

+0

我试过从shell中运行相同的文件,并且我有相同的 – amibar

回答

0

我不认为这是CRF ++中的错误,因为您可以从命令行运行它。所以真正的问题是如何在使用Runtime.exec()启动进程时正确传递参数。我会建议尝试以下操作:

String[] cmd = {"/home/toshiba/Bureau/CRF++-0.54/.libs/lt-crf_learn", 
    "/home/toshiba/Bureau/CRF++-0.54/example/atb/template", 
    "/home/toshiba/Bureau/CRF++-0.54/example/atb/tr_java.data"}; 
Process p = Runtime.getRuntime().exec(cmd); 

以来的Runtime.exec这可能有助于()有时拆分命令行参数将在一个相当奇怪的方式。

另一个潜在问题是这里所说的:Java Runtime.exec()

0

有这一个简单的解决方案。只需将您的命令写入一个临时文件并执行该文件为Runtime.getRuntime.exec("sh <temp-filename>")。稍后您可以删除此文件。如果此解决方案适用于您,我会解释此背后的原因。