[JAVA] Erstellen Sie einen Annotator, der Kuromoji mit NLP4J verwendet. [007]

Zurück zum Index

Verwenden Sie verschiedene morphologische Analysemodule

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.

Annotator erstellen

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.

SoWkIImgAStDuShBAJ39qdF9JoxDJSqhSSpBooz9BCalKh2fqTLLYFGgy4s4Y-5NwrrQb9-RdvM94EPoICrB0Ta10000.png

@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.

Wie benutzt man

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);
		}
	}

Ergebnis

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]

Zusammenfassung

Mit NLP4J können Sie ganz einfach die Verarbeitung natürlicher Sprache in Java durchführen!

Projekt-URL

https://www.nlp4j.org/ NLP4J_N_128.png


Zurück zum Index

Recommended Posts

Erstellen Sie einen Annotator, der Kuromoji mit NLP4J verwendet. [007]
Erstellen Sie mit JAVA eine unveränderliche Klasse
Erstellen Sie eine App mit Spring Boot 2
Erstellen Sie eine Excel-Datei mit poi
Erstellen Sie eine App mit Spring Boot
Lassen Sie uns eine Instanz mit .new selbst erstellen. .. ..
[Java] Erstellen Sie mit Gradle ein ausführbares Modul
NLP4J Versuchen Sie, Annotator von 100 Sprachverarbeitung mit NLP4J auf # 34 "A B" zu bringen
Probleme und Problemumgehungen, die mit jlink in openjdk eine ungewöhnlich große Laufzeit verursachen
Erstellen Sie eine EC-Site mit Rails5 ⑤ ~ Kundenmodell ~
Erstellen Sie eine EC-Site mit Rails 5 ⑩ ~ Erstellen Sie eine Bestellfunktion ~
Erstellen Sie eine App, die mithilfe der Wetter-API ermittelt, ob Sie einen Regenschirm benötigen.
Erstellen Sie einen HTTPS-Dateiserver für die Entwicklung mit dem Ring-Jetty-Adapter
Erstellen Sie eine EC-Site mit Rails5 Address ~ Adresse, Genre-Modell ~
Erstellen einer EC-Site mit Rails 5 ⑨ ~ Erstellen einer Warenkorbfunktion ~
Erstellen Sie eine EC-Site mit Rails5 ④ ~ Kopf- und Fußzeile ~
Erstellen Sie mit Docker x Cypress eine E2E-Testumgebung
Erstellen Sie eine EC-Site mit Rails5 seed ~ Startdateneingabe ~
Erstellen Sie einen Service mit einem leeren Modell Liferay 7.0 / DXP
Ich habe eine Android-App erstellt, die mit HTTP abgerufen wird