Python: traitement du langage naturel

Bases du traitement du langage naturel

Vue d'ensemble du traitement du langage naturel

Langage naturel(NL, Natural Language)

Fait référence à des langues naturelles telles que le japonais et l'anglais. Comme un langage de programmation

Langage artificiel(Artificial Language)Est un contraste.
Traitement du langage naturel(NLP, Natural Language Processing)Quel est

C'est une technologie qui permet à un ordinateur de traiter le langage naturel que les humains utilisent quotidiennement. Les tâches utilisant le traitement du langage naturel comprennent la classification des documents, la traduction automatique, la synthèse de documents, les questions et réponses et le dialogue.

Les mots suivants sont souvent utilisés dans le traitement du langage naturel.

Jeton: un caractère ou une chaîne de caractères qui est traité comme la plus petite unité d'une phrase lors de l'analyse d'une langue naturelle.

Type: un terme qui décrit le type de mot.

Phrase: Une phrase qui exprime un ensemble de contenus. Dans le traitement du langage naturel, il se réfère souvent à une phrase.

Document: fait souvent référence à une seule donnée composée de plusieurs phrases.

Corpus: données qui donnent des informations à un document ou des données audio.

Sisorus: Haut des mots/Relation subordonnée, partie/Classez les mots en fonction des relations générales, des synonymes, des synonymes, etc.
Un dictionnaire / dictionnaire de synonymes systématique.

Élément morphologique: la plus petite unité qui a un sens. Le mot «manger» peut être décomposé en deux éléments morphologiques «manger» et «ta».

Mot: Une petite unité constituée d'un ou plusieurs éléments morphologiques.

Couche de surface: la description du texte d'origine.

Prototype: La description avant utilisation.

Caractéristique: Informations extraites de phrases et de documents.

Dictionnaire: dans le traitement du langage naturel, fait référence à une liste de mots.

Différences linguistiques

Pour que la machine comprenne le sens d'une phrase, il est nécessaire d'effectuer une division de mots. Par exemple, la phrase «J'étudie à Ideamy».

je|Est|École | À | Étude |
Nomenclature sous-auxiliaire nomenclature cas verbe assistant verbe auxiliaire

Vous pouvez identifier les sauts de mots et trouver leur partie et leur forme de base comme ci-dessus. En japonais, il est difficile d'identifier les sauts de mots, mais en revanche, peu de mots ont des interprétations multiples, il est donc facile de trouver des parties et des formes de base.

Le chinois et le thaï sont également des langues qui nécessitent la division des mots.

Pour l'anglais

I | study | at | aidemy.
Nomenclature verbes préfixe nomenclature

Les délimiteurs de mots peuvent être identifiés par des symboles tels que des espaces et des points, mais il est difficile d'identifier la partie car de nombreux mots ont plusieurs parties. Comme on peut le voir d'après ce qui précède, la caractéristique du traitement du langage naturel est que l'emplacement et la difficulté des problèmes diffèrent selon la langue.

C'est particulièrement difficile lors de l'écriture en hiragana comme indiqué ci-dessous.

Voiture|alors|Pin
viens|Jusqu'à ce que|Pin

Division de mots des phrases

Analyse morphologique et Ngram

Il existe deux méthodes principales pour diviser les phrases en mots.

① Analyse morphologique(Analyse par dictionnaire)
②Ngram(Analyse mécanique par le nombre de caractères)
il y a.

Une morphologie est la plus petite unité linguistique qui a un sens, et un mot a une ou plusieurs morphologies. L'analyse morphologique fait référence à la division en éléments morphologiques à l'aide d'un dictionnaire, puis au marquage (ajout d'informations) des parties de chaque élément.

D'autre part, Ngram est une méthode d'analyse qui sépare les mots par N caractères ou les phrases par N mots.

Un monogramme est découpé pour chaque caractère ou mot, un bigramme est découpé tous les deux caractères (mots) et un trigramme est découpé tous les trois caractères (mots).

