Добавить пользовательский файл jape в исходный код GATE

Может ли кто-нибудь объяснить мне, как создать один пользовательский файл JAPE и настроить его с исходным кодом GATE. Я попытался использовать следующий код и получил исключение типа "Ошибка при анализе грамматики:" и "Не заданы ни параметры grammURL, ни binaryGrammarURL!"

     try{
             Document doc = new DocumentImpl();
              String str = "This is test.";
              DocumentContentImpl impl = new DocumentContentImpl(str);
              doc.setContent(impl);
          System.setProperty("gate.home", "C:\\Program Files\\GATE_Developer_7.1"); 
          Gate.init();
          gate.Corpus corpus = (Corpus) Factory
            .createResource("gate.corpora.CorpusImpl");
          File gateHome = Gate.getGateHome();
          File pluginsHome = new File(gateHome, "plugins");
          Gate.getCreoleRegister().registerDirectories(new File(pluginsHome, "ANNIE").toURI().toURL());  

          Transducer transducer = new Transducer();
             transducer.setDocument(doc);
transducer.setGrammarURL(new URL("file:///D:/misc_workspace/gate-7.1-build4485-SRC/plugins/ANNIE/resources/NE/SportsCategory.jape"));
transducer.setBinaryGrammarURL(new URL("file:///D:/misc_workspace/gate-7.1-build4485-SRC/plugins/ANNIE/resources/NE/SportsCategory.jape"));

LanguageAnalyser jape = (LanguageAnalyser)Factory.createResource(
                  "gate.creole.Transducer", gate.Utils.featureMap(
                          "grammarURL", "D:/misc_workspace/gate-7.1-build4485-SRC/plugins/ANNIE/resources/NE/SportsCategory.jape",
                          "encoding", "UTF-8"));

person abhijit nag    schedule 23.02.2013    source источник


Ответы (3)


Вам нужно будет загрузить плагин ANNIE

Gate.getCreoleRegister().registerDirectories(
  new File(Gate.getPluginsHome(), "ANNIE").toURI().toURL());

а затем создайте экземпляр gate.creole.Transducer с правильными параметрами

LanguageAnalyser jape = (LanguageAnalyser)Factory.createResource(
  "gate.creole.Transducer", gate.Utils.featureMap(
      "grammarURL", new URL("file:///D:/path/to/my-grammar.jape"),
      "encoding", "UTF-8")); // ensure this matches the file

Но подход, который мы обычно поддерживаем, состоит в том, чтобы собрать и настроить весь конвейер так, как вы хотите, в GATE Developer, с любыми стандартными компонентами, которые вам нужны, плюс ваши собственные грамматики, а затем сохранить состояние приложения в файл. Затем вы можете перезагрузить все приложение из кода, используя одну строку

CorpusController app = (CorpusController) PersistenceManager.loadObjectFromFile(savedAppFile);

Изменить: код, который вы добавили к своему вопросу, имеет несколько фундаментальных проблем. Во-первых, вы должны вызвать Gate.init(), прежде чем делать что-либо еще с GATE - это должно быть до создания вашего Document. И, во-вторых, вы должны никогда не вызывать конструктор класса Resource напрямую — всегда используйте Factory. Точно так же вам никогда не придется вызывать init() напрямую, так как это делается за вас как часть Factory.createResource. Например:

// initialise GATE
Gate.setGateHome(new File("C:\\Program Files\\GATE_Developer_7.1"));
Gate.init();

// load ANNIE plugin - you must do this before you can create tokeniser
// or JAPE transducer resources.
Gate.getCreoleRegister().registerDirectories(
   new File(Gate.getPluginsHome(), "ANNIE").toURI().toURL());

// Build the pipeline
SerialAnalyserController pipeline =
  (SerialAnalyserController)Factory.createResource(
     "gate.creole.SerialAnalyserController");
LanguageAnalyser tokeniser = (LanguageAnalyser)Factory.createResource(
     "gate.creole.tokeniser.DefaultTokeniser");
LanguageAnalyser jape = (LanguageAnalyser)Factory.createResource(
  "gate.creole.Transducer", gate.Utils.featureMap(
      "grammarURL", new File("D:\\path\\to\\my-grammar.jape").toURI().toURL(),
      "encoding", "UTF-8")); // ensure this matches the file
pipeline.add(tokeniser);
pipeline.add(jape);

// create document and corpus
Corpus corpus = Factory.newCorpus(null);
Document doc = Factory.newDocument("This is test.");
corpus.add(doc);
pipeline.setCorpus(corpus);

// run it
pipeline.execute();

// extract results
System.out.println("Found annotations of the following types: " +
  doc.getAnnotations().getAllTypes());

Если вы еще этого не сделали, я настоятельно рекомендую вам изучить материалы учебного курса как минимум для модуля 5, который покажет вам правильный способ загрузки документа и запуска над ним ресурсов обработки.

person Ian Roberts    schedule 23.02.2013
comment
Большое спасибо Ян. Не могли бы вы поделиться кодом для создания экземпляра преобразователя. Я получаю исключение, такое как Ошибка при разборе грамматики: и вложенная причина, такая как Ни параметры грамматикиURL, ни параметры binaryGrammarURL не установлены! - person abhijit nag; 25.02.2013
comment
@abhijitnag это был (LanguageAnalyser)Factory.createResourcebit. Если вы уже пробовали что-то, что не сработало, вам следует отредактировать свой вопрос и включить неработающий код, чтобы мы могли предложить исправления. - person Ian Roberts; 25.02.2013
comment
Ян, я обновил вопрос кодом, который пробовал. Не могли бы вы предложить. - person abhijit nag; 25.02.2013

Спасибо, Ян. Материалы этих учебных курсов полезны. Но моя проблема была в другом, и я решил ее. Следующий фрагмент кода показывает, как использовать пользовательский файл jape в GATE. Теперь мой пользовательский файл jape может создавать новую аннотацию.

 System.setProperty("gate.home", "C:\\Program Files\\GATE_Developer_7.1"); 
  Gate.init();

  ProcessingResource token = (ProcessingResource)   Factory.createResource("gate.creole.tokeniser.DefaultTokeniser",Factory.newFeatureMap());



 String str = "This is a test. Myself Abhijit Nag sport";
   Document doc = Factory.newDocument(str);


  gate.Corpus corpus = (Corpus) Factory.createResource("gate.corpora.CorpusImpl");
  corpus.add(doc);
  File gateHome = Gate.getGateHome();
  File pluginsHome = new File(gateHome, "plugins");

  Gate.getCreoleRegister().registerDirectories(new File(pluginsHome, "ANNIE").toURI().toURL());  


 LanguageAnalyser jape = (LanguageAnalyser)Factory.createResource(
              "gate.creole.Transducer", gate.Utils.featureMap(
                      "grammarURL", "file:///D:/misc_workspace/gate-7.1-build4485-SRC/plugins/ANNIE/resources/NE/SportsCategory.jape","encoding", "UTF-8"));
      jape.setCorpus(corpus);
      jape.setDocument(doc);
      jape.execute();

  pipeline = (SerialAnalyserController) Factory.createResource("gate.creole.SerialAnalyserController",
                Factory.newFeatureMap(), Factory.newFeatureMap(),"ANNIE");
              initAnnie();
              pipeline.setCorpus(corpus);
              pipeline.add(token);
              pipeline.add((ProcessingResource)jape.init());
              pipeline.execute();
      AnnotationSetImpl ann = (AnnotationSetImpl) doc.getAnnotations();
      System.out.println(" ...Total annotation "+ann.getAllTypes());
person abhijit nag    schedule 25.02.2013
comment
Вы по-прежнему используете new DocumentImpl(), doc.setContent и т. д., которые следует заменить на Document doc = Factory.newDocument("This is a test ....");. DocumentImpl — это тип ресурса, и применяется правило не использовать new, используйте правило Factory. - person Ian Roberts; 26.02.2013

Это еще один вариант, если вы хотите обновить конвейер ANNIE.

  1. Сначала получите список ресурсов обработки по умолчанию/существующих в вашем конвейере.
  2. Создайте экземпляр вашего правила JAPE
  3. Переберите список существующих ресурсов обработки, добавив каждый в новую коллекцию. Добавьте свое собственное правило JAPE в эту коллекцию.
  4. Когда вы запускаете свой конвейер ANNIE, ваше правило JAPE будет выбрано автоматически, поэтому нет необходимости указывать пути к документам или выполнять их по отдельности.

Образец кода:

File pluginsHome = Gate.getPluginsHome();
File anniePlugin = new File(pluginsHome, "ANNIE");
File annieGapp = new File(anniePlugin, "ANNIE_with_defaults.gapp");
annieController = (CorpusController) PersistenceManager.loadObjectFromFile(annieGapp);

LanguageAnalyser jape = (LanguageAnalyser)Factory.createResource(
                "gate.creole.Transducer", gate.Utils.featureMap(
                        "grammarURL", new URL("file:///C://Program Files//gate-7.1//plugins//ANNIE//resources//NE//opensource.jape"),
                        "encoding", "UTF-8")); 

Collection<ProcessingResource> newPRS = new ArrayList<ProcessingResource>();
Collection<ProcessingResource> prs = annieController.getPRs();
for(ProcessingResource resource: prs){
    newPRS.add(resource);
}
newPRS.add((ProcessingResource)jape.init());
annieController.setPRs(newPRS);
person cdugga    schedule 15.02.2014