2017-01-17 14 views
3

Я пытаюсь создать пользовательский NER, используя Apache OpenNLP 1.7. Из имеющейся документации Here, я разработал следующий кодApache OpenNLP: java.io.FileInputStream нельзя отнести к opennlp.tools.util.InputStreamFactory

import java.io.BufferedOutputStream; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.nio.charset.Charset; 

import opennlp.tools.namefind.NameFinderME; 
import opennlp.tools.namefind.NameSample; 
import opennlp.tools.namefind.NameSampleDataStream; 
import opennlp.tools.namefind.TokenNameFinderFactory; 
import opennlp.tools.namefind.TokenNameFinderModel; 
import opennlp.tools.util.ObjectStream; 
import opennlp.tools.util.PlainTextByLineStream; 
import opennlp.tools.util.TrainingParameters; 

public class PersonClassifierTrainer { 

     static String modelFile = "/opt/NLP/data/en-ner-customperson.bin"; 

     public static void main(String[] args) throws IOException { 

      Charset charset = Charset.forName("UTF-8"); 
      **ObjectStream<String> lineStream = new PlainTextByLineStream(new FileInputStream("/opt/NLP/data/person.train"), charset);** 
      ObjectStream<NameSample> sampleStream = new NameSampleDataStream(lineStream); 

      TokenNameFinderModel model; 
      TokenNameFinderFactory nameFinderFactory = null; 

      try { 
       model = NameFinderME.train("en", "person", sampleStream, TrainingParameters.defaultParams(), 
         nameFinderFactory); 
      } finally { 
       sampleStream.close(); 
      } 

      BufferedOutputStream modelOut = null; 

      try { 
       modelOut = new BufferedOutputStream(new FileOutputStream(modelFile)); 
       model.serialize(modelOut); 
      } finally { 
       if (modelOut != null) 
        modelOut.close(); 
      } 
     } 
    } 

код выделенного выше, показывает - файл «Литой аргумент„“к„insputstreamfactory“

Я вынужден бросить это, потому что он показывает ошибку в противном случае.

Теперь, когда я запускаю мой код, я получаю следующую ошибку

java.io.FileInputStream cannot be cast to opennlp.tools.util.InputStreamFactory 

Есть ли что-нибудь не хватает?

Edit 1: Person.train файл имеет эти данные

<START:person> Hardik <END> is a software Professional.<START:person> Hardik works at company<END> and <START:person> is part of development team<END>. <START:person> Hardik<END> lives in New York 
<START:person> Hardik<END> loves R statistical software 
<START:person> Hardik<END> is a student at ISB 
<START:person> Hardik<END> loves nature 

Edit2: Я теперь получаю исключения нулевого указателя, любая помощь?

ответ

4

Вам нужен экземпляр InputStreamFactory, который доставит ваш InputStream. Кроме того, TokenNameFinderFactory не должно быть null.

public class PersonClassifierTrainer { 

    static String modelFile = "/opt/NLP/data/en-ner-customperson.bin"; 

    public static void main(String[] args) throws IOException { 

     InputStreamFactory isf = new InputStreamFactory() { 
      public InputStream createInputStream() throws IOException { 
       return new FileInputStream("/opt/NLP/data/person.train"); 
      } 
     }; 

     Charset charset = Charset.forName("UTF-8"); 
     ObjectStream<String> lineStream = new PlainTextByLineStream(isf, charset); 
     ObjectStream<NameSample> sampleStream = new NameSampleDataStream(lineStream); 

     TokenNameFinderModel model; 
     TokenNameFinderFactory nameFinderFactory = new TokenNameFinderFactory(); 

     try { 
      model = NameFinderME.train("en", "person", sampleStream, TrainingParameters.defaultParams(), 
        nameFinderFactory); 
     } finally { 
      sampleStream.close(); 
     } 

     BufferedOutputStream modelOut = null; 

     try { 
      modelOut = new BufferedOutputStream(new FileOutputStream(modelFile)); 
      model.serialize(modelOut); 
     } finally { 
      if (modelOut != null) 
       modelOut.close(); 
     } 
    } 
} 

Edit 1: Person.train файл имеет эти данные

<START:person> Hardik <END> is a software Professional.<START:person> Hardik works at company<END> and <START:person> is part of development team<END>. <START:person> Hardik<END> lives in New York 
<START:person> Hardik<END> loves R statistical software 
<START:person> Hardik<END> is a student at ISB 
<START:person> Hardik<END> loves nature 
+0

это работает, но теперь я получаю исключения нулевого указателя, вы можете попробовать один раз, чтобы запустить на вашем конце, прикреплял мой person.train содержимое файла –

+0

'TokenNameFinderFactory' не должно быть нулевым. См. Обновленный код. – Schrieveslaach

+0

Schrieveslaach, я думаю, для Apache важно обновить это в официальной документации, удивив, как никто не сталкивался с этой проблемой до сих пор. –