Analyse morphologique en Java avec Kuromoji

À propos de cette page

Faisons une analyse morphologique en Java. Considérant que ce sera un prérequis dans divers autres articles, je résumerai jusqu'à la vérification du fonctionnement.

Qu'est-ce que l'analyse morphologique?

Il fait référence au processus de division d'un document en les plus petites unités significatives telles que les mots. C'est l'une des techniques les plus couramment utilisées pour amener les machines à traiter le langage.

Il existe de nombreux autres termes dans cet article, Tout d'abord, le contrôle de fonctionnement est décrit, et chaque terme est mentionné en annexe.

Politique de développement

La politique est d'ajouter la bibliothèque Kuromoji au-dessus de Spring Boot & Gradle. Si vous êtes de la construction de l'environnement, veuillez vous référer à ce qui suit. ⇒ Introduction à Spring Boot ... C'est bien, alors j'en suis sûr!

environnement un service/version
Environnement d'exécution Windows10
Environnement de développement eclipse Oxygen.2 Release (4.7.2)Version Java
langage de développement Java 8
Framework SpringBoot 2.1.3

Bienvenue Kuromoji dans le projet

La bibliothèque de Kuromoji semble se trouver à Maven Central, Cette fois, j'ai décidé de le récupérer dans les codelibs.

Ajouté aux référentiels et aux dépendances comme suit. Effectuez ensuite une actualisation de Gralde pour mettre à jour les dépendances.

build.gralde


plugins {
	id 'org.springframework.boot' version '2.1.3.RELEASE'
	id 'java'
}

apply plugin: 'io.spring.dependency-management'

group = 'com.lab.app.ketman'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
	mavenCentral()
	//ajouter à
	maven {
        url "http://maven.codelibs.org"
    }
    //Jusque là
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.0.0'

	//ajouter à
	implementation 'org.codelibs:lucene-analyzers-kuromoji-ipadic-neologd:7.6.0-20190325'
	//Jusque là

	runtimeOnly 'org.springframework.boot:spring-boot-devtools'
	runtimeOnly 'org.postgresql:postgresql'

	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

Essayez de sortir sur la console pour le moment

Le résultat de l'analyse est stocké dans l'objet Attribute. Obtenez les informations souhaitées en les déclarant comme une variable.

Attribute Aperçu
CharTermAttribute Représentation de la phrase analysée telle quelle
ReadingAttribute Lecture de la morphologie
OffsetAttribute De quel caractère l'élément morphologique apparaît-il
PartOfSpeechAttribute Informations sur les paroles des parties
BaseFormAttribute prototype
InflectionAttribute Utilisation

KuromojiSample


