2016-05-15 3 views
0

Angenommen, ich habe ein Array von Strings:Scikit-lernen: Wie Features aus dem Text extrahieren?

['Laptop Apple Macbook Air A1465, Core i7, 8Gb, 256Gb SSD, 15"Retina, MacOS' ... 'another device description'] 

Ich möchte aus dieser Beschreibung Merkmale extrahieren, wie:

item=Laptop 
brand=Apple 
model=Macbook Air A1465 
cpu=Core i7 
... 

Soll ich die vordefinierten bekannten Merkmale zuerst vorbereiten? Wie

brands = ['apple', 'dell', 'hp', 'asus', 'acer', 'lenovo'] 
cpu = ['core i3', 'core i5', 'core i7', 'intel pdc', 'core m', 'intel pentium', 'intel core duo'] 

Ich bin nicht sicher, dass ich CountVectorizer und TfidfVectorizer hier verwenden muß, es besser geeignet ist DictVictorizer zu haben, aber wie kann ich dicts mit Tasten Werte aus dem gesamten String zu extrahieren?

ist es mit scikit-learns Feature Extraction möglich? Oder sollte ich meine eigenen .fit(), und .transform() Methoden machen?

UPDATE: @sergzach, lesen Sie bitte, wenn ich Sie richtig verstanden:

data = ['Laptop Apple Macbook..', 'Laptop Dell Latitude...'...] 

for d in data: 
    for brand in brands: 
     if brand in d: 
      # ok brand is found 
for model in models: 
     if model in d: 
      # ok model is found 

So für jede Funktion N-Schleifen zu schaffen? Dies könnte funktionieren, aber nicht sicher, ob es richtig und flexibel ist.

+0

Sie können manuell eine Liste aller Marken erstellen, diese dann extrahieren (wahrscheinlich mit str.lower() und unnötige Zeichen entfernen) und dann prüfen, ob sie am häufigsten erkannt werden. Sehen Sie sich dann Funktionen an, die nicht erkannt wurden und entscheiden Sie, was Sie damit machen sollen. Konvertiere sie dann mit DV.fit_transform in numerische Features, skaliere sie und verwende sie als Zahlen. – sergzach

+0

@sergzach Danke, ich habe meine Frage aktualisiert, könnten Sie bitte überprüfen? – Novitoll

+0

Ich denke du könntest 'CountVectorizer()' von sklearn wie hier erwähnt verwenden: http://scikit-learn.org/stable/tutorial/text_analytics/working_with_text_data.html#tokenizing-text-with_script-learn. Aber in jedem Fall sollten Sie Daten für 'fit_transform()' vorbereiten. – sergzach

Antwort

0

Ja, etwas wie das nächste.

Entschuldigung, wahrscheinlich sollten Sie den unten stehenden Code korrigieren.

import re 

data = ['Laptop Apple Macbook..', 'Laptop Dell Latitude...'...] 

features = { 
    'brand': [r'apple', r'dell', r'hp', r'asus', r'acer', r'lenovo'], 
    'cpu': [r'core\s+i3', r'core\s+i5', r'core\s+i7', r'intel\s+pdc', r'core\s+m', r'intel\s+pentium', r'intel\s+core\s+duo'] 
    # and other features 
} 

cat_data = [] # your categories which you should convert into numbers 

not_found_columns = [] 

for line in data: 
    line_cats = {} 

    for col, features in features.iteritems(): 
     for i, feature in enumerate(features): 
      found = False 

      if re.findall(feature, line.lower(), flags=re.UNICODE) != []: 
       line_cats[col] = i + 1 # found numeric category in column. For ex., for dell it's 2, for acer it's 5.    
       found = True 
       break # current category is determined by a first occurence 

     # cycle has been end but feature had not been found. Make column value as default not existing feature 
     if not found:  
      line_cats[col] = 0 
      not_found_columns.append((col, line)) 

     cat_data.append(line_cats) 

# now we have cat_data where each column is corresponding to a categorial (index+1) if a feature had been determined otherwise 0. 

Jetzt haben Sie die Spaltennamen mit Linien (not_found_columns), die nicht gefunden wurde. Sehen Sie sie an, wahrscheinlich haben Sie einige Funktionen vergessen.

Wir können auch Strings (anstelle von Zahlen) als Kategorien schreiben und dann DV verwenden. Im Ergebnis sind die Ansätze gleichwertig.

+0

Danke. Ich dachte, es gibt bereits eingebaute Methode in sciki-lernen für wie Lösung. Aber wissen Sie, es macht mehr Sinn. Danke noch einmal. :) – Novitoll

+0

@ Novitoll Mai sein. Aber viele solcher Methoden erfordern in jedem Fall vorbereitete Daten. Du könntest auf eine andere Antwort warten, es ist auch für mich interessant, was die Leute denken. – sergzach

0

Die Vektorisierer von Scikit Learn konvertieren ein Array von Strings in eine invertierte Indexmatrix (2D-Array mit einer Spalte für jeden gefundenen Begriff/Wort). Jede Zeile (1. Dimension) im ursprünglichen Array wird einer Zeile in der Ausgabematrix zugeordnet. Jede Zelle enthält eine Zählung oder eine Gewichtung, abhängig davon, welche Art von Vektorisierer Sie verwenden und welche Parameter verwendet werden.

Ich bin nicht sicher, dass das ist, was Sie brauchen, basierend auf Ihrem Code. Können Sie sagen, wo Sie diese Funktionen verwenden möchten? Beabsichtigen Sie einen Klassifikator zu trainieren? Zu welchem ​​Zweck?