2014-03-27 16 views
12

Ich habe eine Reihe von Dateien mit Artikeln. Für jeden Artikel sollte es einige Funktionen geben, wie zum Beispiel: Textlänge, text_spam (alle sind Ints oder Floats, und in den meisten Fällen sollten sie von csv geladen werden). Und was ich tun möchte ist - diese Funktionen mit CountVectorizer zu kombinieren und diese Texte dann zu klassifizieren.Verketten benutzerdefinierter Funktionen mit CountVectorizer

Ich habe mir einige Tutorials angeschaut, aber ich habe immer noch keine Ahnung, wie ich das umsetzen soll. Gefunden etwas here, aber kann dies nicht wirklich für meine Bedürfnisse implementieren.

Irgendwelche Ideen, wie das mit Scikit getan werden könnte?

Vielen Dank.

Was ich über kam jetzt ist:

from sklearn.feature_extraction import DictVectorizer 
from sklearn.feature_extraction.text import CountVectorizer 
from sklearn.pipeline import FeatureUnion 

measurements = [ 
    {'text_length': 1000, 'text_spam': 4.3}, 
    {'text_length': 2000, 'text_spam': 4.1}, 
] 

corpus = [ 
    'some text', 
    'some text 2 hooray', 
] 

vectorizer = DictVectorizer() 
count_vectorizer = CountVectorizer(min_df=1) 

first_x = vectorizer.fit_transform(measurements) 
second_x = count_vectorizer.fit_transform(corpus) 

combined_features = FeatureUnion([('first', first_x), ('second', second_x)]) 

Für diese Reihe von Code Ich verstehe nicht, wie „real“ -Daten zu laden, da sind Trainingssätze bereits geladen. Und die zweite - wie man Kategorien lädt (y-Parameter für Fit-Funktion)?

Antwort

12

Sie sind Missverständnis FeatureUnion. Es sollte zwei Transformatoren, nicht zwei Chargen von Proben nehmen.

Sie können es in den Umgang mit den Vectorizern, die Sie haben, zwingen, aber es ist viel einfacher, nur alle Ihre Funktionen in einen großen Beutel pro Probe zu werfen und eine einzige DictVectorizer verwenden, um Vektoren aus diesen Taschen zu machen.

# make a CountVectorizer-style tokenizer 
tokenize = CountVectorizer().build_tokenizer() 

def features(document): 
    terms = tokenize(document) 
    d = {'text_length': len(terms), 'text_spam': whatever_this_means} 
    for t in terms: 
     d[t] = d.get(t, 0) + 1 
    return d 

vect = DictVectorizer() 
X_train = vect.fit_transform(features(d) for d in documents) 

Vergessen Sie nicht, dies mit sklearn.preprocessing.Normalizer zu normalisieren, und sich bewusst sein, dass auch nach Normalisierung, werden diese text_length Merkmale die anderen Funktionen im Hinblick auf Umfang beherrschen gebunden. Es könnte sinnvoller sein, stattdessen oder np.log(text_length) zu verwenden.

Und die zweite - wie man Kategorien (y Parameter für Fit-Funktion) zu laden?

Hängt davon ab, wie Ihre Daten organisiert sind. scikit-learn hat viele Hilfsfunktionen und Klassen, aber es erwartet, dass Sie Code schreiben, wenn Ihr Setup nicht standard ist.

Verwandte Themen