Einige Zweifel, die einige Features für die Bibliothek libsvm / scikit-learn in Python modellieren

8

Ich habe eine Menge ebay-Titel wie diesen geschabt:

%Vor%

und ich habe alle auf diese Weise manuell markiert

%Vor%

wobei B = Marke (Apple) M = Modell (iPhone 5) C = Farbe (Weiß) S = Größe (Größe) NA = Nicht zugewiesen (Dual Core)

Jetzt muss ich einen SVM-Klassifikator trainieren, der die libsvm-Bibliothek in Python verwendet, um die Sequenzmuster zu lernen, die in den ebay-Titeln vorkommen.

Ich muss einen neuen Wert für diese Attribute (Marke, Modell, Farbe, Größe) extrahieren, indem ich das Problem als eine Klassifizierung betrachte. Auf diese Weise kann ich neue Modelle vorhersagen.

Ich möchte diese Features darstellen, um sie als Eingabe für die libsvm-Bibliothek zu verwenden. Ich arbeite in Python: D.

  
  1. Identität des aktuellen Wortes
  2.   

Ich denke, dass ich es so interpretieren kann

%Vor%

Wenn ich weiß, dass das Wort eine Marke ist, setze ich diese Variable auf 1 (wahr). Es ist in Ordnung, dies im Trainingstest zu tun (weil ich alle Wörter markiert habe), aber wie kann ich das für das Testset tun? Ich weiß nicht, was die Kategorie eines Wortes ist (deshalb lerne ich es: D).

  
  1. N-Gramm-Teilkettenmerkmale des aktuellen Wortes (N = 4,5,6)
  2.   

Keine Ahnung, was heißt das?

  
  1. Identität von zwei Wörtern vor dem aktuellen Wort.
  2.   

Wie kann ich diese Funktion modellieren?

In Anbetracht der Legende, die ich für das erste Feature erstellt habe, habe ich 5 ^ (5) Kombination)

%Vor%

Wie kann ich es in ein Format konvertieren, das die libsvm (oder scikit-learn) verstehen kann?

%Vor%

Wie kann ich das nochmal machen? Da ich 4 Wörterbücher (für Farbe, Größe, Modell und Marke) habe, muss ich eine bool Variable erstellen, die ich genau dann auf true setzen werde, wenn ich eine Übereinstimmung des aktuellen Wortes in einem der 4 Wörterbücher habe.

>
  
  1. Exklusive Mitgliedschaft im Wörterbuch der Markennamen
  2.   

Ich denke, dass ich wie im 4. Feature eine bool-Variable verwenden muss. Stimmen Sie zu?

Wenn dieser Frage einige Informationen fehlen, lesen Sie bitte meine vorherige Frage unter dieser Adresse: Support Vektor Maschine in Python mit libsvm Beispiel für Features

Letzter Zweifel: Wenn ich einen Multi-Token-Wert wie iPhone 5 habe ... muss ich das iPhone wie eine Marke markieren und 5 mag auch eine Marke oder ist es besser, {iPhone 5} alle als Marke zu markieren?

Im Testdatensatz iPhone und 5 wird 2 getrennt Wort sein ... also was ist besser zu tun?

    
Usi Usi 28.06.2015, 19:51
quelle

1 Antwort

8

Der Grund, warum die in der vorherigen Frage vorgeschlagene Lösung ungenügende Ergebnisse hatte (ich nehme an) - ist, dass die Funktion für dieses Problem schlecht war.

Wenn ich es richtig verstehe, ist das Folgende:

gegeben den Satz -

  

Apple iPhone 5 Weiß 16 GB Dual-Core

Sie bekommen -

  

B M C S NA

Das hier beschriebene Problem entspricht dem Wortmarkierungsteil (POS) in natürlicher Sprache Verarbeitung.

Betrachten Sie den folgenden Satz auf Englisch:

  

Wir haben den gelben Hund gesehen

Die Aufgabe von POS besteht darin, für jedes Wort die passende Kennzeichnung zu geben. In diesem Fall:

  

Wir (PRP) sahen (VBD) den (DT) gelben (JJ) Hund (NN)

Investieren Sie nicht die Zeit, um die Tags in Englisch zu verstehen, da ich es hier nur um Ihnen zu zeigen, dass Ihr Problem und POS gleich sind.

