NLP4J verwendet die morphologische Analyseverarbeitung des Yahoo! Developer Network im Standard (nlp4j-core).
Textanalyse: Japanische morphologische Analyse - Yahoo! Developer Network https://developer.yahoo.co.jp/webapi/jlp/ma/v1/parse.html
Die API des Yahoo! Developer Network ist praktisch, da sie über HTTP aufgerufen werden kann, aber auch die Schwäche hat, nur eine begrenzte Anzahl von Malen zu haben. Aus diesem Grund habe ich beschlossen, eine Bibliothek zu erstellen, die kuromoji verwendet und lokal verwendet werden kann.
Dieses Mal habe ich nlp4j-kuromoji als Untermodul des nlp4j-Projekts erstellt.
nlp4j-kuromoji https://github.com/oyahiroki/nlp4j/tree/master/nlp4j/nlp4j-kuromoji
Maven hat eine Abhängigkeit hinzugefügt, um Kuromoji zu verwenden.
<!-- https://mvnrepository.com/artifact/com.atilika.kuromoji/kuromoji -->
<dependency>
<groupId>com.atilika.kuromoji</groupId>
<artifactId>kuromoji</artifactId>
<version>0.9.0</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>com.atilika.kuromoji</groupId>
<artifactId>kuromoji-ipadic</artifactId>
<version>0.9.0</version>
</dependency>
Class Diagram
Es sieht so aus wie ein Klassendiagramm. Da die morphologische Analyse-Engine dasselbe tut, handelt es sich um eine Geschwisterbeziehung. Einmal implementiert, werden Sie den Unterschied nicht bemerken, so dass Sie wahrscheinlich nur dieses Mal die Implementierung von Kuromoji kennen werden.
@startuml
nlp4j.DocumentAnnotator <|-- YJpMaAnnotator
nlp4j.DocumentAnnotator <|-- KuromojiAnnotator
@enduml
Code
Es implementiert die von NLP4J bereitgestellte Schnittstelle nlp4j.DocumentAnnotator. Die von kuromoji extrahierten Schlüsselwörter werden den von NLP4J erstellten Schlüsselwörtern zugeordnet.
package nlp4j.krmj.annotator;
import java.util.List;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import com.atilika.kuromoji.ipadic.Token;
import com.atilika.kuromoji.ipadic.Tokenizer;
import nlp4j.AbstractDocumentAnnotator;
import nlp4j.Document;
import nlp4j.DocumentAnnotator;
import nlp4j.impl.DefaultKeyword;
/**
* Kuromoji Annotator
* @author Hiroki Oya
* @since 1.2
*/
public class KuromojiAnnotator extends AbstractDocumentAnnotator implements DocumentAnnotator {
static private final Logger logger = LogManager.getLogger(KuromojiAnnotator.class);
@Override
public void annotate(Document doc) throws Exception {
Tokenizer tokenizer = new Tokenizer(); //Kuromoji-Instanz
for (String target : targets) {
Object obj = doc.getAttribute(target);
if (obj == null || obj instanceof String == false) {
continue;
}
String text = (String) obj;
List<Token> tokens = tokenizer.tokenize(text);
int sequence = 1;
for (Token token : tokens) {
logger.debug(token.getAllFeatures());
DefaultKeyword kwd = new DefaultKeyword(); //Neue Schlüsselwörter
kwd.setLex(token.getBaseForm());
kwd.setStr(token.getSurface());
kwd.setReading(token.getReading());
kwd.setBegin(token.getPosition());
kwd.setEnd(token.getPosition() + token.getSurface().length());
kwd.setFacet(token.getPartOfSpeechLevel1());
kwd.setSequence(sequence);
doc.addKeyword(kwd);
sequence++;
}
}
}
}
Sie können sehen, dass es sogar im selben "Prototyp" Unterschiede zwischen baseForm und lex gibt und dass die Begriffe leicht unterschiedlich sind.
Es ist dasselbe wie das Yahoo! Developer Network, außer dass die Klassenspezifikation von Annotator geändert wird. Sie WRAPing die Verarbeitung natürlicher Sprache von Kuromoji und das Yahoo! Developer Network, die separate Verarbeitung natürlicher Sprache sind.
public void testAnnotateDocument001() throws Exception {
//Natürlicher Text
String text = "Ich ging zur Schule.";
Document doc = new DefaultDocument();
doc.putAttribute("text", text);
KuromojiAnnotator annotator = new KuromojiAnnotator(); //Sie können nur hier ändern und das Modul austauschen
annotator.setProperty("target", "text");
annotator.annotate(doc); // throws Exception
System.err.println("Finished : annotation");
for (Keyword kwd : doc.getKeywords()) {
System.err.println(kwd);
}
}
Das Ergebnis ist wie folgt. Ich konnte es verwenden, ohne die Implementierung der Bibliothek zur Verarbeitung natürlicher Sprache zu kennen.
Finished : annotation
ich[sequence=1, facet=Substantiv, lex=ich, str=ich, reading=ich, count=-1, begin=0, end=1, correlation=0.0]
Ist[sequence=2, facet=Partikel, lex=Ist, str=Ist, reading=C., count=-1, begin=1, end=2, correlation=0.0]
Schule[sequence=3, facet=Substantiv, lex=Schule, str=Schule, reading=Gakkou, count=-1, begin=2, end=4, correlation=0.0]
Zu[sequence=4, facet=Partikel, lex=Zu, str=Zu, reading=D., count=-1, begin=4, end=5, correlation=0.0]
gehen[sequence=5, facet=Verb, lex=gehen, str=Gehen, reading=Iki, count=-1, begin=5, end=7, correlation=0.0]
Masu[sequence=6, facet=Hilfsverb, lex=Masu, str=Besser, reading=Mashi, count=-1, begin=7, end=9, correlation=0.0]
Ta[sequence=7, facet=Hilfsverb, lex=Ta, str=Ta, reading=Ta, count=-1, begin=9, end=10, correlation=0.0]
。 [sequence=8, facet=Symbol, lex=。, str=。, reading=。, count=-1, begin=10, end=11, correlation=0.0]
Mit NLP4J können Sie ganz einfach die Verarbeitung natürlicher Sprache in Java durchführen!
https://www.nlp4j.org/
Recommended Posts