Python: texte japonais: analyse morphologique

Traitement du langage et corpus de texte

Qu'est-ce que le traitement du langage naturel?

Les mots que nous parlons habituellement, les phrases que nous écrivons, etc.

Dites "langage naturel"

Technologie pour faire un langage naturel de processus informatique

Traitement du langage naturel(Natural Language Processing, NLP)Est appelé.

Le traitement du langage naturel se compose de technologies élémentaires telles que l'analyse morphologique, l'analyse syntaxique et l'analyse sémantique. En combinant ces technologies élémentaires, elles sont utilisées dans diverses situations telles que la traduction automatique, la reconnaissance vocale et la recherche d'informations.

Le langage naturel a été créé à l'origine pour permettre aux humains de communiquer entre eux. Les humains peuvent interpréter et communiquer avec des mots contenant des expressions ambiguës. Cependant, parce que les ordinateurs sont bons pour traiter les données avec précision et à grande vitesse.

Je ne suis pas doué pour gérer les langages naturels qui contiennent des éléments ambigus.

À titre d'exemple de traitement du langage naturel, pensez à classer les documents d'information japonais en catégories. En supposant qu'un document contient environ 100 mots, si la quantité du document est d'environ 10, il peut être classé manuellement par les humains. Cependant, si vous avez environ 1 000 documents, vous voudrez laisser l'ordinateur faire le travail.

Alors, comment gérez-vous le langage naturel sur votre ordinateur?

Tout ce que vous avez à faire est de convertir le langage naturel en une forme facile à traiter par l'ordinateur, c'est-à-dire une valeur numérique.

Le langage naturel est un ensemble de mots. Si les mots peuvent être convertis en données numériques "d'une manière ou d'une autre" L'analyse est possible avec l'apprentissage automatique et les algorithmes d'apprentissage en profondeur.

Dans cet article, je vais convertir le langage naturel en données numériques Apprenez à extraire des sujets à l'aide d'algorithmes d'apprentissage automatique.

Dialogue de chat Corpus

Un corpus est une collection d'un grand nombre de documents en langage naturel.

Parce que le langage naturel est un moyen de communication humaine Non limité au japonais, il existe uniquement des types de langues telles que l'anglais et l'allemand.

Il est difficile de tout présenter, nous allons donc vous présenter ici le corpus japonais que nous connaissons bien. De nombreux corpus japonais sont fournis, y compris payants et gratuits.

Les résultats peuvent être utilisés pour la classification des documents et l'extraction de sujets.

Aozora Bunko
Corpus d'équilibre de mot écrit japonais moderne(BCCWJ)
Dialogue de chat Corpus
Corpus de conversation Meidai(Corpus de transcription de conversation naturelle japonaise)
Corpus de langue japonaise parlée(CSJ)
corpus de nouvelles

Ces corpus sont fournis dans divers formats de fichiers tels que le format CSV, le format JSON et le format XML. Surtout parce que le format JSON et le format XML ont une structure hiérarchique. Nous vous recommandons de retirer les données nécessaires, de les convertir en fichier CSV, puis de les utiliser.

Maintenant, extrayons les données à l'aide de la bibliothèque json de Python. Pour extraire des données, spécifiez le nom de la variable dans laquelle les données sont stockées et la clé des données que vous souhaitez récupérer.

#Lire le fichier en mode lecture seule
f = open("./6110_nlp_preprocessing_data/init100/1407219916.log.json",
         "r", encoding='utf-8')
json_data = json.load(f)

# `json_data`comprendre'ID de conversation ('dialogue-id')'Variable`dialogue`Accéder à
dialogue = json_data["dialogue-id"]
print(dialogue)
# >>>Résultat de sortie
1407219916

Cliquez ici pour les résultats d'utilisation

import json

#Lire le fichier en mode lecture seule
f = open("./6110_nlp_preprocessing_data/init100/1407219916.log.json",
         "r", encoding='utf-8')
json_data = json.load(f)

#Obtenir l'identifiant de la conversation
print("dialogue-id : " + json_data["dialogue-id"])

#Obtenir l'identifiant du haut-parleur
print("speaker-id  : " + json_data["speaker-id"])

