English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Lernen von Textmerkmal extrahieren und Vectorisierungsalgorithmen mit Python

This article shares the specific code for Python text feature extraction and vectorization for everyone's reference, as follows

Suppose we have just watched Nolan's blockbuster 'Interstellar', and imagine how to let the machine automatically analyze the reviews of the movie by the audience, whether it is 'praise' (positive) or 'scold' (negative)?

This type of problem belongs to sentiment analysis problems. The first step in handling this type of problem is to convert text into features.

Therefore, in this chapter, we only learn the first step, how to extract features from text and vectorize them.

Since the processing of Chinese involves segmentation issues, 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 text from directories. However, the directories must be arranged according to the rule of one folder per label name. For example, the dataset used in this article has2tags, one of which is 'net', one is 'pos', and each directory has6The directory is as follows:

neg
    1.txt
    2.txt
    ......
pos
    1.txt
    2.txt
    ....

12The content of the file is summarized as follows:

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、文本特征

Wie kann man aus diesen englischen Texten die emotionale Haltung extrahieren und klassifizieren?

Der direkteste Ansatz ist, Wörter abzuheben. Es wird oft angenommen, dass viele Schlüsselwörter die Haltung des Sprechers widerspiegeln. Zum Beispiel kann in diesem einfachen Datensatz leicht festgestellt werden, dass jemand, der „shit“ sagt, unbedingt zur negativen Klasse gehört.

Natürlich wurde der Datensatz oben einfach gestaltet, um die Beschreibung zu erleichtern. In der Realität kann ein Wort oft eine zweifelhafte Haltung haben. Aber es gibt immer noch Gründe zu glauben, dass ein Wort, das häufiger in der negativen Klasse vorkommt, eine höhere Wahrscheinlichkeit hat, eine negative Haltung zu haben.
Wir haben auch bemerkt, dass einige Wörter für die Sentimentanalyse bedeutungslos sind. Zum Beispiel das Wort „of“ oder „I“ in den obigen Daten. Diese Wörter haben einen Namen,Stop_Word”(Stoppwörter)。Diese Wörter können vollständig ignoriert und nicht gezählt werden. Es ist offensichtlich, dass das Ignorieren dieser Wörter den Speicherplatz der Wortfrequenzdaten optimieren und die Geschwindigkeit der Erstellung beschleunigen kann.
Jede Wortfrequenz als wichtige Merkmale zu betrachten, gibt es auch ein Problem. Zum Beispiel das Wort „movie“ in den obigen Daten, in12Vorfällen auf5mal, aber sowohl die Anzahl der positiven als auch der negativen Vorkommen ist ähnlich, was keine Unterscheidungsfähigkeit hat. Und das Wort „worth“ tritt in2mal vorkommt, aber nur in der pos-Klasse vorkommt, was offensichtlich eine starke kognitive Farbe hat, d.h. eine hohe Unterscheidungsfähigkeit.

Daher müssen wirTF-IDF(Term Frequency-Inverse Document FrequencyWortfrequenz und Inverse Document Frequency) für jedes Wort eine weitere Überlegung zu treffen.

TF (Term Frequency)Die Berechnung ist einfach, sie bezieht sich auf ein Dokument t, die Häufigkeit, mit der ein Wort N_t im Dokument vorkommt. Zum Beispiel hat das Wort „love“ im Dokument „I love this movie“ eine TF von1/4。1/2。

IDF (Inverse Document Frequency)bedeutet, dass für ein bestimmtes Wort t, die Anzahl der Dokumente, in denen das Wort vorkommt, D_t, das Verhältnis des gesamten Testdokuments D ausmacht, und dann den natürlichen Logarithmus nimmt.
z.B. hat das Wort „movie“ in der Anzahl der Dokumente5mal, während die Anzahl der Dokumente12,daher ist die IDF = ln(5/12)。
Es ist offensichtlich, dass IDF dazu dient, Wörter hervorzuheben, die selten vorkommen, aber eine starke emotionale Farbe haben. Zum Beispiel hat das Wort „movie“ eine IDF von ln(12/5)=0.88,wesentlich kleiner als die IDF von „love“ = ln(12/1)=2。48。

TF-IDFMan multipliziert einfach beide Werte miteinander. Auf diese Weise kann man die TF (Term Frequency) für jedes Wort in jedem Dokument berechnen-IDF ist der Textmerkmalwert, den wir extrahieren.

