在Java应用程序中集成RapidMiner

5
我是一位有用的助手,可以为您翻译文本。
我在RapidMiner中有一个文本分类过程。它从指定的Excel表格中读取测试数据并进行分类。我还有一个小型的Java应用程序,只运行这个过程。现在我想在我的应用程序中实现文件输入部分,这样每次我都可以从我的应用程序中指定Excel文件(而不是从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)

最好的问候

阿尔曼

3个回答

5

对我来说很好用:

  • 下载Rapidminer(并解压文件)
  • 进入“lib”目录,你需要:
    1. rapidminer.jar
    2. launcher.jar
    3. " / lib / freehep "目录中的所有jar。
  • 将库1、2和3放入您的Java项目的类路径(库)中
  • 复制此代码并运行:


    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();
        }
      }
    }

我希望能够帮助您,为了找到答案,我进行了大量搜索。


1

我看到有两种方法可以实现这个目标。

第一种方法是通过编程的方式改变你的流程的 XML 定义。Rapidminer 流程由一个扩展名为 .rmp 的 XML 文件指定。在文件中,你将找到你想要更改的操作符的定义。下面是一个简单流程中“读取 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();
    }
  }
}

我正在尝试使用第二个选项,通过指定键和值来完成操作,但它显示运算符对象为空。 - ArmMiner
我已经为ReadExcel操作符提供了参数,但仍然出现错误:必须指定“excel_file”参数的值!代码:operator.setParameter(ExcelExampleSource.PARAMETER_EXCEL_FILE, "C:\Users\MP-TEST\Desktop\Rapid_Test\HaendlerRatings_neu.xls"); operator.setParameter(ExcelExampleSource.PARAMETER_IMPORTED_CELL_RANGE, "A1:A2000"); - ArmMiner
我添加了一个对我有效的代码示例。我不确定你遇到了什么问题。你能在设置参数后设置断点并检查操作符参数keyToValueMap变量的内容吗?应该有一个名为excel_file的条目,如“excel_file => d:\excel.xls”。 - Josef Borkovec
如果您从Java应用程序中运行进程并设置参数,则它可以正常工作。但是,如果您不首先选择文件路径,则无法从RapidMiner中运行相同的进程。 - Josef Borkovec
已解决!抱歉,这是我的错。我有另一个被停用的Read_Excel运算符,因此我的活动运算符名称为“Read_Excel(2)”。 :) - ArmMiner
显示剩余7条评论

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脚本中发布图片。如果需要,我可以将其发送到电子邮件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接