#Obtenez l'orateur et le contenu du discours
for turn in json_data["turns"]:
    #La clé de l'orateur est"speaker", La clé du contenu de l'énoncé est"utterance"est
    print(turn["speaker"] + ":" + turn["utterance"])

image.png

Le corpus utilisé ici est le suivant.

Corpus

Dialogue de chat Corpus Données destinées à l'analyse conjointe des erreurs du système de dialogue, étiquetées pour toutes les conversations homme-système (chat) et les réponses du système.

Structure du répertoire

Les données téléchargées sont divisées en répertoires init100 et rest1046. Init100 contient 100 ensembles de données de discussion et rest1046 contient 1 046 ensembles de données de discussion. Utilisez les données du répertoire init100 qu'il contient.

Structure des fichiers

Le fichier de données est fourni au format JSON et est grossièrement divisé en données de parole humaine (question) et données de parole système (réponse). Un fichier est une donnée de dialogue.

Structure de données

Les données d'énonciation sont exprimées en phrases japonaises et se trouvent dans le fichier. Il est stocké dans la clé «tours». «énoncé» est une donnée parlée «haut-parleur» «U» est la personne et «S» est le système.

De plus, les données vocales du système incluent des réponses système aux questions humaines. C'est un drapeau (étiquette) indiquant s'il est cassé ou non. Il a une "ventilation" et un commentaire "commentaire".

Le drapeau est O Parler ce n'est pas un échec, On ne peut pas dire que T est un échec, mais c'est un discours étrange. X Il existe trois types d'énoncés qui semblent clairement étranges.

Puisque 'breakdown' est attaché par plusieurs annotateurs ('annotator-id'). Il existe plusieurs «pannes» pour une réponse système.

Une partie du corpus est présentée ci-dessous.

