La classification du texte est votre nouvelle arme secrète | par Adam Geitgey

 La classification du texte est votre nouvelle arme secrète | par Adam Geitgey


Ce ne sont que quelques idées. Les utilisations de la classification du texte sont infinies. Il vous suffit de trouver un moyen de recadrer le problème afin que les informations que vous essayez d’extraire du texte puissent être mappées dans un ensemble de classes de sortie discrètes.

Vous pouvez même construire des systèmes où un modèle de classification alimente un autre modèle de classification. Imaginez un système de support utilisateur où le premier classificateur devine la langue de l’utilisateur (anglais ou allemand), le deuxième classificateur devine quelle équipe est le mieux adapté pour gérer sa demande et qu’un troisième classificateur devine si l’utilisateur est déjà contrarié ou non pour choisir un code de priorité de billet. Vous pouvez devenir aussi complexe que vous le souhaitez!

Maintenant que vous êtes convaincu de la génialité des modèles de classification du texte stupide, apprenons exactement à les construire!

Mon outil préféré pour construire des modèles de classification de texte est FastText de Facebook. Il est open source et vous pouvez l’exécuter en tant qu’outil de ligne de commande ou l’appeler à partir de Python. Il y a de grandes alternatives comme Vowpal wabbit Cela fonctionne également bien et est plus flexible, mais je trouve FastText plus facile à utiliser.

Tu peux Installez FastText en suivant ces instructions.

Étape 1: Télécharger les données de formation

Pour créer un modèle d’examen des utilisateurs, nous avons besoin de données de formation. Heureusement, Yelp fournit un ensemble de données de recherche de 4,7 millions d’examens utilisateurs. Tu peux Téléchargez-le ici (Mais gardez à l’esprit que vous ne pouvez pas utiliser ces données pour créer des applications commerciales).

Lorsque vous téléchargez les données, vous obtiendrez un fichier JSON de 4 gigaoctets appelé reviews.json. Chaque ligne du fichier est un objet JSON avec des données comme celle-ci:

{
"review_id": "abc123",
"user_id": "xyy123",
"business_id": "1234",
"stars": 5,
"date":" 2015-01-01",
"text": "This restaurant is great!",
"useful":0,
"funny":0,
"cool":0
}

Étape 2: Données de formation au format et à la pré-processus

La première étape consiste à convertir ce fichier au format que FastText attend.

FastText nécessite un fichier texte avec chaque morceau de texte sur une ligne par lui-même. Le début de chaque ligne doit avoir un préfixe spécial de __label__YOURLABEL qui attribue l’étiquette à ce texte.

En d’autres termes, nos données d’examen des restaurants doivent être reformatées comme ceci:

__label__5 This restaurant is great!
__label__1 This restaurant is terrible :'(

Voici un simple morceau de code Python qui lira le fichier Reviews.json et rédigera un fichier texte au format FastText:

Exécution cela crée un nouveau fichier appelé fasttext_dataset.txt que nous pouvons alimenter le texte rapide pour la formation. Nous n’avons pas encore fini, cependant. Nous devons encore faire du prétraitement supplémentaire.

FastText est totalement inconscient de toutes les conventions de langue anglaise (ou des conventions de toute autre langue). Pour autant qu’il sait, les mots Hello, hello et hello! sont tous des mots totalement différents parce qu’ils ne sont pas exactement les mêmes personnages. Pour résoudre ce problème, nous voulons faire une passe rapide à travers notre texte pour tout convertir en minuscules et mettre des espaces avant les marques de ponctuation. C’est ce qu’on appelle la normalisation du texte et il est beaucoup plus facile pour FastText de reprendre les modèles statistiques dans les données.

Cela signifie que le texteThis restaurant is great! devrait devenirthis restaurant is great !.

Voici une fonction Python simple que nous pouvons ajouter à notre code pour ce faire:

Ne vous inquiétez pas, il y a une version finale du code ci-dessous qui comprend cette fonction.

Étape 3: Divisez les données en un ensemble de formation et un ensemble de tests

Pour obtenir une mesure précise de la performance de notre modèle, nous devons tester sa capacité à classer le texte en utilisant du texte qu’il n’a pas vu pendant la formation. Si nous les testons contre les données de formation, c’est comme lui donner un test de livre ouvert où il peut mémoriser les réponses.

Nous devons donc extraire certaines des chaînes de l’ensemble de données de formation et les conserver dans un fichier de données de test séparé. Ensuite, nous pouvons tester les performances du modèle formé avec ces données retenues pour obtenir une mesure réelle de la performance du modèle.

Voici une version finale de notre code d’analyse de données qui lit l’ensemble de données Yelp, supprime tout formatage de chaîne et écrit des fichiers de formation et de test distincts. Il divise au hasard 90% des données sous forme de données de test et 10% en tant que données de test:

Exécutez cela et vous aurez deux fichiers,fasttext_dataset_training.txt et fasttext_dataset_test.txt. Maintenant, nous sommes prêts à nous entraîner!

Voici un autre conseil cependant: pour rendre votre modèle robuste, vous voudrez également randomiser l’ordre des lignes dans chaque fichier de données afin que l’ordre des données de formation n’influence pas le processus de formation. Ce n’est pas absolument nécessaire dans ce cas, car les données de Yelp sont déjà assez aléatoires, mais cela vaut vraiment la peine de faire lorsque vous utilisez vos propres données.

Étape 4: Former le modèle

Vous pouvez former un classificateur à l’aide de l’outil de ligne de commande FastText. Tu appelles juste fasttextpasser dans le supervised mot-clé pour lui dire former un modèle de classification supervisé, puis lui donner le fichier de formation et un nom de sortie pour le modèle:

fasttext supervised -input fasttext_dataset_training.txt -output reviews_model 

