English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
This article shares the specific code for Python text feature extraction and vectorization, for your reference, as follows
Suppose we just watched Nolan's blockbuster 'Interstellar'. Imagine how to let the machine automatically analyze the reviews of the audience to determine whether the evaluation is 'praise' (positive) or 'scold' (negative).
This type of problem belongs to sentiment analysis. The first step in dealing with this type of problem is to convert the text into features.
Therefore, in this chapter, we will only learn the first step, how to extract features from text and vectorize them.
Since the processing of Chinese involves word segmentation, this article uses a simple example to illustrate how to use Python's machine learning library to extract features from English.
1、Data preparation
Python's sklearn.datasets supports reading all classified texts from a directory. However, the directory must be organized according to the rule of one folder per label. For example, the dataset used in this article has 2 labels, one named 'net', and one named 'pos', with 6 text files under each directory. The directory is as follows:
neg
1.txt
2.txt
......
pos
1.txt
2.txt
....
Il contenuto di 12 file è riassunto come segue:
neg: shit. waste my money. waste of money. sb movie. waste of time. a shit movie. pos: nb! nb movie! nb! worth my money. I love this movie! a nb movie. worth it!
2、Testo caracteristico
Come possiamo estrarre l'atteggiamento emotivo da questi testi e classificarli?
Il metodo più diretto è estrarre le parole. Si ritiene solitamente che molte parole chiave possano riflettere l'atteggiamento del parlante. Ad esempio, in questo dataset semplice, è facile notare che chi dice 'shit' appartiene sempre al negativo.
Certo, il dataset sopra è stato progettato in modo semplice per facilitare la descrizione. Nella realtà, una parola spesso ha un atteggiamento ambiguo. Tuttavia, c'è ancora ragione per credere che più una parola appare nel negativo, maggiore è la probabilità che rappresenti un atteggiamento negativo.
Notiamo anche che alcune parole non hanno alcun significato per la classificazione emotiva. Ad esempio, le parole “of” e “I” menzionate nel dataset. Questo tipo di parole ha un nome, chiamato “Stop_Word”。Questi termini possono essere ignorati completamente senza statistica. È ovvio che ignorare questi termini può ottimizzare lo spazio di archiviazione delle registrazioni di frequenza delle parole e accelerare la costruzione.
è un problema avere la frequenza di ogni parola come caratteristica importante. Ad esempio, nel dataset menzionato, la parola “movie” è stata utilizzata 5 volte in 12 campioni, ma è apparsa circa lo stesso numero di volte sia in negativo che in positivo, non offrendo molta discriminazione. La parola “worth” è stata utilizzata 2 volte, ma è comparsa solo nella classe pos, quindi ha un forte carico emotivo, ossia una alta discriminazione.
Dunque, dobbiamo introdurreTF-IDF(Term Frequency-Inverse Document Frequency,Frequenza di Parola e Frequenza Inversa di DocumentoConsidera ulteriormente ogni parola.
TF (Frequenza di Parola)Il calcolo è semplice, è il tasso di frequenza di una parola Nt in un documento t. Ad esempio, nel documento “I love this movie”, la frequenza TF della parola “love” è 1/4. Se si rimuovono i termini di stop “I” e “it”, diventa 1/2.
IDF (Frequency Inversa di Documento)Il significato è che per una parola t, il numero di documenti Dt che contengono la parola, rappresenta la proporzione di tutti i documenti di test D, e poi calcolare il logaritmo naturale.
Ad esempio, la parola “movie” è stata utilizzata 5 volte, mentre il numero totale di documenti è 12, quindi l'IDF è ln(5/12).
Evidentemente, l'IDF è progettato per evidenziare quei termini che appaiono raramente ma con un forte carico emotivo. Ad esempio, per la parola “movie”, IDF=ln(12/5)=0.88, molto meno rispetto a quello di “love”, che è ln(12/1)=2.48.
TF-IDFè sufficiente moltiplicare semplicemente i due valori. In questo modo, calcolare il TF-IDF di ogni parola in ogni documento è ciò che otteniamo come valore di caratteristica del testo.
3、trasformazione in vettore
Con queste basi, possiamo trasformare i documenti in vettori. Vediamo prima il codice, poi analizziamo il significato della trasformazione in vettori:
# -*- coding: utf-8 -*- importa scipy come sp importa numpy come np importa da sklearn.datasets load_files importa da sklearn.cross_validation train_test_split importa da sklearn.feature_extraction.text TfidfVectorizer '''加载数据集,切分数据集80%训练,20%测试''' 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) '''BOOL型特征下的向量空间模型,注意,测试样本调用的是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)
Risultato dell'esecuzione:
[b'waste of time.', b'a shit movie.', b'a nb movie.', b'I love this movie!', b'shit.', b'worth my money.', b'sb movie.', b'worth it!']
['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.76642984 0. 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]
L'output di Python è molto confuso. Ho creato una tabella come segue:
Dal grafico precedente si possono notare i seguenti punti:
1、停用词的过滤。
Quando iniziamo count_vec, passiamo stop_words = 'english' per utilizzare i vocaboli停用词 predefiniti in inglese. Puoi anche passare una lista di vocaboli停用词 personali (ad esempio, qui “movie”)
2、TF-IDF的计算。
Qui il calcolo della frequenza delle parole utilizza TfidfVectorizer di sklearn. Questa classe deriva da CountVectorizer, che aggiunge funzionalità come TF-IDF alla base del conteggio delle frequenze di CountVectorizer.
Noteremo che i risultati calcolati qui sono diversi dai precedenti. Poiché count_vec è costruito con max_df=1 di default, TF-IDF ha fatto la normalizzazione, per limitare tutti i valori tra [0,1].
3, il risultato di count_vec.fit_transform è una matrice enorme. Possiamo vedere che ci sono molti 0 nella tabella sopra, quindi sklearn utilizza matrici sparse internamente. I dati di questo esempio sono piccoli. Se gli utenti sono interessati, possono provare dati reali utilizzati dai ricercatori di machine learning, provenienti dall'Università di Cornell:http://www.cs.cornell.edu/people/pabo/movie-review-data/. Questo sito web offre molti set di dati, tra cui alcuni database di circa 2M e circa 700 esempi positivi e negativi. Questa scala di dati non è grande, può essere completata in un minuto, e si consiglia di provarlo. Tuttavia, è necessario notare che questi set di dati potrebbero avere problemi di caratteri illegali. Pertanto, decode_error = 'ignore' è stato passato a count_vec per ignorare questi caratteri illegali.
Il risultato della tabella sopra è un risultato di 8 caratteristiche di 8 campioni. Questo risultato può essere classificato utilizzando vari algoritmi di classificazione.
Questo è tutto il contenuto dell'articolo, speriamo che sia utile per la tua apprendimento e che tu sostenga fortemente la guida di urla.
Dichiarazione: il contenuto di questo articolo è stato tratto da Internet, il diritto d'autore è di proprietà del rispettivo proprietario, il contenuto è stato contribuito e caricato autonomamente dagli utenti di Internet, questo sito non detiene il diritto di proprietà, non è stato editato manualmente e non assume responsabilità per le relative responsabilità legali. Se trovi contenuti sospetti di violazione del copyright, ti preghiamo di inviare una e-mail a: notice#oldtoolbag.com (al momento dell'invio dell'e-mail, sostituisci # con @) per segnalare e fornire prove pertinenti. Una volta verificata, questo sito eliminerà immediatamente i contenuti sospetti di violazione del copyright.