{
  'dialogue-id': '1407219916',
  'group-id': 'init100',
  'speaker-id': '12_08',
  'turns': [
    {
      'annotations': [
        {
          'annotator-id': '01_A',
          'breakdown': 'O',
          'comment': '',
          'ungrammatical-sentence': 'O'
        },
        {
          'annotator-id': '01_B',
          'breakdown': 'O',
          'comment': '',
          'ungrammatical-sentence': 'O'
        },
        ...
        {
          'annotator-id': '15_A',
          'breakdown': 'T',
          'comment': 'Les chiffres sont complètement différents',
          'ungrammatical-sentence': 'O'
        }
      ],
      'speaker': 'S',
      'time': '2014-08-05 15:23:07',
      'turn-index': 2,
      'utterance': 'La température maximale devrait-elle être de 17 degrés? ??'
    },
    {
      'annotations': [],
      'speaker': 'U',
      'time': '2014-08-05 15:23:15',
      'turn-index': 3,
      'utterance': 'Non, il fait extrêmement chaud'
    },
    ...
}

Extraction de données analytiques

Nous analyserons quantitativement les énoncés qui ne risquent pas de s'effondrer. Les exemples de données à analyser sont inclus dans 10 fichiers dans le répertoire init100. Utilise un indicateur pour indiquer si le discours d'une personne et le discours du système à lui sont interrompus.

Une fois que vous avez les données dont vous avez besoin pour votre analyse, supprimez d'abord toutes les données indésirables en double.

Supprimer les données en double Pour supprimer une ligne contenant des éléments en double

Pandas tombent_duplicates()Utilisez la méthode.
from pandas import DataFrame

#DataFrame avec numéro d'index en double 0 et numéro d'index 2
df=DataFrame([['AA','Camela',150000,20000],
              ['BB','Camera',70000,10000],
              ['AA','Camela',150000,20000],
              ['AA','Video',3000,150]],
              columns=['CUSTOMER','PRODUCT','PRICE','DISCOUNT'])
df
# >>>Résultat de sortie
    CUSTOMER      PRODUCT        PRICE    DISCOUNT
0       AA          Camela       150000    20000
1       BB          Camera        70000    10000
2       AA          Camela       150000    20000 
3       AA          Video         3000      150
#Supprimer les lignes contenant des doublons
drop = df.drop_duplicates()
drop
# >>>Résultat de sortie
    CUSTOMER     PRODUCT      PRICE        DISCOUNT
0       AA          Camela      150000      20000
1       BB          Camera       70000      10000
3       AA          Video        3000        150

Cliquez ici pour des exemples d'utilisation

import os
import json
import pandas as pd

#spécifier le répertoire init100
file_path = './6110_nlp_preprocessing_data/init100/'
file_dir = os.listdir(file_path)

#Créez une liste vide pour stocker les indicateurs et les énoncés
label_text = []

#Traitez 10 fichiers JSON un par un
for file in file_dir[:10]:
    #Lecture en mode lecture seule
    r = open(file_path + file, 'r', encoding='utf-8')
    json_data = json.load(r)

    #Tableau de données vocales`turns`Extraire le contenu de l'énoncé et les indicateurs de
    for turn in json_data['turns']:
        turn_index = turn['turn-index'] #Parler tour non
        speaker = turn['speaker'] #ID de l'orateur
        utterance = turn['utterance'] #Contenu du discours
        #Excluez la première ligne car il s'agit d'un énoncé système
        if turn_index != 0:
            #Extraire le contenu du discours d'une personne
            if speaker == 'U':
                u_text = ''
                u_text = utterance
            else:
                a = ''
                for annotate in turn['annotations']:
                    #Extraire le drapeau d'échec
                    a = annotate['breakdown']
                    #Stockez les drapeaux et la parole humaine dans une liste
                    tmp1 = str(a) + '\t' + u_text
                    tmp2 = tmp1.split('\t')
                    label_text.append(tmp2)

#liste`label_text`Vers DataFrame
df_label_text = pd.DataFrame(label_text)

#Supprimer les lignes en double
df_label_text = df_label_text.drop_duplicates()
df_label_text.head(25)

image.png

Analyse morphologique du texte

Qu'est-ce que l'analyse morphologique?

Une des méthodes de traitement du langage naturel

Analyse morphologique(Morphological Analysis)Sera soulevé.

L'analyse morphologique divise une phrase en mots en fonction des règles de grammaire et des données du dictionnaire d'analyse. C'est un processus pour donner un mot partiel à chacun.

Une «morphologie» est la plus petite unité ou mot qui a un sens dans la langue. Ici, nous allons nous intéresser à l'analyse morphologique japonaise.

[Texte] Ça ira bien aujourd'hui.
  ↓
[Élément de formulaire] Aujourd'hui|Est|Ensoleillé|Masu| 。
     (nom)(Particule)(verbe)(助verbe)(symbole)

Les éléments morphologiques sont séparés par "|" pour une compréhension facile. S'il s'agit d'une phrase courte comme l'exemple, il est possible de diviser manuellement la phrase en mots. Les phrases contenues dans les documents effectivement traités étant de longues phrases, il est réaliste de les traiter sur ordinateur.

Il existe un outil appelé moteur d'analyse morphologique qui effectue une analyse morphologique sur un ordinateur. Le moteur d'analyse morphologique est installé et exécuté Ce que l'on peut appeler une API Web Des choses qui peuvent être appelées comme une bibliothèque de langages de programmation, etc. Il est offert sous diverses formes, y compris payant / gratuit. La principale différence entre eux est la grammaire et les dictionnaires utilisés pour l'analyse morphologique.

ChaSen: Développé et fourni par le laboratoire Matsumoto, Nara Advanced Science and Technology Graduate University.
JUMAN: Développé et fourni par le laboratoire Kurohashi / Kawahara, Université de Kyoto.
MeCab: Développé et fourni en open source par M. Taku Kudo.
Janome: Développé par Tomoko Uchida et fourni sous forme de bibliothèque Python.
Rosette Base Linguistics: Développé et fourni par Basis Technology (payant).

Analyse morphologique et segmentation à l'aide de MeCab

Essayons l'analyse morphologique et la division de texte japonais à l'aide du moteur d'analyse morphologique MeCab.

Analyse morphologique
①Tagger()À l'aide d'un objet, spécifiez le dictionnaire utilisé pour diviser la morphologie dans le mode de sortie de l'argument.
(2) Si rien n'est spécifié, le dictionnaire système standard de MeCab est utilisé.
③parse('Chaîne')で指定したChaîneを形態素に分割し、品詞などを付与した形態素解析結果を取得します。
import MeCab

k = MeCab.Tagger()
print(k.parse('Mots que vous souhaitez analyser morphologiquement'))
Résultat de sortie
Nomenclature morphologique,Général,*,*,*,*,morphème,Keitaiso,Keitaiso
Nom analytique,Changer de connexion,*,*,*,*,une analyse,Kaiseki,Kaiseki
Verbe shi,Indépendance,*,*,Sahen / Suru,Type continu,Faire,Shi,Shi
Verbe assistant Tai,*,*,*,Spécial Thaïlande,Forme basique,Vouloir,Thaïlande,Thaïlande
Nomenclature des mots,Général,*,*,*,*,mot,Kotoba,Kotoba
EOS

Les résultats de l'analyse morphologique de sortie sont les suivants dans l'ordre à partir de la gauche. La notation entre parenthèses est le nom de l'attribut lors de l'acquisition des informations de chaque attribut.

Surface (mots utilisés dans le texte)
Partie_of_speech)
Sous-catégorie 1-3 (partie_of_speech)
Type d'utilisation (infl_type)
Formulaire d'utilisation (infl_form)
Prototype (base)_form) (la forme originale du mot utilisé dans la phrase)
En train de lire
Prononciation (phonétique)

