** 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.
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.
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.
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:
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.
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
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:
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:
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
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.
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.
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".
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).
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.
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
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.
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:
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.
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: 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
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.
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.
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.
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.
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
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.
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:
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.
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.
notebooks/document_classification.ipynb
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.