Ich hatte das gleiche Problem, also habe ich auch nachgesehen. Die von Christopher Manning vorgeschlagene Methode ist effizient, aber der heikle Punkt ist zu wissen, wie man entscheidet, welche Art von Separator geeignet ist. Man könnte sagen, dass nur ein Raum erlaubt sein sollte, z. "John Zorn" >> eine Einheit. Ich kann jedoch das Formular "J.Zorn" finden, daher sollte ich auch bestimmte Satzzeichen zulassen. Aber was ist mit "Jack, James und Joe"? Ich könnte 2 Einheiten anstelle von 3 bekommen ("Jack James" und "Joe").
Durch ein wenig in den Stanford NER-Klassen zu graben, fand ich tatsächlich eine ordnungsgemäße Umsetzung dieser Idee. Sie verwenden es, um Objekte in Form von einzelnen String
Objekten zu exportieren. Zum Beispiel wird in dem Verfahren PlainTextDocumentReaderAndWriter.printAnswersTokenizedInlineXML
, haben wir:
private void printAnswersInlineXML(List<IN> doc, PrintWriter out) {
final String background = flags.backgroundSymbol;
String prevTag = background;
for (Iterator<IN> wordIter = doc.iterator(); wordIter.hasNext();) {
IN wi = wordIter.next();
String tag = StringUtils.getNotNullString(wi.get(AnswerAnnotation.class));
String before = StringUtils.getNotNullString(wi.get(BeforeAnnotation.class));
String current = StringUtils.getNotNullString(wi.get(CoreAnnotations.OriginalTextAnnotation.class));
if (!tag.equals(prevTag)) {
if (!prevTag.equals(background) && !tag.equals(background)) {
out.print("</");
out.print(prevTag);
out.print('>');
out.print(before);
out.print('<');
out.print(tag);
out.print('>');
} else if (!prevTag.equals(background)) {
out.print("</");
out.print(prevTag);
out.print('>');
out.print(before);
} else if (!tag.equals(background)) {
out.print(before);
out.print('<');
out.print(tag);
out.print('>');
}
} else {
out.print(before);
}
out.print(current);
String afterWS = StringUtils.getNotNullString(wi.get(AfterAnnotation.class));
if (!tag.equals(background) && !wordIter.hasNext()) {
out.print("</");
out.print(tag);
out.print('>');
prevTag = background;
} else {
prevTag = tag;
}
out.print(afterWS);
}
}
Sie iterieren jedem Wort, zu überprüfen, ob es die gleiche Klasse (Antwort) als die vorherige hat, wie zuvor erläutert. Dabei nutzen sie die Tatsache aus, dass Ausdrücke, die als Nicht-Entitäten betrachtet werden, mit der sogenannten backgroundSymbol
(Klasse "O") gekennzeichnet werden. Sie verwenden auch die Eigenschaft BeforeAnnotation
, die die Zeichenfolge darstellt, die das aktuelle Wort vom vorherigen trennt.Dieser letzte Punkt ermöglicht die Lösung des Problems, das ich eingangs angesprochen habe, was die Wahl eines geeigneten Separators betrifft.
Gibt es irgendwelche Neuigkeiten ab 2016 in Bezug auf 'IOB' Modelle in' CRFClassifier'? –
2017. Suche noch nach 'IOB' Modellen in' CRFClassifier'. – NightFury13
Gibt es eine ID, die wir für mehrere Entitäten verwenden können, um zu wissen, dass es sich um dieselbe Entität handelt? –