public class KuromojiSample {
	//Renvoie une liste d'entités Kuromoji en retour
	public List<KuromojiEntity> kuromojineologd(String src){
		List<KuromojiEntity> keList = new ArrayList<KuromojiEntity>();
		try(JapaneseTokenizer jt =
				new JapaneseTokenizer(null, false, JapaneseTokenizer.Mode.NORMAL)){
			jt.setReader(new StringReader(src));
			jt.reset();
			while(jt.incrementToken()){

				CharTermAttribute ct = jt.addAttribute(CharTermAttribute.class);
				ReadingAttribute ra = jt.addAttribute(ReadingAttribute.class);
				OffsetAttribute oa = jt.addAttribute(OffsetAttribute.class);
				PartOfSpeechAttribute posa = jt.addAttribute(PartOfSpeechAttribute.class);
				BaseFormAttribute bfa = jt.addAttribute(BaseFormAttribute.class);
				InflectionAttribute ifa = jt.addAttribute(InflectionAttribute.class);

				System.out.println(
						ct.toString()
						+ " | " + ra.getReading()
						+ " | " + oa.startOffset()
						+ " | " + posa.getPartOfSpeech()
						+ " | " + bfa.getBaseForm()
						+ " | " + ifa.getInflectionForm()
						+ " | " + ifa.getInflectionType());
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return keList;
	}
}

KuromojiSample


@Controller
public class SampleKuromojiController {
	KuromojiSample ks = new KuromojiSample();

	@RequestMapping("/kuromoji")
	public String index(Model model) {
		String sentence = "neologd peut interpréter Yuru-chara comme une nomenclature appropriée.";
		ks.kuromojineologd(sentence);
		return "index";
	}
}

résultat

Le dictionnaire de neologd semble être divisé ainsi. Il est caractéristique que la lecture inclue Jiccouiinkai.

neologd |Neologdy| 0 |nom-Nom propre-Général| NEologd | null | null
Tu|Kun| 7 |nom-suffixe-Nom d'une personne| null | null | null
Est|C| 8 |Particule-Assistance| null | null | null
Yuru Chara|Grand Prix Yuru Chara Jiccoui Inkai| 9 |nom-Nom propre-Nom d'une personne-Général| null | null | null
À|Wo| 14 |Particule-Assistant de cas-Général| null | null | null
Nom propre|Koyu Meishi| 15 |nom-Général| null | null | null
Comme|Toshite| 19 |Particule-Assistant de cas-Langage commun| null | null | null
Interprétation|Kaishaku| 22 |nom-Changer de connexion| null | null | null
Fini|Deki| 24 |verbe-Indépendance|Peut faire|Type continu|Un pas
Masu|truite| 26 |Verbe auxiliaire| null |Forme basique|Spécial / masse
。 | 。 | 28 |symbole-Phrase| null | null | null

appendice

① Qu'est-ce que Lucene Analyzer?

Extrait de 1. Overview of Lucene

Lucene est un moteur de recherche en texte intégral de type indexation 100% PureJava développé par Jakarta Project 1. (Un index est un index attaché pour une recherche rapide.) Lucene lui-même est une bibliothèque, pas un programme complet, En utilisant l'API fournie par Lucene, vous pouvez facilement créer un programme de recherche en texte intégral facile à utiliser. De plus, comme il est écrit en Java, il peut être facilement adapté aux applications Web. Lucene lui-même ne peut pas analyser le japonais, mais il est possible de rechercher du japonais en utilisant un programme d'analyse morphologique.

② Qu'est-ce que ipadic-neologd?

La maintenance des informations (dictionnaire) données aux machines dans le langage naturel évolutif jour et nuit est l'un des problèmes. L'idée est de résoudre ce problème en rampant sur le Web. Extrait de neologd / mecab-ipadic-neologd

mecab-ipadic-NEologd est un dictionnaire système pour MeCab personnalisé en ajoutant de nouveaux mots dérivés de nombreuses ressources linguistiques Web. Lors de l'analyse de documents sur le Web, il est recommandé d'utiliser ce dictionnaire avec le dictionnaire système standard (ipadic). (Omis) Avantages Environ 3,12 millions de paires (y compris les entrées en double) de la couche de surface (notation) et des paires de mots frigana telles que des expressions uniques qui ne peuvent pas être correctement divisées par le dictionnaire système standard de MeCab sont enregistrées. Ce dictionnaire est mis à jour automatiquement sur le serveur de développement Sera mis à jour au moins deux fois par semaine Lundi et jeudi En utilisant les ressources linguistiques sur le Web, de nouvelles expressions uniques peuvent être enregistrées au moment de la mise à jour Les ressources actuellement utilisées sont: ・ Vider les données du mot-clé Hatena ・ Télécharger les données du code postal … (Omis) Inconvénients Classification insuffisante des expressions appropriées Par exemple, certains noms de personnes et noms de produits sont classés dans la même catégorie d'expression unique. Les mots qui ne sont pas des expressions uniques sont également enregistrés en tant qu'expressions uniques …

③ À propos de la définition de la politique d'analyse

Dans l'exemple de code, l'argument (JapaneseTokenizer.Mode.NORMAL) a été donné, Il existe également des modes de recherche et d'extension, chacun avec les fonctionnalités suivantes.

Extrait de About Kuromoji

Mode normal Après avoir initialisé le mode normal, l'analyse morphologique est effectuée dans ce format par défaut.

Mode de recherche Un mot qui combine plusieurs mots tels que "Nihon Keizai Shimbun" est appelé "Japon"|Économie|Il analyse séparément comme un journal. Lorsqu'il est utilisé en combinaison avec un moteur de recherche plein texte, il est pratique car le Nihon Keizai Shimbun peut également être recherché par "économie" ou "journal".

Étend le mode En plus du mode Recherche, traitez les mots inconnus comme un uni-gramme. Par exemple, "mobage" est "mo"|Ba|Ge|- "Est divisé en chaque caractère. Une fonction qui semble réduire le risque de ne pas rechercher des mots inconnus.

④ Grammaire supplémentaire à Gradle

Si vous voulez l'obtenir auprès de Maven Central, vous devez le faire comme ceci. [Home » com.atilika.kuromoji » kuromoji-ipadic » 0.9.0] (https://mvnrepository.com/artifact/com.atilika.kuromoji/kuromoji-ipadic/0.9.0)

// https://mvnrepository.com/artifact/com.atilika.kuromoji/kuromoji-ipadic
compile group: 'com.atilika.kuromoji', name: 'kuromoji-ipadic', version: '0.9.0'

Recommended Posts

Analyse morphologique en Java avec Kuromoji
NLP4J [001b] Analyse morphologique en Java (utilisant kuromoji)
Analyse de code statique par Checkstyle avec Java + Gradle
Analyse de sujets (LDA) en Java
Utiliser l'analyse morphologique japonaise "kuromoji"
Agrégation et analyse de journaux (utilisation d'AWS Athena en Java)
J'ai essayé l'analyse morphologique avec MeCab
Faire une analyse de phrase en Java 8 (partie 2)
1 Implémentez une analyse de phrase simple en Java
Tweak Markdown avec Java flexmark-java
Création d'une analyse de phrase dans Java 8 (partie 1)
NLP4J [001a] Analyse morphologique avec Java (utilisant l'analyse morphologique japonaise de Yahoo! Developer Network)
Analyse morphologique anglaise comme MeCab avec OpenNLP
Méthode de concurrence en Java avec exemple de base
[Java] Jugement de spam utilisant l'analyse morphologique "lucene-gosen"
Analyse morphologique chinoise comme Mecab avec FNLP
Lire le fichier xlsx en Java avec Selenium
Diviser une chaîne avec ". (Dot)" en Java
Gérez d'énormes JSON avec Java Lambda
Partition en Java
Changements dans Java 11
Janken à Java
Taux circonférentiel à Java
FizzBuzz en Java
Lire une chaîne dans un fichier PDF avec Java
Créer un CSR avec des informations étendues en Java
Outil GUI refactorisé réalisé avec Java8 + JavaFX en 2016
Extraction de texte en Java à partir de PDF avec pdfbox-2.0.8
Entraînez-vous à travailler avec des paires de substitution Unicode en Java
[JAVA] [Spring] [MyBatis] Utiliser IN () avec SQL Builder
Crypter / décrypter avec AES256 en PHP et Java
Programmation utilisant le type de somme directe en Java (news)
S'entendre avec les conteneurs Java dans Cloud Run
Installez java avec Homebrew
Lire JSON en Java
Implémentation de l'interpréteur par Java
Faites un blackjack avec Java
Application Janken en Java
Programmation par contraintes en Java
Mettez java8 dans centos7
NVL-ish guy en Java
Joindre des tableaux en Java
"Hello World" en Java
Interface appelable en Java
Changer de siège avec Java
Installez Java avec Ansible
Commentaires dans la source Java
Inclure l'image dans le fichier jar avec la méthode statique java
Fonctions Azure en Java
Téléchargement confortable avec JAVA
Formater XML en Java
Simple htmlspecialchars en Java
Implémentation Boyer-Moore en Java
Hello World en Java
Changer java avec direnv
Utiliser OpenCV avec Java
Mémorandum WebApi avec Java
Détermination de type en Java
Implémentez rapidement singleton avec enum en Java
Résolution du problème lorsque Azure Functions a cessé de fonctionner en Java