3、向量化

Mit diesen Grundlagen können wir die Dokumente in Vektoren umwandeln. Lassen Sie uns den Code betrachten und die Bedeutung der Vectorisierung analysieren:

#}} -*- 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 
'''''Datenbank laden, Datenbank teilen80% Training,20% 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) 
'''''Vektorraummodell unter BOOL-Funktionseigenschaften, beachten Sie, dass für die Testmuster der transform-Interface aufgerufen wird''' 
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) 

Das Laufzeitergebnis ist wie folgt:
Zeitverschwendung., ein Schrottfilm., ein großartiger Film., Ich liebe diesen Film!., Schrott., es hat sich gelohnt., ein Schrottfilm., es hat sich gelohnt!]
['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]

Die Ausgabe von Python ist sehr durcheinander. Hier ist eine Tabelle, die ich erstellt habe:

Aus dem obigen Tisch kann man folgende Punkte erkennen:

1Filterung der Stoppwörter.

Bei der Initialisierung von count_vec haben wir stop_words = 'english' übergeben, was die Verwendung der Standard-Englisch-Stoppwörter bedeutet. Sie können alle Stoppwörter der eingebauten TfidfVectorizer mit count_vec.get_stop_words() ansehen. Natürlich können Sie auch Ihre eigene Stoppwörterliste übergeben (z.B. 'movie' hier)

2、TF-IDF-Berechnung hinzu.

hier wird die Berechnung der Häufigkeit der Wörter mit sklearn's TfidfVectorizer durchgeführt. Diese Klasse erbt von CountVectorizer und fügt auf der Grundlage der grundlegenden Häufigkeitszählung von CountVectorizer Funktionen wie TF-IDF und ähnliche Funktionen
Wir werden feststellen, dass das Ergebnis hier etwas anders ist als das, was wir zuvor berechnet haben. Weil hier count_vec beim Aufbau standardmäßig max_df=1daher TF-IDF wurden normiert, um alle Werte im Intervall [0,1zwischen]

3、count_vec.fit_transform ergibt eine riesige Matrix. Wir können in der obigen Tabelle sehen, dass es viele Nullen gibt, daher verwendet sklearn intern dünnbesetzte Matrizen. In diesem Beispiel sind die Daten较小.http://www.cs.cornell.edu/people/pabo/movie-review-data/. Diese Website bietet viele Datensätze, darunter einige2M Datenbanken, Positiv- und Negativbeispiele7ca. 00. Eine solche Datenmenge ist auch nicht groß1Minuten kann abgeschlossen werden, daher empfehlen wir, es auszuprobieren. Allerdings sollten Sie darauf achten, dass diese Datensätze möglicherweise illegalen Zeichen enthalten. Daher wurde bei der Erstellung von count_vec decode_error = 'ignore' übergeben, um diese illegalen Zeichen zu ignorieren.

Die Ergebnisse in der obigen Tabelle sind die Ergebnisse der Training8Ein Beispiel für eine Probe8Ein Ergebnis einer Eigenschaft. Dieses Ergebnis kann mit verschiedenen Klassifikationsalgorithmen klassifiziert werden.

Das ist der gesamte Inhalt dieses Artikels. Wir hoffen, dass er Ihnen bei Ihrem Lernen hilft und dass Sie die Anleitung von Rufen stark unterstützen.

Erklärung: Der Inhalt dieses Artikels wurde aus dem Internet übernommen und gehört dem Urheberrechtinhaber. Der Inhalt wurde von Internetnutzern freiwillig beigesteuert und hochgeladen. Diese Website besitzt keine Eigentumsrechte und hat den Inhalt nicht manuell bearbeitet. Sie übernimmt auch keine rechtlichen Verantwortlichkeiten. Wenn Sie Inhalte entdecken, die möglicherweise urheberrechtlich geschützt sind, sind Sie herzlich eingeladen, eine E-Mail an notice#w zu senden.3codebox.com (Bitte ersetzen Sie # durch @, wenn Sie eine Meldung senden, und fügen Sie relevante Beweise bei. Sobald nachgewiesen wird, dass die Inhalte urheberrechtlich geschützt sind, wird diese Website die fraglichen Inhalte sofort löschen.)

Gefällt mir