2013-04-05 64 views
4

在RapidMiner中我有一个文本分类过程。它从指定的excel ssheet中读取测试数据并进行分类。我也有一个小型的Java应用程序正在运行这个过程。现在我想在我的应用程序中创建文件输入部分,以便每次我都能够从我的应用程序(而不是从RapidMiner)指定excel文件。 任何提示?在Java应用程序中集成RapidMiner

这是代码:

import com.rapidminer.RapidMiner; 
import com.rapidminer.Process; 
import com.rapidminer.example.Attribute; 
import com.rapidminer.example.Example; 
import com.rapidminer.example.ExampleSet; 
import com.rapidminer.operator.IOContainer; 
import com.rapidminer.operator.Operator; 
import com.rapidminer.operator.OperatorException; 



import java.io.File; 
import java.io.IOException; 
import java.util.Iterator; 
import com.rapidminer.operator.io.ExcelExampleSource; 
import com.rapidminer.tools.XMLException; 


public class Classification { 

    public static void main(String [] args) throws Exception{ 
     ExampleSet resultSet1 = null; 
     IOContainer ioInput = null; 
     IOContainer ioResult; 
     try { 
      RapidMiner.setExecutionMode(RapidMiner.ExecutionMode.COMMAND_LINE); 
      RapidMiner.init(); 
      Process pr = new Process(new File("C:\\Users\\MP-TEST\\Desktop\\Rapid_Test\\Wieder_Model.rmp")); 
      Operator op = pr.getOperator("Read Excel"); 
      op.setParameter(ExcelExampleSource.PARAMETER_EXCEL_FILE, "C:\\Users\\MP-TEST\\Desktop\\Rapid_Test\\HaendlerRatings_neu.xls"); 
      ioResult = pr.run(ioInput); 
      if (ioResult.getElementAt(0) instanceof ExampleSet) { 
       resultSet1 = (ExampleSet)ioResult.getElementAt(0); 

       for (Example example : resultSet1) { 
        Iterator<Attribute> allAtts = example.getAttributes().allAttributes(); 
        while(allAtts.hasNext()) { 
         Attribute a = allAtts.next(); 
           if (a.isNumerical()) { 
             double value = example.getValue(a); 
             System.out.println(value); 

           } else { 
             String value = example.getValueAsString(a); 
             System.out.println(value); 
           } 
         } 
       } 
        } 
     } catch (IOException | XMLException | OperatorException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 




      } 
} 

这是错误:

Apr 09, 2013 9:06:05 AM com.rapidminer.Process run 
INFO: Process C:\Users\MP-TEST\Desktop\Rapid_Test\Wieder_Model.rmp starts 
com.rapidminer.operator.UserError: A value for the parameter 'excel_file' must be specified! 
    at com.rapidminer.operator.nio.model.ExcelResultSetConfiguration.makeDataResultSet(ExcelResultSetConfiguration.java:316) 
    at com.rapidminer.operator.nio.model.AbstractDataResultSetReader.createExampleSet(AbstractDataResultSetReader.java:127) 
    at com.rapidminer.operator.io.AbstractExampleSource.read(AbstractExampleSource.java:52) 
    at com.rapidminer.operator.io.AbstractExampleSource.read(AbstractExampleSource.java:1) 
    at com.rapidminer.operator.io.AbstractReader.doWork(AbstractReader.java:126) 
    at com.rapidminer.operator.Operator.execute(Operator.java:855) 
    at com.rapidminer.operator.execution.SimpleUnitExecutor.execute(SimpleUnitExecutor.java:51) 
    at com.rapidminer.operator.ExecutionUnit.execute(ExecutionUnit.java:711) 
    at com.rapidminer.operator.OperatorChain.doWork(OperatorChain.java:379) 
    at com.rapidminer.operator.Operator.execute(Operator.java:855) 
    at com.rapidminer.Process.run(Process.java:949) 
    at com.rapidminer.Process.run(Process.java:873) 
    at com.rapidminer.Process.run(Process.java:832) 
    at com.rapidminer.Process.run(Process.java:827) 
    at Classification.main(Classification.java:29) 

问候

阿尔钦

回答

1

我看到两种方法可以做到这一点。

第一种方法是以编程方式更改流程的XML定义。 Rapidminer进程由具有.rmp扩展名的XML文件指定。在该文件中,您会找到您想要更改的操作员的定义。这是一个简单的过程specifiing的读取Excel操作的摘录:

<operator activated="true" class="read_excel" compatibility="5.3.005" expanded="true" height="60" name="Read Excel" width="90" x="313" y="75"> 
    <parameter key="excel_file" value="D:\file.xls"/> <!-- HERE IS THE FILE PATH --> 
    <parameter key="sheet_number" value="1"/> 
    <parameter key="imported_cell_range" value="A1"/> 
    <parameter key="encoding" value="SYSTEM"/> 
    <parameter key="first_row_as_names" value="true"/> 
    <list key="annotations"/> 
    <parameter key="date_format" value=""/> 
    <parameter key="time_zone" value="SYSTEM"/> 
    <parameter key="locale" value="English (United States)"/> 
    <list key="data_set_meta_data_information"/> 
    <parameter key="read_not_matching_values_as_missings" value="true"/> 
    <parameter key="datamanagement" value="double_array"/> 
</operator> 

我强调其中的路径,Excel文件的组成部分。你可以在你的应用程序中覆盖它。只是要小心不要破坏XML文件。


另一种方法是在您的Java应用程序中加载进程后修改运算符。您可以通过Process#getOperator(String name)Process#getAllOperators()得到您的运营商的参考。我想这应该是这些类中的一种:

com.rapidminer.operator.io.ExcelExampleSource 
com.rapidminer.operator.nio.ExcelExampleSource 

当您找到正确的操作你的Operator#setParameter(String key, String Value)修改路径。

此代码对我的作品与RapidMiner 5.3:(的过程就是一个读取Excel操作和写CSV运营商)

package sorapid; 

import com.rapidminer.Process; 
import com.rapidminer.RapidMiner; 
import com.rapidminer.operator.Operator; 
import com.rapidminer.operator.OperatorException; 
import com.rapidminer.operator.io.ExcelExampleSource; 
import com.rapidminer.tools.XMLException; 
import java.io.File; 
import java.io.IOException; 

public class SOrapid { 