Partage Si vous spécifiez ('-Owakati') comme mode de sortie de l'objet Tagger () Il est possible d'effectuer uniquement l'écriture de division avec un blanc de délimitation pour chaque élément morphologique sans ajouter de mots de partie.

import MeCab

k = MeCab.Tagger('-Owakati')
print(k.parse('Les mots que vous souhaitez partager'))
>>>Résultat de sortie
Les mots que vous souhaitez partager
Autres modes de sortie
-Oyomi :Sortie en lecture seule
-Ochasen :Format compatible ChaSen
-Odump :Sortie de toutes les informations

Cliquez ici pour des exemples d'utilisation

import MeCab

#Analyse morphologique
m = MeCab.Tagger()
print(m.parse('Des cuisses et des cuisses'))

#Partage
w = MeCab.Tagger('-Owakati')
print(w.parse('Des cuisses et des cuisses'))

image.png

Analyse morphologique et segmentation avec Janome

Ensuite, nous utiliserons le moteur d'analyse morphologique Janome pour effectuer une analyse morphologique et une division de texte japonais.

Analyse morphologique
①Tokenizer()Créer un objet et tokenize()Spécifiez la chaîne de caractères que vous souhaitez analyser morphologiquement dans la méthode.
(2) Comment lire le résultat de sortie de l'analyse morphologique est le même que MeCab.
from janome.tokenizer import Tokenizer

#Créer un objet Tokenizer
t = Tokenizer()
tokens = t.tokenize("Mots que vous souhaitez analyser morphologiquement")
for token in tokens:
    print(token)
>>>Résultat de sortie
Nomenclature morphologique,Général,*,*,*,*,morphème,Keitaiso,Keitaiso
Nom analytique,Changer de connexion,*,*,*,*,une analyse,Kaiseki,Kaiseki
Verbe shi,Indépendance,*,*,Sahen / Suru,Type continu,Faire,Shi,Shi
Verbe assistant Tai,*,*,*,Spécial Thaïlande,Forme basique,Vouloir,Thaïlande,Thaïlande
Nomenclature des mots,Général,*,*,*,*,mot,Kotoba,Kotoba

Partage Si wakati = True est spécifié dans l'argument de la méthode tokenize (), seule la division est effectuée.

from janome.tokenizer import Tokenizer

#Créer un objet Tokenizer
t = Tokenizer()
tokens = t.tokenize("Les mots que vous souhaitez partager", wakati=True)
for token in tokens:
    print(token)
>>>Résultat de sortie
Partage
Shi
Vouloir
mot

Autres fonctions

① Vous pouvez filtrer par partie.

Si vous souhaitez l'exclure, spécifiez la partie du mot que vous souhaitez exclure.
POSStopFilter(['conjonction', 'symbole', 'Particule', 'Verbe auxiliaire'])

