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.
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.
@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.
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);
}
}
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]
Avec NLP4J, vous pouvez facilement effectuer le traitement du langage naturel en Java!
https://www.nlp4j.org/
Recommended Posts