Par exemple, considérez le monogramme, le bigramme et le trigramme de la phrase «aiueo» comme suit.

Monogramme:{Ah,je,U,e,Oh}
Bigram:{Ai,Dire,haut,Eo}
Trigramme:{Ah,Iue,Ueo}

Ngram ne nécessite pas de dictionnaire ou d'interprétation grammaticale comme l'analyse morphologique Il peut être utilisé quelle que soit la langue. De plus, Ngram a l'avantage que l'extraction d'entités est moins susceptible d'être manquée. Il y a un inconvénient à ce que le bruit devienne important. Au contraire, l'analyse morphologique a une différence dans les performances du dictionnaire. Il y a moins de bruit au lieu d'être généré.

Par exemple, lorsque vous recherchez une chaîne de caractères légèrement plus longue "la société informatique la plus célèbre du monde à Tokyo", si vous divisez la chaîne de caractères par bigramme et effectuez une recherche, il est possible que la société "Kyoto" soit touchée. C'est parce que le bigramme de caractère de "Tokyo" est {Tokyo, Kyoto}. Cela ne se produit pas avec une bonne utilisation de l'analyse morphologique, mais il est nécessaire de préparer un dictionnaire performant.

<Termes>

Fractionnement de mots: scission d'une phrase en mots
Étiquetage des mots partiels: processus de classification des mots en mots partiels et de leur étiquetage.
Analyse morphologique: un résumé du travail de division en éléments morphologiques et en parties de marquage

MeCab

Un outil d'analyse morphologique est préparé à l'avance pour effectuer une analyse morphologique. Typique comme analyseur morphologique japonais

Il y a MeCab et janome.

MeCab et janome effectuent une analyse morphologique en référence au dictionnaire. Ici, vous apprendrez à utiliser Mecab. Voir l'exemple d'analyse morphologique avec Mecab ci-dessous.

import MeCab

mecab = MeCab.Tagger("-Owakati")
print(mecab.parse("Il fera beau, demain."))
#Résultat de sortie
#Il fera beau, demain .
mecab = MeCab.Tagger("-Ochasen")
print(mecab.parse("Il fera beau, demain."))

"""
#Résultat de sortie
Tomorrow Ashita Tomorrow substantif-Avocat possible
Ha ha est un assistant-Assistance
Sunny Harrell Sunny Verbe-Type de base indépendant à un étage
C'est un desho. Verbe auxiliaire special / death
Uuu Forme de base invariante du verbe auxiliaire
.. .. .. symbole-Phrase

EOS
"""

Dans MeCab

MeCab.Tagger()En changeant l'argument de

Vous pouvez modifier le format de sortie des données. Comme dans l'exemple

"-Owakati"Quand est utilisé comme argument, il est divisé en mots.
"-Ochasen"Quand est utilisé comme argument, une analyse morphologique est effectuée.
.parse("Phrase")とすることにより引数のPhraseを指定された形式で出力させることができます。

janome (1)

janome est également l'un des célèbres analyseurs morphologiques japonais.

L'avantage de janome est que l'installation de MeCab est un problème. Le package est facile à installer. janome importe d'abord le Tokenizer Créez un objet Tokenizer avec Tokenizer ().

from janome.tokenizer import Tokenizer

t = Tokenizer()

Vous pouvez effectuer une analyse morphologique en transmettant la chaîne de caractères que vous souhaitez analyser à la méthode tokenize de Tokenizer.

La valeur de retour de la méthode tokenize est une liste de jetons balisés (objets Token).

#Analyse morphologique
from janome.tokenizer import Tokenizer

tokenizer = Tokenizer()  #Créer un objet Tokenizer
tokens = tokenizer.tokenize("J'ai lu un livre de python")
for token in tokens:
    print(token)

