2013-10-10 2 views
1

Я новичок в java, и требование для меня - прочитать документ и выполнить документацию с именем сущности. Для простых строк я сделал следующийКак читать документ для распознавания имен в OpenNLP

InputStream is = new FileInputStream("data/en-ner-person.bin"); 
TokenNameFinderModel model = new TokenNameFinderModel(is); 
is.close(); 
NameFinderME nameFinder = new NameFinderME(model); 
String []sentence = new String[]{"Smith", 
       "Smithosian", 
       "is", 
       "a", 
       "person" 
       }; 



    Span nameSpans[] = nameFinder.find(sentence); 

Однако, мне нужно на самом деле читать поток из документа, а затем генерировать XML. Может кто-нибудь пожалуйста, скажите мне, как это сделать

Благодаря

ответ

4

Noone когда-либо ответил на этот вопрос, так что я надеюсь, что это не слишком поздно.

Для извлечения сущности необходимо иметь текст документа в формате String. Проверьте stackoverflow для многих способов получить текстовый текст в String (короткий ответ здесь либо использует BufferedInputStream для текстовых файлов, либо Apache Tika для MS и PDF-файлов)

после того, как у вас есть текст документа в памяти, этот код должен служить вам, чтобы выполнить обнаружение границ посылки, токенизацию и NER. Затем возьмите результат этого и сгенерируйте xmlDoc любым способом, используя docname/docid, возможно, некоторые метаданные файла и фактическую строку сущности, а также тип и Span (местоположение сетевого элемента в тексте)

этот класс должен начать работу

package processors; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.InputStream; 
import java.util.ArrayList; 
import java.util.List; 
import opennlp.tools.namefind.NameFinderME; 
import opennlp.tools.namefind.TokenNameFinderModel; 
import opennlp.tools.sentdetect.SentenceDetector; 
import opennlp.tools.sentdetect.SentenceDetectorME; 
import opennlp.tools.sentdetect.SentenceModel; 
import opennlp.tools.tokenize.TokenizerME; 
import opennlp.tools.tokenize.TokenizerModel; 
import opennlp.tools.util.Span; 

public class OpenNLPNER implements Runnable 
{ 

    static TokenizerModel tm = null; 
    static TokenNameFinderModel locModel = null; 
    String doc; 
    NameFinderME myNameFinder; 
    TokenizerME wordBreaker; 
    SentenceDetector sd; 

    public OpenNLPNER() 
    { 
    } 

    public OpenNLPNER(String document, SentenceDetector sd, NameFinderME mf, TokenizerME wordBreaker) 
    { 
     System.out.println("got doc"); 
     this.sd = sd; 
     this.myNameFinder = mf; 
     this.wordBreaker = wordBreaker; 
     doc = document; 
    } 

    private static List<String> getMyDocsFromSomewhere() 
    { 
     //this should return an object that has all the info about the doc you want 
     return new ArrayList<String>(); 
    } 

    public static void main(String[] args) 
    { 
     try 
     { 
      String modelPath = "c:\\temp\\opennlpmodels\\"; 

      if (tm == null) 
      { 
       //user does normal namefinder instantiations... 
       InputStream stream = new FileInputStream(new File(modelPath + "en-token.zip")); 
       // new SentenceDetectorME(new SentenceModel(new FileInputStream(new File(modelPath + "en-sent.zip")))); 
       tm = new TokenizerModel(stream); 
       // new TokenizerME(tm); 
       locModel = new TokenNameFinderModel(new FileInputStream(new File(modelPath + "en-ner-location.bin"))); 
       // new NameFinderME(locModel); 
      } 


      System.out.println("getting data"); 
      List<String> docs = getMyDocsFromSomewhere(); 
      System.out.println("\tdone getting data"); 
      // FileWriter fw = new FileWriter("C:\\apache\\modelbuilder\\sentences.txt"); 




      for (String docu : docs) 
      { 
       //you could also use the runnable here and launch in a diff thread 
       new OpenNLPNER(docu, 
         new SentenceDetectorME(new SentenceModel(new FileInputStream(new File(modelPath + "en-sent.zip")))), 
         new NameFinderME(locModel), new TokenizerME(tm)).run(); 

      } 

      System.out.println("done"); 


     } catch (Exception ex) 
     { 
      System.out.println(ex); 
     } 


    } 

    @Override 
    public void run() 
    { 
     try 
     { 
      process(doc); 
     } catch (Exception ex) 
     { 
      System.out.println(ex); 
     } 
    } 

    public void process(String document) throws Exception 
    { 

     // System.out.println(document); 
     //user instantiates the non static entitylinkerproperty object and constructs is with a pointer to the prop file they need to use 
     String modelPath = "C:\\apache\\entitylinker\\"; 


     //input document 
     myNameFinder.clearAdaptiveData(); 
     //user splits doc to sentences 
     String[] sentences = sd.sentDetect(document); 
     //get the sentence spans 
     Span[] sentenceSpans = sd.sentPosDetect(document); 
     Span[][] allnamesInDoc = new Span[sentenceSpans.length][]; 
     String[][] allTokensInDoc = new String[sentenceSpans.length][]; 

     for (int sentenceIndex = 0; sentenceIndex < sentences.length; sentenceIndex++) 
     { 
      String[] stringTokens = wordBreaker.tokenize(sentences[sentenceIndex]); 
      Span[] tokenSpans = wordBreaker.tokenizePos(sentences[sentenceIndex]); 
      Span[] spans = myNameFinder.find(stringTokens); 
      allnamesInDoc[sentenceIndex] = spans; 
      allTokensInDoc[sentenceIndex] = stringTokens; 
     } 

     //now access the data like this... 
     for (int s = 0; s < sentenceSpans.length; s++) 
     { 
      Span[] namesInSentence = allnamesInDoc[s]; 
      String[] tokensInSentence = allTokensInDoc[s]; 
      String[] entities = Span.spansToStrings(namesInSentence, tokensInSentence); 
      for (String entity : entities) 
      { 
       //start building up the XML here.... 
       System.out.println(entity + " Was in setnence " + s + " @ " + namesInSentence[s].toString()); 
      } 
     } 

    } 
}