Bevor ich erkläre, wie ich es mit SVM lösen kann, möchte ich Sie auf andere Ansätze aufmerksam machen: Betrachten Sie den Satz Apple iPhone 5 White 16GB Dual-Core als Testdaten. Die Variable, die Sie auf das Wort Apple gesetzt haben, muss dem Tagger als Eingabe übergeben werden, wenn Sie das Wort iPhone markieren. Nachdem Sie jedoch ein Wort mit einem Wort versehen haben, ändern Sie es nicht. Daher haben Modelle, die Sequance-Tagging durchführen, in der Regel bessere Ergebnisse. Das einfachste Beispiel ist Hidden Markov Models (HMM). Hier ist eine kurze Einführung zu HMM in POS.

Nun modellieren wir dieses Problem als Klassifikationsproblem. Lassen Sie uns definieren, was ein Fenster ist -

%Vor%

Hier haben wir ein Fenster der Größe 2. Wenn wir das Wort W0 klassifizieren, benötigen wir die Merkmale aller Wörter im Fenster (verkettet). Bitte beachten Sie, dass wir für das erste Wort des Satzes verwenden werden:

%Vor%

Um die Tatsache zu modellieren, dass dies das erste Wort ist. Für das zweite Wort haben wir:

%Vor%

Und ähnlich für die Wörter am Ende des Satzes. Die Tags START-2 , START-1 , STOP1 , STOP2 müssen dem Modell zwei hinzugefügt werden.

Nun wollen wir beschreiben, welche Funktionen zum Taggen von W0 verwendet werden:

%Vor%

Die Merkmale eines Tokens sollten das Wort selbst und das Tag (dem vorherigen Wort) sein. Wir werden binäre Features verwenden.

Beispiel - Erstellen der Feature-Repräsentation:

Schritt 1 - Erstellen der Wortdarstellung für jedes Token :

Nehmen wir eine Fenstergröße von 1. Wenn wir ein Token klassifizieren, verwenden wir W-1,W0,W1 . Nehmen wir an, Sie bauen ein Wörterbuch und geben jedem Wort im Korpus eine Nummer:

%Vor%

Schritt 2 - Feature-Token für jedes Tag :

Wir erstellen Features für die folgenden Tags:

%Vor%

Lässt einen Feature-Vektor für START-1,Apple,iPhone 5 erstellen: Das erste Token ist ein Wort mit bekanntem Tag ( START-1 hat immer das Tag START-1 ). Die Features für dieses Token sind also:

%Vor%

(Die Features, die 1 sind: mit dem Wort START-1 und dem Tag START-1 )

Für das Token Apple :

%Vor%

Beachten Sie, dass wir für jedes Wort vor W0 bereits berechnete Tags verwenden (da wir es bereits berechnet haben). Ebenso die Eigenschaften des Tokens iPhone 5 :

%Vor%

Schritt 3 verknüpft alle Funktionen :

Im Allgemeinen sind die Funktionen für 1-Fenster:

%Vor%

In Bezug auf Ihre Frage - ich würde ein weiteres Tag verwenden - number -, so dass beim Markieren des Wortes 5 (da Sie den Titel mit Leerzeichen teilen) das Feature W0 eine 1 für eine Zahl haben wird Feature und 1 in W-1 's model Tag - falls das vorherige Token korrekt als Modell markiert wurde.

Zusammenfassend, was Sie tun sollten:

  1. geben Sie jedem Wort in den Daten eine Zahl
  2. Build-Feature-Repräsentation für die Zugdaten (unter Verwendung der Tags, die Sie bereits manuell berechnet haben)
  3. Trainiere ein Modell
  4. Beschriften Sie die Testdaten

Letzter Hinweis - ein warmer Tipp für vorhandenen Code:

Sie können den in Python implementierten POS-Tagger finden hier . Es enthält eine Erklärung des Problems und des Codes, und es macht auch diese Funktionsextraktion, die ich gerade für Sie beschrieben habe. Darüber hinaus verwendeten sie set für die Darstellung des Merkmals jedes Wortes, so dass der Code viel einfacher zu lesen ist.

Die Daten, die dieser Tagger empfängt, sollten folgendermaßen aussehen:

%Vor%

Die Funktionsextraktion funktioniert auf diese Weise (mehr dazu unter dem obigen Link):

%Vor%

Für das obige Beispiel:

%Vor%

Im Allgemeinen ist word der String des aktuellen Wortes, context ist der Titel, der in die Liste aufgeteilt wird, und prev ist der Tag, den Sie für das vorherige Wort erhalten haben.

Ich benutze diesen Code in der Vergangenheit, er arbeitet schnell mit großartigen Ergebnissen. Hoffe es ist klar, Viel Spaß beim Taggen!

    
omerbp 03.07.2015, 08:51
quelle