2016-05-23 5 views
1

Wie kann ich Folgendes tun?Interaktion mit einem großen Java-Programm als Dienst?

Was ich tun möchte, ist laden Stanford NLP ONCE, interagieren Sie dann mit ihm über einen HTTP oder anderen Endpunkt. Der Grund ist, dass das Laden viel Zeit in Anspruch nimmt und das Laden für jeden zu analysierenden String nicht in Frage kommt.

Zum Beispiel, hier ist Stanford NLP Laden in einem einfachen # Programm C, die die Gläser laden ... Ich bin auf der Suche zu tun, was ich unten tat, aber in Java:

Reading POS tagger model from edu/stanford/nlp/models/pos-tagger/english-left3words/english-left3words-distsim.tagger ... done [9.3 sec]. 
    Loading classifier from D:\Repositories\StanfordNLPCoreNLP\stanford-corenlp-3.6.0-models\edu\stanford\nlp\models\ner\english.all.3class.distsim.crf.ser.gz ... done [12.8 sec]. 
    Loading classifier from D:\Repositories\StanfordNLPCoreNLP\stanford-corenlp-3.6.0-models\edu\stanford\nlp\models\ner\english.muc.7class.distsim.crf.ser.gz ... done [5.9 sec]. 
    Loading classifier from D:\Repositories\StanfordNLPCoreNLP\stanford-corenlp-3.6.0-models\edu\stanford\nlp\models\ner\english.conll.4class.distsim.crf.ser.gz ... done [4.1 sec]. 
done [8.8 sec]. 

Sentence #1 ... 

Dies ist 30 über Sekunden. Wenn diese alle jedesmal laden müssen, hey. Um zu zeigen, was ich in Java tun wollen, schrieb ich ein funktionierendes Beispiel in C# und das komplette Beispiel kann jemand eines Tages helfen:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

using System.IO; 
using java.io; 
using java.util; 
using edu.stanford.nlp; 
using edu.stanford.nlp.pipeline; 
using Console = System.Console; 

namespace NLPConsoleApplication 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      // Path to the folder with models extracted from `stanford-corenlp-3.6.0-models.jar` 
      var jarRoot = @"..\..\..\..\StanfordNLPCoreNLP\stanford-corenlp-3.6.0-models"; 
      // Text for intial run processing 
      var text = "Kosgi Santosh sent an email to Stanford University. He didn't get a reply."; 
      // Annotation pipeline configuration 
      var props = new Properties(); 
      props.setProperty("annotators", "tokenize, ssplit, pos, lemma, ner, parse, sentiment"); 
      props.setProperty("ner.useSUTime", "0"); 
      // We should change current directory, so StanfordCoreNLP could find all the model files automatically 
      var curDir = Environment.CurrentDirectory; 
      Directory.SetCurrentDirectory(jarRoot); 
      var pipeline = new StanfordCoreNLP(props); 
      Directory.SetCurrentDirectory(curDir); 
      // loop 
      while (text != "quit") 
      { 
       // Annotation 
       var annotation = new Annotation(text); 
       pipeline.annotate(annotation); 
       // Result - Pretty Print 
       using (var stream = new ByteArrayOutputStream()) 
       { 
        pipeline.prettyPrint(annotation, new PrintWriter(stream)); 
        Console.WriteLine(stream.toString()); 
        stream.close(); 
       } 
       edu.stanford.nlp.trees.TreePrint tprint = new edu.stanford.nlp.trees.TreePrint("words"); 
       Console.WriteLine(); 
       Console.WriteLine("Enter a sentence to evaluate, and hit ENTER (enter \"quit\" to quit)"); 
       text = Console.ReadLine(); 
      } // end while 
     } 
    } 
} 

So nimmt es die 30 Sekunden zu laden, aber jedes Mal, wenn Sie es geben eine Zeichenfolge auf der Konsole, dauert es den kleinsten Bruchteil einer Sekunde zu analysieren & Tokenize diese Zeichenfolge.

Sie können sehen, dass ich die JAR-Dateien vor der While-Schleife geladen habe.

