2016-07-30 24 views
0

Ich versuche, durch eine Reihe von Textdokumenten Schleife und eine Funktion, durch Aufnahme eingestellt erstellen:Wie schließe ich eine Listentyp-Funktion in den Klassifizierer "sklearn.svm.libsvm.fit()" ein?

  • Positionsliste in Text
  • Wortart von keyphrase
  • Länge jedes Schlüsselworts (Anzahl der Wörter)
  • Häufigkeit jedes Schlüsselworts

-Code-Snippet extraxting Features:

#Take list of Keywords 
keyword_list = [line.split(':')[1].lower().strip() for line in keywords.splitlines() if ':' in line ] 

#Position 
position_list = [ [m.start()/float(len(document)) for m in re.finditer(re.escape(kw),document,flags=re.IGNORECASE)] for kw in keyword_list] 

#Part of Speech 
pos_list = [] 
for key in keyword_list:  
    pos_list.append([pos for w,pos in nltk.pos_tag(nltk.word_tokenize(key))]) 

#Length of each keyword 
len_list = [ len(k.split(' ')) for k in keyword_list] 

#Text Frequency 
freq_list = [ len(pos)/float(len(document)) for pos in position_list] 

target.extend(keyword_list) 

for i in range(0,len(keyword_list)): 
    data.append([position_list[i],pos_list[i],len_list[i],freq_list[i]]) 

Wo

  • Ziel: Liste der Schlüsselwörter
  • Daten: Liste der Features

I dies durch einen Klassifikator weitergegeben:

from sklearn.cross_validation import train_test_split 
X_train,X_test,y_train,y_test = train_test_split(data,target,test_size=0.25,random_state = 42) 

import numpy as np 
X_train = np.array(X_train) 
y_train = np.array(y_train) 


from sklearn import svm 
cls = svm.SVC(gamma=0.001,C=100) # Parameter values Matter! 
cls.fit(X_train,y_train) 
predictions = cls.predict(X_test) 

Aber ich erhalte eine Fehlermeldung:

Traceback (most recent call last): 
    File "supervised_3.py", line 113, in <module> 
    cls.fit(X_train,y_train) 
    File "/Library/Python/2.7/site-packages/sklearn/svm/base.py", line 150, in fit 
    X = check_array(X, accept_sparse='csr', dtype=np.float64, order='C') 
    File "/Library/Python/2.7/site-packages/sklearn/utils/validation.py", line 373, in check_array 
    array = np.array(array, dtype=dtype, order=order, copy=copy) 
ValueError: setting an array element with a sequence 

So entfernte ich alle Listenelemente von

Ändern
data.append([position_list[i],pos_list[i],len_list[i],freq_list[i]]) 

zu

data.append([len_list[i],freq_list[i]]) 

Es hat funktioniert.

Aber ich muss schließen position_list und pos_list

Ich dachte, es hat nicht funktioniert, weil diese zwei Listen sind. Also habe ich versucht, sie in Arrays zu konvertieren:

aber ich bekomme immer noch den gleichen Fehler.

Antwort

0

Im letzten for-Schleife des Merkmalsextraktion Code, den Sie data eine Liste der vier Elemente anzuhängen versuchen, nämlich position_list[i], pos_list[i], len_list[i], freq_list[i]. Das Problem ist, dass die ersten beiden Elemente Listen selbst sind, aber einzelne Features müssen (aus diesem Grund ist das Problem nicht durch die Umwandlung der Unterlisten in numply Arrays gelöst werden). Jeder von ihnen erfordert eine andere Abhilfe:

  1. position_list[i]
    Dies ist eine Liste von Float-Zahlen. Sie könnten diese Liste durch einige daraus errechnete Statistiken ersetzen, zum Beispiel den Mittelwert und die Standardabweichung.
  2. pos_list[i]
    Dies ist eine Liste von Tags aus der Liste von Tupeln der Form (Token, tag) * durch nltk.pos_tag ergab extrahiert. Die Tags (die Strings sind) können auf einfache Art und Weise in Zahlen umgewandelt werden, indem ihre Anzahl von Vorkommen gezählt wird. Um die Dinge einfach zu halten, werde ich einfach die Häufigkeit von 'NN' und 'NNS' Tags hinzufügen **.

Um Ihren Code arbeitet für Schleife Sie müssen nur die letzte Änderung zu erhalten:

for i in range(0, len(keyword_list)): 
    positions_i = position_list[i] 
    tags_i = pos_list[i] 
    len_tags_i = float(len(tags_i)) 
    m = np.mean(positions_i) 
    s = np.std(positions_i) 
    nn = tags_i.count('NN')/len_tags_i 
    nns = tags_i.count('NNS')/len_tags_i 
    data.append([m, s, nn, nns, len_list[i], freq_list[i]]) 

Damit der resultierende Merkmalsvektor wird 6-dimensional. Unnötig zu erwähnen, dass Sie eine höhere oder niedrigere Anzahl von Statistiken und/oder Tag-Häufigkeiten oder sogar ein anderes Tagset verwenden könnten.

* Die Kennungen w,pos Sie in der for-Schleife verwenden, die pos_list sind ein wenig irreführend erzeugt.

** Sie könnten eine collections.Counter verwenden, um die Anzahl der Vorkommen jedes Tags effizienter zu zählen.

+0

Danke Tonechas! Ich habe das Programm zur Arbeit :) –