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?
Sie haben tatsächlich keine Frage gestellt. – chrylis
Also, was ist deine Frage? –
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