    public static void main(String[] args) { 
    try { 
     RapidMiner.setExecutionMode(RapidMiner.ExecutionMode.COMMAND_LINE); 
     RapidMiner.init(); 

     Process process = new Process(new File("c:\\Users\\Matlab\\.RapidMiner5\\repositories\\Local Repository\\processes\\test.rmp")); 
     Operator op = process.getOperator("Read Excel"); 
     op.setParameter(ExcelExampleSource.PARAMETER_EXCEL_FILE, "d:\\excel.xls"); 
     process.run(); 

    } catch (IOException | XMLException | OperatorException ex) { 
     ex.printStackTrace(); 
    } 
    } 
} 
+0

我想通过指定键和值来做第二个选项,但它表明运算符对象为空。 – ArmMiner 2013-04-05 16:24:47

+0

我给出了ReadExcel运算符的参数,但仍然收到错误: 必须指定参数'excel_file'的值! 代码: operator.setParameter(ExcelExampleSource.PARAMETER_EXCEL_FILE, “C:\\用户\\ MP-TEST \\桌面\\ Rapid_Test \\ HaendlerRatings_neu.xls”); \t \t operator.setParameter(ExcelExampleSource.PARAMETER_IMPORTED_CELL_RANGE,“A1:A2000”); – ArmMiner 2013-04-08 08:08:36

+0

我添加了一个适用于我的代码示例。我不确定可能是你的问题。设置参数并检查运算符parameters.keyToValueMap变量的内容后,可以设置断点吗?应该有一个excel_file条目,如“excel_file => d:\ excel.xls” – 2013-04-08 10:54:09

0

试试这个:

private SimpleExampleSet ReadExcel(File processXMLFile_, File excelFile_) throws IOException, XMLException, OperatorException 
{ 
    IOContainer outParameters = null; 
    Process  readExcel  = new Process(processXMLFile_); 
    IOObject inObject  = new SimpleFileObject(excelFile_); 
    IOContainer inParameters = new IOContainer(inObject); 

    outParameters = readExcel.run(inParameters); 

    SimpleExampleSet result = (SimpleExampleSet) outParameters.getElementAt(0); 

    return result; 

} 

对不起,我不能发布如果需要,可以使用RapidMiner脚本进行图像处理,我可以将它发送到电子邮件。

4

正常工作对我来说:

  • Download Rapidminer(并解压文件)
  • 进入 “lib” 目录下,你需要:
    1. rapidminer.jar
    2. launcher.jar
    3. 所有jar放在“/ lib/freehep”目录下。
  • 认沽库1,2,在你的classpath的Java项目3(库)
  • 复制此代码并运行:


    import com.rapidminer.Process; 
    import com.rapidminer.RapidMiner; 
    import com.rapidminer.operator.Operator; 
    import com.rapidminer.operator.OperatorException; 
    import com.rapidminer.operator.io.ExcelExampleSource; 
    import com.rapidminer.tools.XMLException; 
    import java.io.File; 
    import java.io.IOException; 
    import java.lang.Object; 

    public class ReadRapidminerProcess { 
     public static void main(String[] args) { 
     try { 
      RapidMiner.setExecutionMode(RapidMiner.ExecutionMode.COMMAND_LINE); 
      RapidMiner.init(); 

      Process process = new Process(new File("/your_path/your_file.rmp")); 
      process.run(); 

     } catch (IOException | XMLException | OperatorException ex) { 
      ex.printStackTrace(); 
     } 
     } 
    } 

我希望能帮助你,我搜索了很多之前找到答案。

相关问题