Si vous souhaitez l'obtenir, spécifiez la partie du mot que vous souhaitez obtenir.
POSKeepFilter(['nom'])

(2) Analyzer est un cadre permettant de créer des modèles pour le prétraitement et le post-traitement de l'analyse morphologique. Passer un analyseur (prétraitement, objet Tokenizer, filtre). Réglez la partie de prétraitement comme suit.

char_filters = [UnicodeNormalizeCharFilter(), 
                  RegexReplaceCharFilter('Expressions régulières', 'Caractères que vous souhaitez convertir')]
UnicodeNormalizeCharFilter()
Normalise les fluctuations de notation dans les chaînes Unicode.
L'argument est"NFKC"、"NFC"、"NFKD"、"NFD"La valeur par défaut est NFKC.
Par exemple, pleine largeur"ABC"Est demi-largeur"ABC"À, demi-largeur"Kana"Est pleine largeur"Kana"Effectue une normalisation telle que à

RegexReplaceCharFilter('Expressions régulières', 'Caractères que vous souhaitez convertir')
Remplace la chaîne qui correspond au modèle d'expression régulière.
from janome.tokenizer import Tokenizer
from janome.tokenfilter import POSKeepFilter
from janome.analyzer import Analyzer

#Créer un objet Tokenizer
t = Tokenizer()

#Générer un filtre qui extrait uniquement la nomenclature
token_filters = [POSKeepFilter(['nom'])]

#Générer un cadre d'analyse avec des filtres
analyzer = Analyzer([], t, token_filters)

#Courir
for token in analyzer.analyze("Mots que vous souhaitez filtrer"):
    print(token)
>>>Résultat de sortie
Nomenclature des filtres,Général,*,*,*,*,filtre,filtre,filtre
Nomenclature des mots,Général,*,*,*,*,mot,Kotoba,Kotoba

Cliquez ici pour des exemples d'utilisation

from janome.tokenizer import Tokenizer
from janome.tokenfilter import POSKeepFilter
from janome.analyzer import Analyzer

#Génération d'objet d'analyse morphologique
t = Tokenizer()

#Générer un filtre qui extrait uniquement la nomenclature
token_filters = [POSKeepFilter(['nom'])]

#Générer un cadre d'analyse avec des filtres
analyzer = Analyzer([], t, token_filters)

for token in analyzer.analyze('Des cuisses et des cuisses'):
    print(token)

Normalisation du texte

Dictionnaire utilisé pour l'analyse morphologique

Le résultat de l'analyse morphologique dépend du dictionnaire. Lors de l'exécution, le "dictionnaire standard" standard est utilisé pour diviser les phrases en mots et ajouter des parties.

Bien que le dictionnaire standard contienne des mots courants Il ne contient pas souvent de termes techniques ou de nouveaux mots sont mis à jour.

Dans de tels cas, les mots peuvent être divisés anormalement ou les mots de partie peuvent être analysés comme des mots inconnus.

