Am 05.12.2013 14:43, schrieb Sebastian: > Peter Klügl <pkluegl@...> writes: > >> Hi, >> >> Am 04.12.2013 18:33, schrieb Sebastian: >>> Hi, >>> >>> I'm highly interested in ruta, and its potential applications in > industrial >>> applications. Right know I'm trying to create a simple toy condition >>> extension that is simply a case insensitive INLIST condition. It is >>> completely based on the InListCondition class, I also declared an >>> implementation of the IRutaConditionExtension interface. >>> >>> With primitve types everything seems to work great, except when the >>> condition is used with a variable : >>> >>> STRINGLIST MonthsList = {"january", ...}; >>> DECLARE Month; >>> ANY{INSENSITIVEINLIST(MonthsList) -> MARK(Month)}; >>> >>> I get a class cast exception when the condition is being created, > because >>> MonthsList is a SimpleTypeExpression and I'm expecting a > StringListExpression. >>> Am I doing something wrong ? I suppose there is a way to resolve the >>> variable to the actual list, but I missed it somehow. >>> >> It's hard to say what went wrong. My first guess would be that there is >> a problem in your extension. I just verified that INLIST works at all (I >> haven't used it myself for a long time). >> >> The example works with INLIST: >> >> STRINGLIST MonthsList = {"january"}; >> DECLARE Month; >> ANY{INLIST(MonthsList) -> MARK(Month)}; >> >> Can you post the stacktrace of the exception? Or can you send me the >> source code of your extension (in case you do not want to post it on a >> public mailing list)? >> >> Anyways, the usage of INLIST makes only sense if you want to work on >> dynamic dictionaries that may change during rule execution. Have you >> taken a look at the MARKFAST or TRIE action? >> http://uima.apache.org/d/ruta- > current/tools.ruta.book.html#ugr.tools.ruta.language.actions.markfast >> They already have options for case-insensitivity and are overall faster >> and more powerful. >> >> Best, >> >> Peter >> >> PS: You can, of course, also post a feature request on JIRA for adding a >> case-insensitivity to the INLIST condition >> >>> Any ideas on how that could be done? >>> >>> Regards >>> >>> Sebastian >>> >> > > Hi Peter, > Before giving the code, let me explain why I'm interested in a case > insensitive inlist. > > As far as I understand the behaviour of MARKFAST, it cannot be used with > more complex conditions than list containment. The problem with TRIE is that > it requires an external resource that is somewhat read from the file system, > whereas I'm interested in somehow embedding resources in jars and reading > them using classloader getResource capabilities (maybe I missed something > there too). > But you are right, I don't need a dynamic dictionary :)
I normally just apply the dictionaries, which create some annotations of the given type(s). Those types are then included in more complex conditions in other rules. Most rule-based systems that I know have outsourced dictionary matches since they are inefficient in predicates. Both actions should also work with dictionaries in the classpath. If not, I will fix it ASAP :-) > Anyway, here's how I declared it : Thanks. I will try to take a look at it. If not today, then tomorrow. Best, Peter > public class CIInListCondition extends TerminalRutaCondition { > > private StringListExpression stringList; > > public CIInListCondition(StringListExpression list) { > super(); > this.stringList = list; > } > > @Override > public EvaluatedCondition eval(AnnotationFS annotation, > RuleElement element, RutaStream stream, InferenceCrowd crowd) { > String coveredText = annotation.getCoveredText(); > if (StringUtils.isEmpty(coveredText)) > return new EvaluatedCondition(this, false); > > List<String> sList = stringList.getList(element.getParent(), > stream); > return new EvaluatedCondition(this, > sList.contains(coveredText.toLowerCase())); > } > > public StringListExpression getStringList() { > return stringList; > } > } > > > And the associated extension > > public class CIInListConditionExtension implements IRutaConditionExtension { > > private final String[] knownExtensions = new String[] { > "INSENSITIVEINLIST" }; > > private final Class<?>[] extensions = new Class[] { > CIInListCondition.class }; > > ... > > @Override > public AbstractRutaCondition createCondition(String name, > List<RutaExpression> args) throws RutaParseException { > if (args != null && args.size() == 1) { > System.out.println(args.get(0).getClass().getName()); // prints > org.apache.uima.ruta.expression.type.SimpleTypeExpression > > System.out.println(((SimpleTypeExpression)args.get(0)).getTypeString()); // > prints MonthsList > if (!(args.get(0) instanceof StringListExpression)) { > > } > > } else { > throw new RutaParseException( > "INSENSITIVEINLIST accepts exactly a > StringListExpression as arguments"); > } > return new CIInListCondition((StringListExpression) args.get(0)); // > It Fails here > } > > > And here's the stack trace : > > java.lang.ClassCastException: > org.apache.uima.ruta.expression.type.SimpleTypeExpression cannot be cast to > org.apache.uima.ruta.expression.list.StringListExpression > at > dictanova.genesis.textpreprocessing.ruta.CIInListConditionExtension.createCo > ndition(CIInListConditionExtension.java:68) > > Regards, > > Sebastian >