[JAVA] Créer un annotateur qui utilise kuromoji avec NLP4J [007]

Retour à l'index

Utilisez différents modules d'analyse morphologique

NLP4J utilise le traitement d'analyse morphologique du Yahoo! Developer Network dans le standard (nlp4j-core).

Analyse de texte: analyse morphologique japonaise - Réseau de développeurs Yahoo! https://developer.yahoo.co.jp/webapi/jlp/ma/v1/parse.html

L'API du Yahoo! Developer Network est pratique car elle peut être appelée par HTTP, mais elle a aussi la faiblesse d'avoir un nombre limité de fois. Par conséquent, j'ai décidé de créer une bibliothèque qui utilise kuromoji qui peut être utilisée localement.

Créer un annotateur

Cette fois, j'ai créé nlp4j-kuromoji en tant que sous-module du projet nlp4j.

nlp4j-kuromoji https://github.com/oyahiroki/nlp4j/tree/master/nlp4j/nlp4j-kuromoji

Maven a ajouté une dépendance pour utiliser kuromoji.

<!-- 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

Cela ressemble à un diagramme de classes. Puisque le moteur d'analyse morphologique fait la même chose, il s'agit d'une relation fraternelle. Une fois implémenté, vous ne serez pas au courant de la différence, donc vous ne serez probablement au courant de l'implémentation de kuromoji que cette fois.

SoWkIImgAStDuShBAJ39qdF9JoxDJSqhSSpBooz9BCalKh2fqTLLYFGgy4s4Y-5NwrrQb9-RdvM94EPoICrB0Ta10000.png

@startuml
nlp4j.DocumentAnnotator <|-- YJpMaAnnotator
nlp4j.DocumentAnnotator <|-- KuromojiAnnotator 
@enduml

Code

Il implémente l'interface nlp4j.DocumentAnnotator fournie par NLP4J. Les mots-clés extraits par kuromoji sont mappés aux mots-clés préparés par NLP4J.


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(); //instance de kuromoji
		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(); //Nouveaux mots clés
				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++;
			}
		}
	}
}

Vous pouvez voir qu'il existe des différences entre baseForm et lex même dans le même "prototype", et que les termes sont légèrement différents.

Comment utiliser

C'est la même chose que Yahoo! Developer Network, sauf que la spécification de classe d'Annotator est modifiée. Vous encapsulez le traitement du langage naturel de kuromoji et le Yahoo! Developer Network, qui sont un traitement distinct du langage naturel.

	public void testAnnotateDocument001() throws Exception {
		//Texte naturel
		String text = "Je suis allé à l'école.";
		Document doc = new DefaultDocument();
		doc.putAttribute("text", text);
		KuromojiAnnotator annotator = new KuromojiAnnotator(); //Vous ne pouvez changer qu'ici et remplacer le module
		annotator.setProperty("target", "text");
		annotator.annotate(doc); // throws Exception
		System.err.println("Finished : annotation");
		for (Keyword kwd : doc.getKeywords()) {
			System.err.println(kwd);
		}
	}

résultat

Le résultat est le suivant. J'ai pu l'utiliser sans être au courant de l'implémentation de la bibliothèque de traitement du langage naturel.

Finished : annotation
je[sequence=1, facet=nom, lex=je, str=je, reading=je, count=-1, begin=0, end=1, correlation=0.0]
Est[sequence=2, facet=Particule, lex=Est, str=Est, reading=C, count=-1, begin=1, end=2, correlation=0.0]
école[sequence=3, facet=nom, lex=école, str=école, reading=Gakkou, count=-1, begin=2, end=4, correlation=0.0]
À[sequence=4, facet=Particule, lex=À, str=À, reading=ré, count=-1, begin=4, end=5, correlation=0.0]
aller[sequence=5, facet=verbe, lex=aller, str=Aller, reading=Iki, count=-1, begin=5, end=7, correlation=0.0]
Masu[sequence=6, facet=Verbe auxiliaire, lex=Masu, str=Mieux, reading=Mashi, count=-1, begin=7, end=9, correlation=0.0]
Ta[sequence=7, facet=Verbe auxiliaire, lex=Ta, str=Ta, reading=Ta, count=-1, begin=9, end=10, correlation=0.0]
。 [sequence=8, facet=symbole, lex=。, str=。, reading=。, count=-1, begin=10, end=11, correlation=0.0]

Résumé

Avec NLP4J, vous pouvez facilement effectuer le traitement du langage naturel en Java!

URL du projet

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


Retour à l'index

Recommended Posts

Créer un annotateur qui utilise kuromoji avec NLP4J [007]
Créer une classe immuable avec JAVA
Créez une application avec Spring Boot 2
Créer un fichier Excel avec POI
Créez une application avec Spring Boot
Créons vous-même une instance avec .new. .. ..
[Java] Créer un module exécutable avec Gradle
NLP4J [006-034b] Essayez de faire en sorte que l'annotateur de 100 traitements de langage frappe # 34 "A B" avec NLP4J
Problèmes et solutions de contournement qui créent un runtime anormalement volumineux avec jlink dans openjdk
Créer un site EC avec Rails5 ⑤ ~ Modèle client ~
Créer un site EC avec Rails 5 ⑩ ~ Créer une fonction de commande ~
Créez une application qui utilise l'API météo pour déterminer si vous avez besoin d'un parapluie.
Créez un serveur de fichiers HTTPS pour le développement avec ring-jetty-adapter
Créer un site EC avec Rails5 ⑦ ~ Adresse, modèle de genre ~
Créer un site EC avec Rails 5 ⑨ ~ Créer une fonction de panier ~
Créer un site EC avec Rails5 ④ ~ En-tête et pied de page ~
Créer un environnement de test E2E avec Docker x Cypress
Créez un site EC avec Rails5 ⑥ ~ entrée de données de départ ~
Créer un service avec un modèle vide Liferay 7.0 / DXP
J'ai créé une application Android qui GET avec HTTP