Il n’a fallu que 3 minutes pour former ce modèle avec 580 millions de mots sur mon ordinateur portable. Pas mal!

Étape 5: Testez le modèle

Voyons à quel point le modèle est précis en les vérifiant par rapport à nos données de test:

fasttext test reviews_model.bin fasttext_dataset_test.txtN 474292
P@1 0.678
R@1 0.678

Cela signifie que sur 474 292 exemples, il a deviné la notation exacte de l’étoile de l’utilisateur 67,8% du temps. Pas un mauvais début.

Vous pouvez également demander à FastText de vérifier à quelle fréquence la bonne note d’étoile se trouvait dans l’une de ses 2 principales prédictions (c’est-à-dire si les deux suppositions les plus probables du modèle étaient «5», «4» et que le véritable utilisateur a dit «4»):

fasttext test reviews_model.bin fasttext_dataset_test.txt 2N 474292
P@2 0.456
R@2 0.912

Cela signifie que 91,2% du temps, il a rappelé la note d’étoile de l’utilisateur si nous vérifions ses deux meilleures suppositions. C’est une bonne indication que le modèle n’est pas loin dans la plupart des cas.

Vous pouvez également essayer le modèle de manière interactive en exécutant le fasttext predict Commande, puis en tapant vos propres avis. Lorsque vous appuyez sur Entrée, il vous dira sa prédiction pour chacun:

fasttext predict reviews_model.bin -this is a terrible restaurant . i hate it so much .
__label__1
this is a very good restaurant .
__label__4
this is the best restaurant i have ever tried .
__label__5

Important: Vous devez saisir vos avis en minuscules et avoir espacé notre ponctuation tout comme les données de formation! Si vous ne formatez pas vos exemples de la même manière que les données de formation, le modèle fera très mal.

Étape 6: itérez sur le modèle pour le rendre plus précis

Avec les paramètres de formation par défaut, FastText suit chaque mot indépendamment et ne se soucie pas du tout de l’ordre des mots. Mais lorsque vous avez un large ensemble de données de formation, vous pouvez lui demander de prendre en considération l’ordre des mots en utilisant le wordNgrams paramètre. Cela le fera suivre des groupes de mots au lieu de simples mots individuels.

Pour un ensemble de données de millions de mots, le suivi des paires de deux mots (également appelés bigrams) Au lieu de mots simples est un bon point de départ pour améliorer le modèle.

Formons un nouveau modèle avec le -wordNgrams 2 paramètre et voir comment il fonctionne:

fasttext supervised -input fasttext_dataset_training.txt -output reviews_model_ngrams -wordNgrams 2

Cela permettra à la formation un peu plus de temps et cela rendra le fichier modèle beaucoup plus grand (car il y a maintenant une entrée pour chaque paire de deux mots dans les données), mais cela peut en valoir la peine si cela nous donne une précision plus élevée.

Une fois la formation terminée, vous pouvez réintégrer la commande de test de la même manière qu’auparavant:

fasttext test reviews_model_ngrams.bin fasttext_dataset_test.txt

Pour moi, en utilisant -wordNgrams 2 m’a fait une précision de 71,2% sur le test de test, une amélioration de près de 4%. Cela semble également réduire le nombre d’erreurs évidentes que le modèle fait parce qu’il se soucie maintenant un peu du contexte de chaque mot.

Il existe également d’autres moyens d’améliorer votre modèle. L’un des moyens les plus simples mais les plus efficaces consiste à écumer votre fichier de données d’entraînement à la main et à vous assurer que le code de prétraitement forme votre texte de manière saine.

Par exemple, mon exemple de code de prétraitement de texte Texte rendra le nom commun du restaurantP.F. Chang dans p . f . chang. Cela apparaît comme cinq mots distincts à FastText.

Si vous avez des cas comme celui-là où des mots importants qui représentent un seul concept sont divisés, vous pouvez écrire du code personnalisé pour le réparer. Dans ce cas, vous pouvez ajouter du code pour rechercher des noms de restaurants communs et les remplacer par des espaces réservés comme p_f_chang Donc, ce texte rapide les considère comme un seul mot.

Étape 7: Utilisez votre modèle dans votre programme!

La meilleure partie de FastText est qu’il est facile d’appeler un modèle formé à partir de n’importe quel programme Python.

Il existe quelques emballages Python différents pour FastText que vous pouvez utiliser, mais j’aime celui officiel créé par Facebook. Vous pouvez l’installer en suivant ces instructions.

Avec cela installé, voici l’intégralité du code pour charger le modèle et l’utiliser pour noter automatiquement les avis des utilisateurs:

Et voici à quoi ça ressemble quand il fonctionne:

☆☆☆☆☆ (100% confidence)
This restaurant literally changed my life. This is the best food I've ever eaten!
☆ (88% confidence)
I hate this place so much. They were mean to me.
☆☆☆ (64% confidence)
I don't know. It was ok, I guess. Not really sure what to say.

Ce sont de très bons résultats de prédiction! Et voyons quelle prédiction cela donnerait à ma revue Yelp:

☆☆☆☆☆ (58% confidence)
This used to be a giant parking lot where government employees that worked in the country building would park. They moved all the parking underground and built an awesome park here instead. It's literally the reverse of the Joni Mitchell song.

Parfait!

C’est pourquoi l’apprentissage automatique est si cool. Une fois que nous avons trouvé un bon moyen de poser le problème, l’algorithme a fait tout le travail acharné d’extraire le sens des données de formation. Vous pouvez ensuite appeler ce modèle à partir de votre code avec seulement quelques lignes de code. Et juste comme ça, votre programme gagne apparemment des superpuissances.

Maintenant, sortez et construisez votre propre classificateur de texte!



Source link

Related post