[PYTHON] Types de prétraitement dans le traitement du langage naturel et leur puissance

** Le prétraitement est essentiel pour le traitement du langage naturel. ** Le texte est une liste de caractères et n'est pas structuré, il est donc difficile à traiter tel quel. En particulier, le texte Web contient du bruit comme les balises HTML et le code JavaScript. À moins qu'un tel bruit ne soit prétraité et éliminé, les résultats attendus ne seront pas obtenus.

スクリーンショット 2017-04-04 9.20.08.png Source: [Apprentissage en profondeur pour la biologie computationnelle](http://msb.embopress.org/content/12/7/878)

Cet article décrit ** les types de prétraitement dans le traitement du langage naturel et leur puissance **. Quant à l'ordre des explications, les types de prétraitement seront d'abord expliqués. Chaque prétraitement sera expliqué du point de vue 1. quel type de traitement, 2. pourquoi il est effectué et 3. comment le mettre en œuvre (autant que possible). Après avoir expliqué les types, nous comparerons les résultats de la classification des documents avec et sans prétraitement pour mesurer la puissance du prétraitement.

Type de prétraitement et mise en œuvre

Cette section décrit les cinq pré-traitements illustrés ci-dessous. Nous expliquerons les cinq pré-processus du point de vue 1. quel type de traitement, 2. pourquoi il est effectué et 3. comment le mettre en œuvre.

スクリーンショット 2017-04-13 10.09.02.png

Nettoyage de texte

Le nettoyage du texte supprime le bruit contenu dans le texte. Le bruit commun est le code JavaScript et les balises HTML. L'élimination de ces bruits peut réduire l'impact négatif du bruit sur les résultats des tâches. L'image ressemble à ceci: スクリーンショット 2017-04-03 11.20.10.png

La suppression des balises JavaScript et HTML est courante, mais en réalité, le bruit que vous souhaitez supprimer dépend des données. Les expressions régulières sont une main qui peut être utilisée dans de tels cas. Lors de l'écriture d'une expression régulière, utilisez un éditeur en ligne tel que celui ci-dessous pour vérifier la correspondance de motif en temps réel afin d'accélérer le travail.

https://regex101.com/ regexp.mov.gif

Utile pour nettoyer Python comme Beautiful Soup et lxml Il y a une bibliothèque. Cliquez ici pour un exemple de nettoyage de texte avec BeautifulSoup: preprocessings/ja/cleaning.py

Partage de mots

La première chose à faire pour des langues comme le japonais où les sauts de mots ne sont pas clairs est le fractionnement de mots. La raison de la division des mots est que la plupart des systèmes de traitement du langage naturel gèrent les entrées au niveau des mots. La division est principalement réalisée à l'aide d'un analyseur morphologique. Les principaux analyseurs morphologiques sont MeCab et [Juman ++](http://nlp.ist.i.kyoto-u.ac.jp/index.php? JUMAN ++), Janome.

L'image est divisée comme suit. À ce stade, le mot peut être prototypé pour réduire le nombre de vocabulaire: スクリーンショット 2017-04-03 13.54.31.png

Le problème avec l'analyse morphologique est que, par défaut, elle n'est pas forte pour analyser de nouveaux mots. En regardant l'exemple ci-dessus, le "Nouveau Musée National" est divisé en trois parties: "National", "Nouveau" et "Musée". La raison de ce résultat est que le dictionnaire utilisé pour l'analyse n'inclut pas "National New Museum". Ce problème est exacerbé, d'autant plus que le Web contient de nombreux mots nouveaux.

Ce problème peut être résolu dans une certaine mesure en ajoutant un dictionnaire appelé NEologd. NEologd contient de nombreux nouveaux mots par rapport aux dictionnaires classiques. Par conséquent, l'utilisation de NEologd vous aidera à analyser de nouveaux mots. Voici le résultat de l'analyse de la même phrase que ci-dessus en utilisant NEologd: スクリーンショット 2017-04-03 14.01.58.png

Après avoir divisé le mot comme décrit ci-dessus, le traitement suivant est effectué. Voici l'implémentation Python: preprocessings/ja/tokenizer.py

Normalisation des mots

Dans la normalisation des mots, les mots sont remplacés, comme l'unification des types de caractères des mots et l'absorption des fluctuations d'orthographe et de notation. En effectuant ce processus, «chat» pleine largeur et «neko» demi-largeur et «chat» hiragana peuvent être traités comme le même mot. Il s'agit d'un processus important du point de vue de la quantité de calcul et de l'utilisation de la mémoire dans le traitement ultérieur.

Il existe différents processus de normalisation de mots, mais cet article présente les trois processus suivants.

Unification des types de caractères

Pour unifier les types de caractères, les lettres supérieures et inférieures de l'alphabet sont converties en lettres minuscules et les lettres demi-largeur sont converties en lettres pleine largeur. Par exemple, convertissez la partie supérieure de "Naturel" en partie inférieure pour la rendre "naturelle", ou convertissez "neko" en pleine largeur pour la rendre "chat". En effectuant ce type de traitement, les mots peuvent être traités comme le même mot quel que soit le type de caractère. スクリーンショット 2017-04-05 9.50.55.png

Remplacement du numéro

Le remplacement des nombres remplace les nombres qui apparaissent dans le texte par un autre symbole (par exemple, 0). Par exemple, supposons que vous voyiez une chaîne dans un texte contenant un nombre tel que «1er janvier 2017». Le remplacement des nombres convertira les nombres de cette chaîne en quelque chose comme "0/0/0". スクリーンショット 2017-04-05 9.34.29.png

La raison du remplacement des nombres est qu'ils ne sont souvent pas utiles pour les tâches de traitement du langage naturel, malgré la variété des représentations numériques et leur fréquence élevée d'occurrence. Par exemple, envisagez la tâche de catégoriser les articles de presse dans des catégories telles que «sports» ou «politique». À ce stade, diverses expressions numériques apparaîtront dans l'article, mais elles sont considérées comme peu utiles pour classer les catégories. Par conséquent, il remplace le nombre par un autre symbole et réduit le nombre de vocabulaire.

Par conséquent, nous ne remplaçons pas les nombres dans les tâches où la représentation numérique est importante (comme l'extraction d'informations).

Unification des mots à l'aide d'un dictionnaire

Dans l'unification des mots à l'aide d'un dictionnaire, les mots sont remplacés par des expressions typiques. Par exemple, lorsqu'il s'agit de phrases contenant un mélange de «Sony» et de «Sony», «Sony» est remplacé par «Sony». Cela permettra aux deux mots d'être traités comme le même mot lors d'un traitement ultérieur. Il convient de noter que le remplacement doit être effectué en tenant compte du contexte. スクリーンショット 2017-04-05 10.03.54.png

Le monde de la normalisation des mots est profond, et en plus de la normalisation expliquée ci-dessus, absorption des fluctuations orthographiques (loooooooooooool-> lol), traitement des abréviations (4eva-> forever), représentation des expressions verbales (ssu-> Il existe également une normalisation telle que). Si vous avez une grande quantité de données, je pense qu'il y a un traitement qui peut être géré par l'expression distribuée de mots décrite plus loin, mais je pense qu'il est préférable d'effectuer le traitement nécessaire à la tâche que vous souhaitez résoudre.

Il implémente certaines des normalisations de mots décrites ci-dessus: preprocessings/ja/normalization.py

Arrêter la suppression des mots

Un mot vide est un mot qui est exclu du traitement car il est courant et inutile lors du traitement des langages naturels. Par exemple, des mots fonctionnels tels que des mots auxiliaires et des verbes auxiliaires (tels que «ha», «no», «desu» et «masu»). Ces mots ne sont pas utiles pour leur fréquence élevée d'occurrence et sont supprimés car ils affectent négativement la quantité de calcul et les performances.

Il existe diverses méthodes pour supprimer les mots vides, mais cet article présente les deux méthodes suivantes.

Méthode du dictionnaire

Dans la méthode du dictionnaire, les mots vides sont définis à l'avance dans le dictionnaire et les mots contenus dans le dictionnaire sont supprimés du texte. Vous pouvez créer le dictionnaire vous-même, mais il existe déjà des dictionnaires définis. Ici, l'un des dictionnaires de mots vides japonais Slothlib Jetons un coup d'œil au contenu. Environ 300 mots sont définis ligne par ligne:

là bas
Par
Là
Là bas
après
trou
tu
cette
Combien
Quand
Maintenant
Désagréable
divers
...

Lit et utilise les mots définis dans ce dictionnaire comme mots vides. Plus précisément, si le mot d'arrêt lu est inclus dans le texte divisé en mots, il sera supprimé. L'image ressemble à ceci: スクリーンショット 2017-04-03 10.52.06.png

La méthode du dictionnaire est simple et facile, mais elle présente quelques inconvénients. Le premier est le coût de création d'un dictionnaire. L'autre est que certains domaines peuvent ne pas être utiles. Par conséquent, vous devez le refaire en fonction du corpus que vous ciblez.

Méthode par fréquence d'apparition

La méthode basée sur la fréquence compte la fréquence des mots dans le texte et supprime les mots à haute fréquence (parfois peu fréquents) du texte. Nous supprimons les mots fréquents car ils constituent une grande partie du texte, mais ils sont inutiles. La figure ci-dessous représente la fréquence cumulée des 50 mots les plus fréquents dans un livre anglais: figure_1.png Si vous regardez les 50 mots, vous pouvez voir que les mots qui semblent inutiles pour la classification des documents tels que les, de et les virgules représentent près de 50% du texte. La méthode basée sur la fréquence supprime ces mots à haute fréquence du texte en tant que mots vides.

Cliquez ici pour une mise en œuvre qui supprime les mots vides: preprocessings/ja/stopwords.py

Représentation vectorielle des mots

Dans la représentation vectorielle des mots, le processus de conversion d'un mot qui est une chaîne de caractères en un vecteur est exécuté. La raison de la conversion d'une chaîne de caractères en vecteur est que la chaîne de caractères est de longueur variable et difficile à gérer, et il est difficile de calculer la similitude. Il existe différentes méthodes pour l'expression vectorielle, mais je présenterai les deux suivantes.

Expression unique

La première manière possible d'exprimer un mot en tant que vecteur est l'expression one-hot. Une expression one-hot est une méthode dans laquelle un seul élément est 1 et les autres éléments sont 0. En définissant 1 ou 0 pour chaque dimension, "qu'il s'agisse ou non du mot" est indiqué.

Par exemple, disons que l'expression one-hot représente le mot python. Ici, le vocabulaire qui est un ensemble de mots est de 5 mots (nlp, python, word, ruby, one-hot). Ensuite, le vecteur représentant python sera le suivant. スクリーンショット 2017-03-03 15.18.11.png

La représentation one-hot est simple, mais elle a la faiblesse que vous ne pouvez pas obtenir de résultats significatifs avec des opérations entre vecteurs. Par exemple, disons que vous prenez le produit interne pour calculer la similitude entre les mots. Dans l'expression one-hot, différents mots ont des 1 à différents endroits et d'autres éléments sont 0, donc le résultat de la prise du produit interne entre différents mots est 0. Ce n'est pas le résultat souhaité. De plus, puisqu'une dimension est attribuée à un mot, elle devient de très grande dimension à mesure que le nombre de vocabulaire augmente.

Représentation distribuée

Les représentations distribuées, en revanche, représentent les mots comme des vecteurs à valeur réelle de faible dimension. Il est souvent exprimé dans environ 50 à 300 dimensions. Par exemple, les mots mentionnés précédemment peuvent être exprimés comme suit dans une expression distribuée. スクリーンショット 2017-03-03 15.46.50.png

Vous pouvez résoudre le problème de l'expression one-hot en utilisant l'expression distribuée. Par exemple, les opérations entre vecteurs vous permettront de calculer la similitude entre les mots. En regardant le vecteur ci-dessus, la similitude entre python et ruby est probablement plus élevée que la similitude entre python et word. Aussi, même si le nombre de vocabulaire augmente, il n'est pas nécessaire d'augmenter le nombre de dimensions de chaque mot.

Cliquez ici pour l'implémentation pour obtenir un vecteur de représentation distribuée: preprocessings/ja/word_vector.py

Pouvoir du prétraitement

Cette théorie examine l'efficacité du prétraitement. Plus précisément, nous avons comparé les performances de classification et le temps d'exécution avec et sans prétraitement appliqué à la tâche de classification des documents. En conséquence, le prétraitement a amélioré les performances de classification et réduit de moitié le temps d'exécution.

Corpus utilisé pour la classification des documents

J'ai utilisé le corpus de nouvelles de livingoor comme ensemble de données de classification de document. Le corpus d'actualités de livesoor est une collection d'articles d'actualités de livesoor, dépourvus de balises HTML. Cet ensemble de données contient neuf classes répertoriées ci-dessous:

Type de prétraitement à utiliser

Dans cette section, nous décrirons brièvement les types de prétraitement lors du prétraitement.

Lorsqu'il n'est pas prétraité, le texte est analysé morphologiquement (ipadic), converti en BoW et pondéré par TF-IDF.

En revanche, lors du prétraitement, le texte est d'abord nettoyé. J'ai fait trois choses:

Après le nettoyage, utilisez NEologd pour écrire les phrases dans le dictionnaire d'analyse morphologique. Et nous normalisons le texte pour les mots divisés. Il y a deux choses à faire:

Les mots vides sont supprimés des mots normalisés en fonction de la fréquence d'occurrence, et finalement BoW est classé en utilisant un vecteur pondéré par TF-IDF. RandomForest est utilisé pour la classification.

résultat

Pour le résultat, comparez les performances de classification et le temps d'exécution. Tout d'abord, examinons les performances de classification (précision).

Avec prétraitement Pas de prétraitement
0.917 0.898

~~ Les performances de classification n'ont pratiquement pas changé avec et sans prétraitement. Je m'attendais à ce que cela améliore les performances, mais ... Ce domaine nécessite un examen plus approfondi. ~~ Après avoir corrigé l'erreur de mise en œuvre, il y avait une différence de 1,9 point entre le prétraitement et le non-prétraitement. C'est une différence de 1,9 point dans cette performance, donc je pense que c'est une différence raisonnable.

En comparant les temps d'exécution, les résultats suivants ont été obtenus. Cela prend environ 600 secondes sans prétraitement, mais le calcul est effectué environ la moitié du temps avec le prétraitement. On pense que cela était dû à la réduction du nombre de vocabulaire par le nettoyage, la normalisation, et surtout la suppression des mots vides, ce qui a conduit à la réduction du temps d'exécution. スクリーンショット 2017-04-17 22.25.57.png

notebooks/document_classification.ipynb

en conclusion

Le prétraitement est indispensable pour le traitement du langage naturel. Divers processus sont nécessaires pour gérer les langages naturels sur un ordinateur. Cet article en a présenté certains. Nous espérons que vous trouverez cet article utile.

Je tweet également des informations sur l'apprentissage automatique et le traitement du langage naturel dans mon compte Twitter. @Hironsan

Nous nous réjouissons de votre suivi si vous êtes intéressé par ce domaine.

Les références

Recommended Posts

Types de prétraitement dans le traitement du langage naturel et leur puissance
Vérification des performances du prétraitement des données dans le traitement du langage naturel
Vue d'ensemble du traitement du langage naturel et de son prétraitement des données
[WIP] Pré-traitement des notes dans le traitement du langage naturel
Insoutenable manque d'attention dans le traitement du langage naturel
[Traitement du langage naturel] Prétraitement avec le japonais
Logivan du langage artificiel et traitement du langage naturel (traitement du langage artificiel)
■ [Google Colaboratory] Prétraitement du traitement du langage naturel et janome
Réponses et impressions de 100 chocs de traitement linguistique - Partie 1
Traiter le nom de la carte Yugioh en langage naturel --Yugiou Data Science 2. PNL
Réponses et impressions de 100 chocs de traitement de la langue - Partie 2
Python: apprentissage profond du traitement du langage naturel: principes de base
Python: Apprentissage en profondeur dans le traitement du langage naturel: Implémentation d'un système de sélection de phrases de réponses
Python: traitement du langage naturel
RNN_LSTM2 Traitement du langage naturel
Traitement pleine largeur et demi-largeur des données CSV en Python
Modèle utilisant un réseau neuronal convolutif dans le traitement du langage naturel
Récapitulatif du traitement de la date en Python (datetime et dateutil)
Pré-traitement et post-traitement de pytest
Traitement du langage naturel 1 Analyse morphologique
100 traitement de la langue knock-42: Affichage de la phrase de la personne concernée et de la personne concernée
Traitement du langage naturel 3 Continuité des mots
[Traitement du langage naturel] J'ai essayé de visualiser les remarques de chaque membre de la communauté Slack
Traitement du langage naturel 2 similitude de mots
Explication du CSV et exemple d'implémentation dans chaque langage de programmation
Essayons le livre "Introduction au développement d'applications de traitement du langage naturel en 15 étapes" --Chapitre 3 Étape 10 Mémo "Détails et amélioration du réseau neuronal"
Essayez le livre "Introduction au développement d'applications de traitement du langage naturel en 15 étapes" - Chapitre 2 Étape 02 Mémo "Prétraitement"
Dockerfile avec les bibliothèques nécessaires pour le traitement du langage naturel avec python
Pourquoi l'expression distribuée des mots est-elle importante pour le traitement du langage naturel?
[Word2vec] Visualisons le résultat du traitement en langage naturel des avis des entreprises
100 traitements du langage naturel frappent le chapitre 4 Commentaire
100 Language Processing Knock Chapitre 1 en Python
Traitement du langage naturel pour les personnes occupées
100 traitement du langage knock-59: analyse de la formule S
Une histoire d'essayer de LT pour effectuer le codage en direct du traitement du langage naturel et de l'analyse des dépendances en un instant à partir d'un endroit vide
Se préparer à démarrer le traitement du langage naturel
Résumé de l'installation de l'analyseur de traitement du langage naturel
Résumé du traitement multi-processus du langage de script
Vous devenez ingénieur en 100 jours ――Jour 66 ――Programmation ――À propos du traitement du langage naturel
Apprenez les bases de la classification de documents par traitement du langage naturel, modèle de sujet
J'ai fait une sorte d'outil de traitement d'image simple en langage Go.
Réhabilitation des compétences Python et PNL à partir de "100 Language Processing Knock 2015" (Chapitre 1)
Python: prétraitement en machine learning: gestion des données manquantes / aberrantes / déséquilibrées
[Traitement du langage naturel] Extraire les mots-clés de la base de données Kakenhi avec MeCab-ipadic-neologd et termextract
Création d'une extension Chrome qui utilise la puissance du traitement du langage naturel pour chasser les sites sombres du monde
100 traitement du langage knock-91: Préparation des données d'analogie
Traitement du langage 100 knocks-44: Visualisation des arbres dépendants
100 traitement de langue knock-22: Extraction du nom de la catégorie
100 Knocking Natural Language Processing Chapitre 1 (Mouvement préparatoire)
100 Language Processing Knock-26: suppression du balisage accentué
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
Captures d'écran de la pêche sur le Web avec du sélénium et Chrome.
Séparation de la conception et des données dans matplotlib
Résumé des modules et des classes dans Python-TensorFlow2-
J'ai essayé le traitement du langage naturel avec des transformateurs.
Statut de chaque système de traitement Python en 2020
Projet Euler # 1 "Multiple de 3 et 5" en Python
Mémo de produits pratique autour du traitement du langage naturel