2012-03-08 19 views
0

私はC#アプリケーションでWekaを使用しようとしています。私はIKVMを使用して、Javaアプリケーションを.NETアプリケーションに移植しました。これはかなりうまくいくようです。しかし、WekaのAPIについては、私は迷っています。正確にはdoアプリケーションがプログラムで渡され、ARFFファイルとして利用できない場合、インスタンスを分類します。Wekaのインスタンスの分類

基本的に、私はウェカの分類器を使用して、単純な共参照解析を統合しようとしています。私はWekaで直接分類モデルを構築し、それをディスクに保存しました。そこから.NETアプリケーションが開き、WekaのIKVMポートを使用してクラス値を予測します。ここで

は、私がこれまで持っているものです。何らかの理由で

// This is the "entry" method for the classification method 
    public IEnumerable<AttributedTokenDecorator> Execute(IEnumerable<TokenPair> items) 
    { 
     TokenPair[] pairs = items.ToArray(); 
     Classifier model = ReadModel(); // reads the Weka generated model 
     FastVector fv = CreateFastVector(pairs); 

     Instances instances = new Instances("licora", fv, pairs.Length); 
     CreateInstances(instances, pairs); 

     for(int i = 0; i < instances.numInstances(); i++) 
     { 
      Instance instance = instances.instance(i); 
      double classification = model.classifyInstance(instance); // array index out of bounds? 

      if(AsBoolean(classification)) 
       MakeCoreferent(pairs[i]); 
     } 

     throw new NotImplementedException(); // TODO 
    } 

    // This is a helper method to create instances from the internal model files 
    private static void CreateInstances(Instances instances, IEnumerable<TokenPair> pairs) 
    { 
     instances.setClassIndex(instances.numAttributes() - 1); 
     foreach(var pair in pairs) 
     { 
      var instance = new Instance(instances.numAttributes()); 
      instance.setDataset(instances); 
      for (int i = 0; i < instances.numAttributes(); i++) 
      { 
       var attribute = instances.attribute(i); 
       if (pair.Features.ContainsKey(attribute.name()) && pair.Features[attribute.name()] != null) 
       { 
        var value = pair.Features[attribute.name()]; 
        if (attribute.isNumeric()) instance.setValue(attribute, Convert.ToDouble(value)); 
        else instance.setValue(attribute, value.ToString()); 
       } 
       else 
       { 
        instance.setMissing(attribute); 
       } 
      } 
      //instance.setClassMissing(); 
      instances.add(instance); 
     } 
    } 

    // This creates the data set's attributes vector 
    private FastVector CreateFastVector(TokenPair[] pairs) 
    { 
     var fv = new FastVector(); 

     foreach (var attribute in _features) 
     { 
      Attribute att; 
      if (attribute.Type.Equals(ArffType.Nominal)) 
      { 
       var values = new FastVector(); 
       ExtractValues(values, pairs, attribute.FeatureName); 
       att = new Attribute(attribute.FeatureName, values); 
      } 
      else 
       att = new Attribute(attribute.FeatureName); 

      fv.addElement(att); 
     } 

     { 
      var classValues = new FastVector(2); 
      classValues.addElement("0"); 
      classValues.addElement("1"); 
      var classAttribute = new Attribute("isCoref", classValues); 
      fv.addElement(classAttribute); 
     } 

     return fv; 
    } 

    // This extracts observed values for nominal attributes 
    private static void ExtractValues(FastVector values, IEnumerable<TokenPair> pairs, string featureName) 
    { 
     var strings = (from x in pairs 
         where x.Features.ContainsKey(featureName) && x.Features[featureName] != null 
         select x.Features[featureName].ToString()) 
      .Distinct().ToArray(); 

     foreach (var s in strings) 
      values.addElement(s); 
    } 

    private Classifier ReadModel() 
    { 
     return (Classifier) SerializationHelper.read(_model); 
    } 

    private static bool AsBoolean(double classifyInstance) 
    { 
     return classifyInstance >= 0.5; 
    } 

を私はmodel.classifyInstance(instance)を呼び出すときに、ウェカはIndexOutOfRangeExceptionをスローします。なぜ私は考えていない、または私はこの問題を解決するためのアイデアを思い付くことはできません。

誰かが私が間違っていた場所を知りたいと思っています。私が見つけたWekaの唯一のドキュメンテーションは、予測のためにARFFファイルに依存しており、私は実際にそこに行きたくはありません。

答えて

0

いくつかの奇妙な理由から、この例外はDTNB分類器によって生成されました(私は多数決分類モデルで3つを使用していました)。どうやら、DTNBを使用していないのは問題を "修正"したことです。

関連する問題