2009-12-08 7 views
0

J'utilise la boîte à outils de traitement Stanford Natural Language. J'ai essayé de trouver des fautes d'orthographe avec la méthode isKnown de Lexicon, mais cela produit pas mal de faux positifs. J'ai donc pensé charger un deuxième lexique, et vérifier cela aussi. Cependant, cela provoque un problème.Java Stanford NLP: ArrayIndexOutOfBounds après le chargement du deuxième lexique

private static LexicalizedParser lp = new LexicalizedParser(Constants.stdLexFile); 
private static LexicalizedParser wsjLexParse = new LexicalizedParser(Constants.wsjLexFile); 

    static { 
     lp.setOptionFlags(Constants.lexOptionFlags);   
     wsjLexParse.setOptionFlags(Constants.lexOptionFlags);  
    } 

public ParseTree(String input) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException { 
    initialInput = input; 
    DocumentPreprocessor process = new DocumentPreprocessor(); 
    sentences = process.getSentencesFromText(new StringReader(input)); 

    for (List<? extends HasWord> sent : sentences) { 
     if(lp.parse(sent)) { // line 65 
      forest.add(lp.getBestParse()); //non determinism? 
     } 
    } 

    partsOfSpeech = pos(); 
    runAnalysis(); 
} 

Ce qui suit échoue trace est produite:

java.lang.ArrayIndexOutOfBoundsException: 45547 
    at edu.stanford.nlp.parser.lexparser.BaseLexicon.initRulesWithWord(BaseLexicon.java:300) 
    at edu.stanford.nlp.parser.lexparser.BaseLexicon.isKnown(BaseLexicon.java:160) 
    at edu.stanford.nlp.parser.lexparser.BaseLexicon.ruleIteratorByWord(BaseLexicon.java:212) 
    at edu.stanford.nlp.parser.lexparser.ExhaustivePCFGParser.initializeChart(ExhaustivePCFGParser.java:1299) 
    at edu.stanford.nlp.parser.lexparser.ExhaustivePCFGParser.parse(ExhaustivePCFGParser.java:388) 
    at edu.stanford.nlp.parser.lexparser.LexicalizedParser.parse(LexicalizedParser.java:234) 
    at nth.compling.ParseTree.<init>(ParseTree.java:65) 
    at nth.compling.ParseTreeTest.constructor(ParseTreeTest.java:33) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.junit.internal.runners.BeforeAndAfterRunner.invokeMethod(BeforeAndAfterRunner.java:74) 
    at org.junit.internal.runners.BeforeAndAfterRunner.runBefores(BeforeAndAfterRunner.java:50) 
    at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:33) 
    at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:45) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196) 

Si je commente cette ligne: (et d'autres références à wsjLexParse)

private static LexicalizedParser wsjLexParse = new LexicalizedParser(Constants.wsjLexFile); 

alors tout fonctionne très bien. Qu'est-ce que je fais mal ici?

Répondre

0

Cela ressemble à un bogue dans la bibliothèque de Stanford. Vous devriez le signaler à eux.

Le deuxième lexique fonctionne-t-il lorsque vous le chargez uniquement (et pas l'autre)? La même erreur se produit-elle lorsque vous chargez les deux lexica dans un ordre différent?

Questions connexes