2016-07-31 59 views
0

有一個屬性過濾器應該從一組實例中刪除與指定正則表達式匹配的每個屬性。按名稱刪除屬性。過濾器壞了?

我在RegEx中遇到問題。

我嘗試了幾個簡單的,都是有效的(在regexr上測試)。 但過濾器似乎不接受他們。

遵循相關的代碼。

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

這應該匹配所有以「i」結尾的名字。

得到的數據集被命名爲

「數據集,weka.filters.unsupervised.attribute.StringToNominal-RLAST-weka.filters.unsupervised.attribute.Remove-weka.filters.unsupervised.attribute.RemoveByName- E ^。* id $「

請注意,^.*id$是默認表達式。它沒有改變。

雖然filterX.getExpression();給出了之前設置的正確的正則表達式。 此過濾器的這種用法與幾個代碼示例相對應。 相同,如果我設置正則表達式使用Filter.setOptions(); 這是一個版本3.9.0 dev和3.8穩定的問題。

使用WEKA-GUI,過濾器工作正常。

因此另一種假設是,如果進入編程方式,正則表達式必須有一個特殊的格式..不幸的是,API不提供的例子..

+1

它究竟是不是接受它們?另外,'i $'是上述正則表達式的一個合適(更快)的版本? – RamenChef

+0

謝謝你,但是你的正則表達式只會匹配後綴'i'嗎?我會測試它。因爲它不會過濾任何屬性,儘管其名稱與正則表達式匹配。 – Jan

回答

1

你需要設置輸入之前設置的表達和InvertSelection標誌格式。

更一般地說,我認爲你必須在設置inputFormat之前設置所有選項。

以下是正在工作。

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