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.
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"])
Le corpus utilisé ici est le suivant.
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.
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.
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.
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'
},
...
}
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)
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).
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'))
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
① 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)
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é.)
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