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.
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
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"]
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))
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
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
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 "
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.
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.
Recommended Posts