[Texte] Je vais à la tour de Tokyo.
[Résultat de l'analyse] I|Est|Tokyo|La tour|À|Aller|Masu| 。

Pour éviter cela, préparez un dictionnaire utilisateur séparément du dictionnaire standard. La méthode de création d'un dictionnaire utilisateur diffère selon le moteur d'analyse morphologique. N'oubliez pas ici uniquement l'existence du dictionnaire utilisateur.

Il existe également un dictionnaire utilisateur qui est distribué gratuitement, alors recherchez en fonction de votre objectif. Vous pouvez l'installer. (Cependant, il doit être utilisé à votre propre discrétion et responsabilité.)

Normalisation du texte

Avant d'effectuer une analyse morphologique, effectuez des travaux pour normaliser les fluctuations de notation, telles que la suppression de symboles inutiles et l'unification des notations.

[Texte] J'ai mangé une pomme hier. Je vais boire du jus de pomme aujourd'hui.
[Après normalisation] J'ai mangé des pommes hier. Je vais boire du jus de pomme aujourd'hui.

Dans l'exemple ci-dessus, il existe deux types de signes de ponctuation, "," et ",", mais comme ils ont la même signification, ils peuvent être unifiés en ",". En outre, les mots «pomme» et «pomme» peuvent être unifiés de la même manière.

Lors de la normalisation sur un ordinateur, une expression régulière est utilisée pour spécifier la chaîne de caractères. Une expression régulière est l'expression de plusieurs chaînes sous une forme. Par exemple, pour rechercher une certaine chaîne de caractères contenue dans le texte, la chaîne de caractères à rechercher est exprimée par le type de caractère comme suit.

[0-9] :Correspond à l'un des nombres 0-9
[0-9a-z]+ :Correspond à un ou plusieurs des nombres 0-9 et des lettres minuscules a-z

Lorsque vous souhaitez supprimer ou remplacer une certaine chaîne de caractères contenue dans le texte

re.sub()Est utilisé, mais spécifiez la chaîne de caractères dont vous souhaitez supprimer l'argument avec cette expression régulière.
import re

re.sub("La chaîne que vous souhaitez supprimer", "Chaîne de caractères après conversion", "Texte que vous souhaitez supprimer")

Cliquez ici pour des exemples d'utilisation

import re

#Texte de sortie à l'exclusion des caractères alphanumériques
re.sub("[0-9a-zA-Z]+", "", "J'achète 10 articles A.")

Recommended Posts

Python: texte japonais: analyse morphologique
Analyse morphologique japonaise avec Python
Text mining avec Python ① Analyse morphologique
[Python] Analyse morphologique avec MeCab
Analyse morphologique japonaise avec Janome
Text mining avec Python ① Analyse morphologique (re: version Linux)
Python: analyse négative / positive: application d'analyse de texte
Parlez du texte japonais avec OpenJTalk + python
Analyse de données python
De l'introduction de JUMAN ++ à l'analyse morphologique du japonais avec Python
Python: analyse morphologique simplifiée avec des expressions régulières
Comparaison approfondie de trois bibliothèques d'analyse morphologique Python
Texte de cluster en Python
Analyse de données avec python 2
Présentation de l'analyse de données python
Analyse vocale par python
Traitement de texte avec Python
Liste des erreurs Python (japonais)
Modèle d'analyse de données Python
Sortie japonaise avec Python
Analyse d'association en Python
python Paramètre japonais respectueux de l'environnement
Analyse vocale par python
Analyse de données avec Python
Analyse de régression avec Python
Python: texte japonais: caractéristique du discours à partir de la similitude des mots
Collecte d'informations sur Twitter avec Python (analyse morphologique avec MeCab)
Défiez l'analyse des composants principaux des données textuelles avec Python
Outil d'analyse morphologique en ligne version Pure Python Rakuten MA
Python: texte japonais: caractéristique de la parole à partir de la continuité des mots
[Note] WordCloud à partir de l'analyse morphologique
Mon conteneur d'analyse de données python
Traitement de texte UTF8 avec python
Envoyer du courrier japonais avec Python3
[Analyse de co-occurrence] Analyse de co-occurrence facile avec Python! [Python]
Python pour l'analyse des données Chapitre 4
Techniques statistiques Python-Analyse statistique contre Python-
Analyse des émotions par Python (word2vec)
Analyse statique des programmes Python
[Python] Notes sur l'analyse des données
Analyse des contraintes symétriques axiales avec Python
Traitement du langage naturel 1 Analyse morphologique
Notes d'apprentissage sur l'analyse des données Python
Analyse de squelette planaire avec Python
PNL japonais @ janome / spaCy / Python
#python python évitement des erreurs de syntaxe japonaise
Parler avec Python [synthèse vocale]
J'ai fait un texte Python
Python pour l'analyse des données Chapitre 2
Analyse de régression simple avec Python
Je comprends Python en japonais!
Analyse de données à l'aide de pandas python
Analyse des secousses musculaires avec Python
Analyse morphologique avec Igo + mecab-ipadic-neologd en Python (avec bonus Ruby)
[PowerShell] Analyse morphologique avec SudachiPy
tesseract-OCR pour Python [version japonaise]
Analyse des émotions par SMS avec ML-Ask
Python pour l'analyse des données Chapitre 3
Obtenez des synonymes japonais avec Python