2016-07-31 18 views
0

Es gibt einen Attributfilter, der jedes Attribut, das einem angegebenen regulären Ausdruck entspricht, aus einer Gruppe von Instanzen entfernen soll.Attribute nach Namen entfernen. Filter kaputt?

Ich habe Probleme mit der RegEx.

Ich versuchte mehrere einfache, die alle gültig sind (getestet auf Regexr). Aber der Filter scheint sie nicht zu akzeptieren.

Folgen Sie dem entsprechenden Code.

Instances dataset1_x=new Instances(dataset1); 

RemoveByName filterX=new RemoveByName(); 
filterX.setInputFormat(dataset1_x); 
filterX.setInvertSelection(true); 
filterX.setExpression(Pattern.quote("^.*i$")); 
//filterX.setExpression("^.*i$"); also don't work 
Instances dataset1_=Filter.useFilter(dataset1_x,filterX); 

Dies sollte mit allen Namen übereinstimmen, die mit einem "i" enden.

Der resultierende Datenmenge gestattet

„Dataset-weka.filters.unsupervised.attribute.StringToNominal-Rlast-weka.filters.unsupervised.attribute.Remove-weka.filters.unsupervised.attribute.RemoveByName- E ^. * ID $

Beachten Sie, dass ^.*id$ der Standardausdruck ist. Es hat sich nicht geändert.

Obwohl filterX.getExpression(); die richtige Regex-Einstellung vorgibt. Auch diese Verwendung des Filters entspricht mehreren Code-Beispielen. Gleich, wenn ich die Regex mit Filter.setOptions(); Dies ist ein Problem der Version 3.9.0 Dev und auch 3,8 stabil.

Mit der WEKA-GUI funktioniert der Filter korrekt.

So eine andere Annahme ist, dass, wenn programmatisch eingegeben, die Regex ein spezielles Format haben muss .. Leider ist das API nicht Beispiele liefern ..

+1

Wie genau akzeptiert es sie nicht? Außerdem wäre 'i $' eine geeignete (und schnellere) Version des obigen Regex? – RamenChef

+0

danke aber nicht Ihre Regex würde nur mit dem Suffix "i" übereinstimmen. Ich werde es testen. da es kein Attribut filtert, obwohl sein Name mit der Regex übereinstimmt. – Jan

Antwort

1

Sie müssen den Ausdruck und die InvertSelection-Flag setzen, bevor Sie die Eingangseinstellung Format.

Allgemeiner nehme ich an, dass Sie alle Option einstellen müssen, bevor Sie das inputFormat setzen.

Folgendes funktioniert.

Instances dataset1_x=new Instances(dataset1); 
RemoveByName filterX=new RemoveByName(); 
filterX.setInvertSelection(true); 
filterX.setExpression(Pattern.quote("^.*i$")); 
filterX.setInputFormat(dataset1_x); 
Instances dataset1_=Filter.useFilter(dataset1_x,filterX);