"""
#Résultat de sortie
python substantif,Nomenclature propriétaire,Organisation,*,*,*,python,*,*
Mots auxiliaires,syndicat,*,*,*,*,de,Non,Non
Cette nomenclature,Général,*,*,*,*,Livre,Hong,Hong
Auxiliaire,Assistant de cas,Général,*,*,*,À,Wo,Wo
Verbe de lecture,Indépendance,*,*,Cinq étapes, ligne Ma,Connexion continue,Lis,Jeune,Jeune
Verbe auxiliaire,*,*,*,Spécial,Forme basique,Est,Da,Da
"""

janome (2)

Dans janome (1), une analyse morphologique a été réalisée. Dans l'argument de la méthode tokenize

wakati=Vous pouvez le séparer en spécifiant True.

La valeur de retour lorsque wakati = True est une liste séparée.

from janome.tokenizer import Tokenizer

#Partage
t = Tokenizer()
tokens = t.tokenize("J'ai lu un livre de python", wakati=True)
print(tokens)
#Résultat de sortie
["python", "de", "Livre", "À", "Lis", "Est"]

fonction split

Lors du téléchargement de données de document, etc. pour le traitement du langage naturel Les mots sont souvent séparés par des caractères spéciaux, tels que "banane, pomme, fraise".

Dans de tels cas, la fonction split, qui est une fonction intégrée de Python, est souvent utilisée, elle sera donc expliquée ici.

La fonction de division divise une chaîne de nombres, alphabets, symboles, etc. C'est une fonction qui sépare et répertorie selon une certaine règle.

Lorsque les chaînes sont séparées par des espaces ou des délimiteurs (",", ".", "_", Etc.) Vous pouvez obtenir une liste séparée par des espaces ou des délimiteurs en utilisant la chaîne .split ("separator").

fruits = "banana, apple, strawberry"
print(fruits)  # str
print(fruits.split(","))  # list
#Résultat de sortie
banana, apple, strawberry
["banana", " apple", " strawberry"]
fruits = "banana apple srawberry"
print(fruits)  # str
print(fruits.split())  # list
#Résultat de sortie
banana apple srawberry
["banana", "apple", "srawberry"]

janome (3)

Pour chaque token (objet Token)

Token.Vous pouvez retirer la forme de la couche de surface avec surface
Token.part_of_Vous pouvez récupérer les mots de partie avec la parole.

La forme de surface est la forme qui apparaît réellement comme une chaîne de caractères dans une phrase.

tokens = t.tokenize("J'ai lu un livre de python")
#Type de surface
for token in tokens:
    print(token.surface)
"""
#Résultat de sortie
python 
de
Livre
À
Lis
Est
"""
#Partie
for token in tokens:
    print(token.part_of_speech)
