C# Weka中实例的分类
我正在尝试在我的C#应用程序中使用Weka。我已经使用IKVM将Java部分引入到我的.NET应用程序中。这似乎很有效。然而,当涉及到Weka的API时,我感到不知所措。如果实例在我的应用程序中以编程方式传递,而不能作为ARFF文件使用,那么我如何准确地对它们进行分类 基本上,我正在尝试使用Weka的分类器集成一个简单的共同引用分析。我已经直接在Weka中构建了分类模型,并将其保存到磁盘,从那里我的.NET应用程序打开它,并使用Weka的IKVM端口预测类值 以下是我到目前为止得到的信息:C# Weka中实例的分类,c#,classification,weka,C#,Classification,Weka,我正在尝试在我的C#应用程序中使用Weka。我已经使用IKVM将Java部分引入到我的.NET应用程序中。这似乎很有效。然而,当涉及到Weka的API时,我感到不知所措。如果实例在我的应用程序中以编程方式传递,而不能作为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;
}
//这是分类方法的“条目”方法
公共IEnumerable执行(IEnumerable项)
{
TokenPair[]pairs=items.ToArray();
分类器模型=ReadModel();//读取Weka生成的模型
FastVector fv=创建FastVector(对);
实例=新实例(“licora”,fv,pairs.Length);
CreateInstances(实例,对);
对于(int i=0;i=0.5;
}
出于某种原因,当我调用model.classifyInstance(instance)
时,Weka抛出了一个IndexOutOfRangeException
。我不知道为什么,也不知道如何纠正这个问题
我希望有人知道我哪里出错了。我找到的Weka的唯一文档依赖于ARFF文件进行预测,我真的不想去那里。出于某种奇怪的原因,DTNB分类器提出了这个例外(我在多数票分类模型中使用了三个)。显然,不使用DTNB“修复”了这个问题