Ich versuche, eine der von scikit-learn überwachten Lernmethoden zu verwenden, um Textteile in eine oder mehrere Kategorien einzuteilen. Die Vorhersagefunktion aller Algorithmen, die ich ausprobiert habe, gibt nur eine Übereinstimmung zurück.
Zum Beispiel habe ich einen Text:
"Theaters in New York compared to those in London"
Und ich habe den Algorithmus so trainiert, dass er für jedes Textschnipsel, das ich füttere, einen Ort auswählt.
Im obigen Beispiel würde ich will es zurück New York
und London
, aber es gibt nur New York
.
Ist es möglich, mit scikit-learn mehrere Ergebnisse zurückzugeben? Oder sogar das Etikett mit der nächsthöheren Wahrscheinlichkeit zurückgeben?
Danke für Ihre Hilfe.
---Aktualisieren
Ich habe es versucht, OneVsRestClassifier
aber ich bekomme immer noch nur eine Option pro Textstück zurück. Unten ist der Beispielcode, den ich verwende
y_train = ('New York','London')
train_set = ("new york nyc big apple", "london uk great britain")
vocab = {'new york' :0,'nyc':1,'big apple':2,'london' : 3, 'uk': 4, 'great britain' : 5}
count = CountVectorizer(analyzer=WordNGramAnalyzer(min_n=1, max_n=2),vocabulary=vocab)
test_set = ('nice day in nyc','london town','hello welcome to the big apple. enjoy it here and london too')
X_vectorized = count.transform(train_set).todense()
smatrix2 = count.transform(test_set).todense()
base_clf = MultinomialNB(alpha=1)
clf = OneVsRestClassifier(base_clf).fit(X_vectorized, y_train)
Y_pred = clf.predict(smatrix2)
print Y_pred
Ergebnis: ['New York' 'London' 'London']
quelle
min_n
undmax_n
. Ich muss sie ändern, umngram_range=(1,2)
zu arbeitenBEARBEITEN: Aktualisiert für Python 3, scikit-learn 0.18.1 mit MultiLabelBinarizer wie vorgeschlagen.
Ich habe auch daran gearbeitet und die ausgezeichnete Antwort von mwv leicht verbessert, die nützlich sein könnte. Es werden eher Textbeschriftungen als binäre Beschriftungen als Eingabe verwendet und mit MultiLabelBinarizer codiert.
import numpy as np from sklearn.pipeline import Pipeline from sklearn.feature_extraction.text import CountVectorizer from sklearn.svm import LinearSVC from sklearn.feature_extraction.text import TfidfTransformer from sklearn.multiclass import OneVsRestClassifier from sklearn.preprocessing import MultiLabelBinarizer X_train = np.array(["new york is a hell of a town", "new york was originally dutch", "the big apple is great", "new york is also called the big apple", "nyc is nice", "people abbreviate new york city as nyc", "the capital of great britain is london", "london is in the uk", "london is in england", "london is in great britain", "it rains a lot in london", "london hosts the british museum", "new york is great and so is london", "i like london better than new york"]) y_train_text = [["new york"],["new york"],["new york"],["new york"],["new york"], ["new york"],["london"],["london"],["london"],["london"], ["london"],["london"],["new york","london"],["new york","london"]] X_test = np.array(['nice day in nyc', 'welcome to london', 'london is rainy', 'it is raining in britian', 'it is raining in britian and the big apple', 'it is raining in britian and nyc', 'hello welcome to new york. enjoy it here and london too']) target_names = ['New York', 'London'] mlb = MultiLabelBinarizer() Y = mlb.fit_transform(y_train_text) classifier = Pipeline([ ('vectorizer', CountVectorizer()), ('tfidf', TfidfTransformer()), ('clf', OneVsRestClassifier(LinearSVC()))]) classifier.fit(X_train, Y) predicted = classifier.predict(X_test) all_labels = mlb.inverse_transform(predicted) for item, labels in zip(X_test, all_labels): print('{0} => {1}'.format(item, ', '.join(labels)))
Dies gibt mir die folgende Ausgabe:
nice day in nyc => new york welcome to london => london london is rainy => london it is raining in britian => london it is raining in britian and the big apple => new york it is raining in britian and nyc => london, new york hello welcome to new york. enjoy it here and london too => london, new york
quelle
labelBinarizer
ist veraltet. Verwenden Sielb = preprocessing.MultiLabelBinarizer()
stattdessenNew York
und sindLondon
.classif = OneVsRestClassifier(SVC(kernel='linear'))
. Verwirrt.Ich bin auch darauf gestoßen, und das Problem für mich war, dass mein y_Train eher eine Folge von Strings als eine Folge von Folgen von String war. Anscheinend wird OneVsRestClassifier basierend auf dem Eingabeetikettenformat entscheiden, ob mehrere Klassen oder mehrere Etiketten verwendet werden sollen. Also ändere:
y_train = ('New York','London')
zu
y_train = (['New York'],['London'])
Anscheinend wird dies in Zukunft verschwinden, da alle Etiketten gleich sind: https://github.com/scikit-learn/scikit-learn/pull/1987
quelle
Ändern Sie diese Zeile, damit sie in neuen Python-Versionen funktioniert
# lb = preprocessing.LabelBinarizer() lb = preprocessing.MultiLabelBinarizer()
quelle
Einige Beispiele für Mehrfachklassifizierungen sind wie folgt: -
Beispiel 1:-
import numpy as np from sklearn.preprocessing import LabelBinarizer encoder = LabelBinarizer() arr2d = np.array([1, 2, 3,4,5,6,7,8,9,10,11,12,13,14,1]) transfomed_label = encoder.fit_transform(arr2d) print(transfomed_label)
Ausgabe ist
[[1 0 0 0 0 0 0 0 0 0 0 0 0 0] [0 1 0 0 0 0 0 0 0 0 0 0 0 0] [0 0 1 0 0 0 0 0 0 0 0 0 0 0] [0 0 0 1 0 0 0 0 0 0 0 0 0 0] [0 0 0 0 1 0 0 0 0 0 0 0 0 0] [0 0 0 0 0 1 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 1 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 1 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 1 0 0 0 0 0] [0 0 0 0 0 0 0 0 0 1 0 0 0 0] [0 0 0 0 0 0 0 0 0 0 1 0 0 0] [0 0 0 0 0 0 0 0 0 0 0 1 0 0] [0 0 0 0 0 0 0 0 0 0 0 0 1 0] [0 0 0 0 0 0 0 0 0 0 0 0 0 1] [1 0 0 0 0 0 0 0 0 0 0 0 0 0]]
Beispiel 2: -
import numpy as np from sklearn.preprocessing import LabelBinarizer encoder = LabelBinarizer() arr2d = np.array(['Leopard','Lion','Tiger', 'Lion']) transfomed_label = encoder.fit_transform(arr2d) print(transfomed_label)
Ausgabe ist
[[1 0 0] [0 1 0] [0 0 1] [0 1 0]]
quelle