"""
#Résultat de sortie
nom,固有nom,Organisation,*
Particule,syndicat,*,*
nom,Général,*,*
Particule,格Particule,Général,*
verbe,Indépendance,*,*
Verbe auxiliaire,*,*,*

Cliquez ici pour un exemple

from janome.tokenizer import Tokenizer

t = Tokenizer()
tokens = t.tokenize("J'ai mangé de la viande de cerf")

word = []

#Ce qui suit est un exemple.
for token in tokens:
    part_of_speech = token.part_of_speech.split(",")[0]
    if part_of_speech == "nom" or part_of_speech == "verbe":
        word.append(token.surface)
print(word)

#Résultat de sortie
# ['cerf', 'Viande', 'manger']

Ngram

Ngram consiste à séparer les mots pour chaque N caractères comme mentionné précédemment. Ou c'est une méthode d'analyse qui sépare les phrases par N mots.

L'algorithme Ngram peut être écrit sous la forme gen_Ngram ci-dessous.

Si vous voulez trouver le Ngram d'un mot, entrez le mot et le nombre que vous voulez couper dans l'argument. Si vous voulez trouver le Ngram d'une phrase, utilisez la fonction tokenize de janome pour créer une liste de divisions. Entrez la liste des divisions et le nombre à découper comme arguments.

Prenons le cas où la phrase "J'ai lu un livre python" est divisée en 3 mots (N = 3).

En utilisant janome, il est divisé en ["python", "", "book", "", "read", "da"]. Trois mots consécutifs peuvent prendre 6 --3 + 1 (nombre divisé en fonction d'une partie du mot --N + 1) = 4. Le résultat est ["python book", "book", "read book", "read"].

from janome.tokenizer import Tokenizer
tokenizer = Tokenizer()
tokens = tokenizer.tokenize("J'ai lu un livre de python", wakati=True)
# tokens = ["python", "de", "Livre", "À", "Lis", "Est"]

def gen_Ngram(words,N):
    ngram = [] #Je vais ajouter les mots découpés ici.
    for i in range(len(words)-N+1): #Répétez avec une instruction for jusqu'à ce que vous obteniez N mots consécutifs.
        cw = "".join(words[i:i+N]) #Connectez N mots et attribuez-les à cw.
        ngram.append(cw)

    return ngram

print(gen_Ngram(tokens, 2))
print(gen_Ngram(tokens, 3))
#Dans le cas d'un trigramme de phrase
gen_Ngram(tokens, 3)
#Résultat de sortie
["livre de python", "Livre", "Lire un livre", "Lis"]

#Pour le mot bigramme
gen_Ngram("bird", 2)
#Résultat de sortie
["bi", "ir", "rd"]
from janome.tokenizer import Tokenizer
t = Tokenizer()
tokens = t.tokenize("1ro a donné ce livre à la femme qui a vu 2ro.", wakati=True)

def gen_Ngram(words,N):
    #Générer Ngram
    ngram = []
    for i in range(len(words)-N+1):
        cw = "".join(words[i:i+N])
        ngram.append(cw)

    return ngram

print(gen_Ngram(tokens, 2))
print(gen_Ngram(tokens, 3))

Normalisation

Normalisation (1)

Dans le traitement du langage naturel, lors de l'extraction de fonctionnalités à partir de plusieurs documents Les règles d'entrée peuvent ne pas être unifiées et la notation peut fluctuer. (Exemple iPhone et iPhone)

Les mots qui devraient être identiques sont analysés comme des mots différents, ce qui entraîne des résultats d'analyse non voulus. Conversion de caractères en fonction de règles, telles que l'unification de la pleine largeur à la demi-largeur et l'unification du haut et du bas vers le bas

C'est ce qu'on appelle la normalisation.
Veuillez noter que si vous sur-normalisez, vous ne pourrez pas distinguer ce qui doit être distingué.
<Termes>

Fluctuation de notation: dans le même document, les mots qui devraient être utilisés avec le même son et le même synonyme sont écrits différemment.
Normalisation: Conversion de lettres et de chiffres sur une base de règles pour éviter les fluctuations de notation

En normalisation de chaîne, dans la bibliothèque

Vous pouvez facilement effectuer une normalisation à l'aide de NEologd.
neologdn.normalize("La chaîne que vous souhaitez normaliser") 
#Est écrit comme, et la chaîne de caractères normalisée est transmise comme valeur de retour.

Les normalisations qui peuvent être effectuées avec neologdn sont:

Unifier les caractères alphanumériques pleine largeur en ai demi-largeur-> ai
Unifier les Katakana demi-largeur en Katakana pleine largeur->Katakana
Raccourcissement du son long Woooooooooo->sensationnel
Unification de types de caractères similaires"---- "-> "-"
Supprimer l'espace inutile"Espace"-> "espace" 
Limitation de la répétition (confirmée par problème)

Cliquez ici pour un exemple

#Veuillez importer neologdn
import neologdn

#Unifier les Katakana demi-largeur en pleine largeur
a = neologdn.normalize("Kata Kana")
print(a)

#Raccourcissement des notes longues
b = neologdn.normalize("Mee --------")
print(b)

#Unification de personnages similaires
c = neologdn.normalize("Différents tirets ˗֊ ------ - ⁃⁻₋−")
print(c)

#Unifier les caractères alphanumériques pleine largeur en demi-largeur+Supprimer l'espace inutile
d = neologdn.normalize("Approfondissement DL")
print(d)

#Limitation de la répétition
e = neologdn.normalize("Mii Ii Ii Ii Ii", repeat=6)
print(e)
Résultat de sortie

Katakana
Moi
Divers traits d'union-
Apprentissage profond DL
Bon bon bon

Normalisation (2)

Dans Normalization (1), nous avons examiné la normalisation à l'aide d'une bibliothèque. Ensuite, au cas où vous souhaiteriez vous normaliser à vos propres données Apprenez à faire la normalisation vous-même.

Lorsqu'il y a deux types de mots «iphone» et «iPhone» dans le document Il est nécessaire d'unifier la notation pour les traiter comme la même chose.

Si vous souhaitez aligner les majuscules et les minuscules, vous pouvez l'aligner en ajoutant .lower () à la chaîne. Les choses qui sont utilisées plusieurs fois dans le code, comme l'exemple ci-dessous, sont souvent transformées en fonctions.

def lower_text(text):
    return text.lower()
lower_letters = lower_text("iPhone")
print(lower_letters)
#Résultat de sortie
# iphone

Normalisation (3)

La normalisation peut également remplacer les nombres.

La raison du remplacement des nombres est que les expressions numériques sont diverses et que la fréquence d'apparition est élevée. Cela peut ne pas être utile pour les tâches de traitement du langage naturel.

Par exemple, envisagez la tâche de catégoriser les articles de presse dans des catégories telles que «sports» et «politique». En ce moment, je pense que diverses expressions numériques apparaîtront dans l'article. Il est considéré comme peu utile pour classer les catégories. pour cette raison

Il remplace le nombre par un autre symbole et réduit le nombre de vocabulaire.

Ici, la chaîne de caractères est convertie à l'aide d'une méthode d'expression spéciale appelée expression régulière. Les détails des expressions régulières sont expliqués dans Normalisation (4).

Pour les opérations d'expressions régulières

Utilisez la bibliothèque Python standard re.

Pour remplacer une chaîne par une autre,

re.sub(Expressions régulières,Chaîne de caractères à remplacer,La chaîne entière à remplacer[,Nombre de remplacements])
#Spécifiez ce que vous souhaitez remplacer par le premier argument par une expression régulière
#Indique la chaîne de caractères à remplacer par le deuxième argument.
#Spécifiez la chaîne de caractères entière à remplacer par le troisième argument.
#Si vous ne spécifiez pas le nombre de quatrièmes arguments, tous seront remplacés.

Regardons l'exemple suivant. Supposons que vous ayez la phrase "Je me suis réveillé hier à 6 heures et je me suis couché à 11 heures". normalize_number est une fonction qui supprime les nombres des phrases.

re.sub Le premier argument \ d est une expression régulière qui représente une chaîne de nombres. Vous pouvez spécifier n'importe quelle chaîne numérique à l'aide de this. Le deuxième argument est "", et l'opération consiste à réécrire la chaîne de caractères spécifiée par le premier argument en . Puisque la phrase est spécifiée dans le troisième argument et que le quatrième argument n'est pas spécifié, l'opération de modification de toutes les chaînes numériques de la phrase est effectuée.

import re

def normalize_number(text):
    replaced_text = re.sub("\d", "<NUM>", text)
    return replaced_text

replaced_text = normalize_number("Je me suis réveillé hier à 6 heures et je me suis couché à 11 heures.")
print(replaced_text)

#Résultat de sortie
#Hier<NUM>Parfois se lever<NUM>Parfois je dormais.

Expressions régulières

Une expression régulière est une méthode de remplacement d'un ensemble de chaînes de caractères par un caractère ou une autre chaîne de caractères. Il est largement utilisé pour les fonctions de recherche de chaînes de caractères.

12A3B -> \d\dA\dB

Dans l'exemple ci-dessus, tous les nombres demi-largeur sont représentés par l'expression régulière \ d.

Dans le traitement du langage naturel tel que l'expression régulière (3), un ensemble de chaînes de caractères qui ne sont pas considérées comme nécessaires pour l'analyse Réduisez la quantité de données en les remplaçant.

Les expressions régulières sont utilisées pour remplacer ces ensembles de chaînes.

Le tableau ci-dessous montre les expressions régulières qui sont souvent utilisées dans le traitement du langage naturel.

image.png

Recommended Posts

Python: traitement du langage naturel
RNN_LSTM2 Traitement du langage naturel
3. Traitement du langage naturel par Python 2-1. Réseau de co-occurrence
3. Traitement du langage naturel par Python 1-1. Word N-gram
100 coups de traitement du langage avec Python 2015
3. Traitement du langage naturel par Python 2-2. Réseau de co-occurrence [mecab-ipadic-NEologd]
[Python] J'ai joué avec le traitement du langage naturel ~ transformers ~
100 Language Processing Knock Chapitre 1 (Python)
100 Language Processing Knock Chapitre 2 (Python)
Traitement du langage naturel 1 Analyse morphologique
Python: apprentissage profond du traitement du langage naturel: principes de base
Traitement du langage naturel 3 Continuité des mots
Python: représentation vectorielle en langage naturel
Traitement du langage naturel 2 similitude de mots
Créer un environnement pour le traitement du langage naturel avec Python
Étudiez le traitement du langage naturel avec Kikagaku
100 traitements du langage naturel frappent le chapitre 4 Commentaire
100 traitements de langage avec Python
100 Language Processing Knock Chapitre 1 en Python
Traitement du langage naturel pour les personnes occupées
[Traitement du langage naturel] Prétraitement avec le japonais
100 traitements de langage avec Python (chapitre 3)
Logivan du langage artificiel et traitement du langage naturel (traitement du langage artificiel)
Le débutant en Python a essayé 100 traitements de langage Knock 2015 (05 ~ 09)
100 Language Processing Knock Chapitre 1 par Python
Se préparer à démarrer le traitement du langage naturel
Résumé de l'installation de l'analyseur de traitement du langage naturel
Le débutant en Python a essayé 100 traitements de langage Knock 2015 (00 ~ 04)
100 traitements linguistiques frappent 03 ~ 05
100 coups de traitement linguistique (2020): 32
100 coups de traitement linguistique (2020): 35
100 coups de traitement linguistique (2020): 47
100 coups de traitement linguistique (2020): 39
100 coups de traitement linguistique (2020): 22
100 coups de traitement linguistique (2020): 26
100 coups de traitement linguistique (2020): 34
100 coups de traitement linguistique (2020): 28
100 coups de traitement linguistique (2020): 42
100 coups de traitement linguistique (2020): 29
100 coups de traitement linguistique (2020): 49
Le traitement de 100 langues frappe 06 ~ 09
100 coups de traitement linguistique (2020): 43
100 coups de traitement linguistique (2020): 24
Traitement de fichiers Python
100 coups de traitement linguistique (2020): 45
100 coups de traitement linguistique (2020): 10-19
[Python] Essayez de classer les boutiques de ramen par traitement du langage naturel
100 coups de traitement linguistique (2020): 30
100 coups de traitement linguistique (2020): 00-09
100 coups de traitement linguistique (2020): 31
100 coups de traitement linguistique (2020): 38
100 coups de traitement linguistique (2020): 48
100 coups de traitement linguistique (2020): 44
100 coups de traitement linguistique (2020): 41
100 coups de traitement linguistique (2020): 37
100 traitement de la langue frapper 00 ~ 02
100 coups de traitement linguistique (2020): 25
100 coups de traitement linguistique (2020): 23
100 coups de traitement linguistique (2020): 33