Dies kann am Ende ein Socket-Service, HTML oder etwas anderes sein, das Anfragen (in Form von Strings) bedienen und das Parsing zurückspucken wird.

Mein ultimatives Ziel ist es, einen Mechanismus in Nifi zu verwenden, über einen Prozessor, der zu parsierende Strings senden kann und in weniger als einer Sekunde zurückgegeben wird, im Gegensatz zu 30+ Sekunden) wird eingesetzt. Jede Anfrage würde die ganze Sache für 30 Sekunden laden, DANN gehe zur Sache. Ich hoffe, ich habe das klargestellt!

Wie geht das?

+1

Sie haben tatsächlich keine Frage gestellt. – chrylis

+0

Also, was ist deine Frage? –

+0

Ich vermute, dass Sie nach einer Richtung suchen, wie Sie Apache NiFi verwenden können, um Standford's NLP zu verwenden (welches dann als Schritt in einem Wbe Service Flow hinzugefügt werden könnte)? Gibt es einen Grund, warum Sie C# verwenden und nicht nur einen NiFi-Prozessor mit den Java-NLP-Bibliotheken schreiben? Sie können alles in der OnSchedule-Methode initialisieren und dann die Strings verarbeiten, wie sie in OnTrigger – JDP10101

Antwort

1

Jeder der von Ihnen aufgelisteten Mechanismen ist ein vollkommen vernünftiger Weg, um diesen Dienst mit Apache NiFi zu nutzen. Je nach Ihren Anforderungen können einige der Prozessoren und Erweiterungen, die mit der Standardversion von NiFi geliefert werden, ausreichend sein, um mit Ihrem vorgeschlagenen Webdienst oder ähnlichen Angeboten zu interagieren.

Wenn Sie sich bemühen, all dies innerhalb NiFi selbst durchzuführen, könnte ein benutzerdefinierter Controller Service ein guter Weg sein, diese Ressource NiFi zur Verfügung zu stellen, die in den Lebenszyklus der Anwendung selbst fällt.

NiFi kann mit Elementen wie Controller-Dienste und benutzerdefinierte Prozessoren erweitert werden und wir haben einige documentation, um Sie in diesen Pfad zu starten.

Weitere Details könnten sicherlich helfen, weitere Informationen zu liefern. Fühlen Sie sich frei, hier mit zusätzlichen Kommentaren weiterzumachen und/oder erreichen Sie die Community über unsere mailing lists.

Ein Element, das ich ausrufen wollte, wenn es unklar war, dass NiFi JVM-getrieben ist und Arbeit in Java oder JVM-freundlichen Sprachen getan werden würde.

+0

das ist wirklich gut. Ich möchte Textparser/Tagger als Dienste haben, an die Nifi Text senden kann, und dann kommt das Tagging. Ohne über die Nifi-Dienste Bescheid zu wissen, habe ich mir überlegt, eine Art von Dienst zu erstellen, der den Code (30sek +) für jeden Thread mehrfach laden, aber nicht laden würde. Es kann einfacher sein, den Nifi-Dienst als einen Web-/Port-Dienst zu erstellen ... Ich habe eine Menge Arbeit vor mir, aber das gibt mir eine greifbare Richtung, anstatt zu raten. Vielen Dank! –

0

Sie sollten sich the new CoreNLP Server ansehen, die Stanford NLP in Version 3.6.0 eingeführt hat. Es scheint, als ob es genau das tut, was du willst. Einige andere Leute wie ETS haben ähnliche Dinge getan.

Feinpunkt: Wenn Sie dies stark verwenden, können Sie (derzeit) den neuesten CoreNLP-Code von github HEAD greifen, da es einige Korrekturen für den Server enthält, die in der nächsten Version sein werden.

+0

Christopher, ich kann deine Antwort nicht stimmen ... Ich habe über den Server geschaut, hätte aber weiterlesen sollen. Ich dachte, dass mein Hauptproblem darin bestünde, ein Java-Programm zu starten, das Eingaben nimmt und Ausgaben ohne Nachladen gibt. Aber es wäre single-threaded (schlecht). Ich werde in den NLP-Server schauen! Vielen Dank! –