English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
This article shares the specific code for Python text feature extraction and vectorization for everyone's reference, as follows
Suppose we have just watched Christopher Nolan's epic movie 'Interstellar', and imagine how to let the machine automatically analyze the reviews of the audience to see if it is 'praise' (positive) or 'criticism' (negative)?
This type of problem belongs to sentiment analysis problems. The first step in dealing with this type of problem is to convert text into features.
Therefore, in this chapter, we will only learn the first step, how to extract features from text and vectorize them.
The processing of Chinese involves segmentation issues, so this article uses a simple example to illustrate how to use Python's machine learning library to extract features from English.
1、数据准备
Python's sklearn.datasets supports reading all classified text from directories. However, the directories must be organized according to the rule of one folder per label name. For example, the dataset used in this article has2des dossiers, un pour 'net', un pour 'pos', chaque dossier contient6Les fichiers texte sont répertoriés comme suit :
neg
1.txt
2.txt
......
pos
1.txt
2.txt
....
12Le contenu du fichier est résumé comme suit :
neg: merde. j'ai gaspi mon argent. gaspi d'argent. un film de merde. gaspi de temps. un film pourri. pos: nb! nb movie! nb! worth my money. I love this movie! a nb movie. worth it!
2、texte caractéristique
Comment extraire les attitudes émotionnelles de ces textes anglais et les classer ?
La méthode la plus directe consiste à extraire des mots. On considère généralement que de nombreux mots-clés peuvent refléter l'attitude de l'orateur. Par exemple, dans ce jeu de données simple, il est facile de découvrir que ceux qui disent 'shit' appartiennent toujours à la catégorie neg.
Bien sûr, le jeu de données mentionné précédemment est conçu de manière simple pour faciliter la description. Dans la vie réelle, un mot peut souvent avoir une attitude incertaine. Cependant, il y a toujours des raisons de croire que plus un mot apparaît dans la catégorie neg, plus il a de chances d'exprimer une attitude neg.
Nous avons également noté que certains mots sont sans pertinence pour la classification émotionnelle. Par exemple, les mots 'of', 'I' dans les données mentionnées précédemment. Ces mots ont un nom, c'est-à-direStop_Word”(mot d'arrêt). Ces mots peuvent être complètement ignorés sans statistiques. Il est évident que l'ignorer ces mots peut optimiser l'espace de stockage des enregistrements de fréquence de mot et accélérer la construction.
Il existe également un problème à considérer la fréquence de chaque mot comme une caractéristique importante. Par exemple, pour le mot 'movie' dans les données mentionnées précédemment, dans12dans les échantillons.5fois, mais il apparaît à peu près à égalité des deux côtés, sans grande distinction. Quant au mot 'worth', il apparaît2fois, mais il n'apparaît que dans la catégorie pos, ce qui signifie qu'il a une forte couleur émotionnelle, c'est-à-dire une grande distinction.
par conséquent, nous devons introduireTF-IDF(Term Frequency-Inverse Document FrequencyFréquence et Frequency Inverse du Document)et pour chaque mot, nous devons en faire une analyse plus approfondie.
TF (Frequency of Term)Le calcul de la TF est très simple, il s'agit de la fréquence d'apparition d'un mot Nt dans un document t. Par exemple, dans le document 'I love this movie', le TF du mot 'love' est1/4。1/2。
IDF (Frequency Inverse of Document)son sens est que pour un mot t donné, le nombre de documents qui contiennent ce mot Dt, représente la proportion de tous les documents de test D, et on prend le logarithme naturel.
par exemple, le mot 'movie' apparaît5fois, tandis que le nombre total de documents est12,par conséquent, l'IDF est ln(5/12)。
Il est évident que l'IDF est utilisé pour mettre en avant les mots qui apparaissent rarement mais ont une forte couleur émotionnelle. Par exemple, pour le mot 'movie', l'IDF = ln(12/5)=0.88,qui est beaucoup plus petit que l'IDF de 'love' = ln(12/1)=2。48。
TF-IDFIl suffit de multiplier les deux simples. De cette manière, nous pouvons obtenir le TF de chaque mot dans chaque document, c'est-à-dire-IDF est la valeur de caractéristique textuelle extraite.
3、向量化
Avec cette base, nous pouvons vectoriser le document. D'abord regardons le code, puis analysons le sens de la vectorisation :
#}} -*- coding: utf-8 -*- import scipy as sp import numpy as np from sklearn.datasets import load_files from sklearn.cross_validation import train_test_split from sklearn.feature_extraction.text import TfidfVectorizer '''Chargement des ensembles de données, séparation des ensembles de données80% d'entraînement,20% de test''' movie_reviews = load_files('endata') doc_terms_train, doc_terms_test, y_train, y_test\ = train_test_split(movie_reviews.data, movie_reviews.target, test_size = 0.3) '''MODELE DE ESPACE VECTEUR BOOLÉEN, VEUILLEZ NOTER, POUR LES Échantillons de test, ON APPELLE L'INTERFACE TRANSFORM''' count_vec = TfidfVectorizer(binary = False, decode_error = 'ignore',\ stop_words = 'english') x_train = count_vec.fit_transform(doc_terms_train) x_test = count_vec.transform(doc_terms_test) x = count_vec.transform(movie_reviews.data) y = movie_reviews.target print(doc_terms_train) print(count_vec.get_feature_names()) print(x_train.toarray()) print(movie_reviews.target)
Les résultats de l'exécution sont les suivants :
[b'gaspi de temps.', b'une merde de film.', b'un bon film.', b'J'aime ce film !', b'la merde.', b'vaut mon argent.', b'un film de merde.', b'en vaut la peine !']
['love', 'money', 'movie', 'nb', 'sb', 'shit', 'time', 'waste', 'worth']
[[ 0. 0. 0. 0. 0. 0. 0.70710678 0.70710678 0. ]
[ 0. 0. 0.60335753 0. 0. 0.79747081 0. 0. 0. ]
[ 0. 0. 0.53550237 0.84453372 0. 0. 0. 0. 0. ]
[ 0.84453372 0. 0.53550237 0. 0. 0. 0. 0. 0. ]
[ 0. 0. 0. 0. 0. 1. 0. 0. 0. ]
[ 0. 0.76642984 0. 0. 0. 0. 0. 0. 0.64232803]
[ 0. 0. 0.53550237 0. 0.84453372 0. 0. 0. 0. ]
[ 0. 0. 0. 0. 0. 0. 0. 1. ]]
[1 1 0 1 0 1 0 1 1 0 0 0]
La sortie de python est très confuse. Voici un tableau que j'ai fait :
À partir du tableau précédent, on peut observer les points suivants :
1Filtrage des mots d'arrêt.
Lors de l'initialisation de count_vec, nous avons passé stop_words = 'english' lors de la construction de count_vec, ce qui signifie que nous utilisons les mots d'arrêt par défaut en anglais. Vous pouvez utiliser count_vec.get_stop_words() pour consulter tous les mots d'arrêt intégrés dans TfidfVectorizer. Bien sûr, vous pouvez également passer votre propre liste de mots d'arrêt (comme ici, "movie").
2、TF-le calcul de l'IDF.
ici, le calcul de la fréquence des mots utilise le TfidfVectorizer de sklearn. Cette classe hérite de CountVectorizer, et sur la base des statistiques de fréquence des mots de base, elle ajoute des fonctions telles que TF-les fonctions comme IDF.
Nous constatons que les résultats calculés ici ne sont pas très différents de ceux que nous avons calculés précédemment. Parce que ici, lors de la construction de count_vec, max_df= a été passé par défaut1par conséquent, TF-l'IDF ont été traités pour normaliser, afin de restreindre toutes les valeurs à [0,1entre] et
3、le résultat de count_vec.fit_transform est une matrice énorme. Nous pouvons voir que le tableau ci-dessus contient de nombreux 0, donc sklearn utilise des matrices creuses en interne. Dans cet exemple, les données sont petites. Si les lecteurs sont intéressés, ils peuvent essayer des données réelles utilisées par les chercheurs en apprentissage automatique, provenant de l'Université Cornell :http://www.cs.cornell.edu/people/pabo/movie-review-data/. Ce site web propose de nombreuses ensembles de données, dont plusieurs2de bases de données de M, des exemples positifs et négatifs7autour de 00. Une telle taille de données n'est pas non plus très grande1minutes, il est encore possible de l'exécuter, je vous recommande de l'essayer. Cependant, il faut noter que ces ensembles de données peuvent présenter des caractères illégaux. Par conséquent, lors de la construction de count_vec, decode_error = 'ignore' a été passé pour ignorer ces caractères illégaux.
les résultats du tableau ci-dessus, c'est-à-dire l'entraînement8un échantillon de8un résultat d'une caractéristique. Ce résultat peut être classé par divers algorithmes de classification.
Voici la totalité du contenu de cet article, j'espère qu'il vous sera utile dans vos études, et j'espère que vous soutiendrez également le tutoriel d'alarme.
Déclaration : le contenu de cet article est来源于网络, appartient aux auteurs respectifs, le contenu est apporté par les utilisateurs d'Internet de manière spontanée et téléchargé individuellement, ce site Web ne détient pas de droits de propriété, n'a pas été traité par l'éditeur humain et n'assume aucune responsabilité juridique connexe. Si vous trouvez du contenu suspect de violation de droits d'auteur, vous êtes invité à envoyer un e-mail à : notice#oldtoolbag.com (veuillez remplacer # par @ lors de l'envoi d'un e-mail pour signaler une violation, et fournir des preuves pertinentes. Une fois vérifié, ce site supprimera immédiatement le contenu suspect de violation de droits d'auteur.)