2016-07-30 114 views
0

我通過一些文本文件,試圖循環,創造由記錄設置一個特點:如何在sklearn.svm.libsvm.fit()分類器中包含列表類型功能?

  • 位置列表文本
  • 的關鍵詞
  • 的講話的部分
  • 長度 (每個關鍵詞的數量)
  • 頻率的每個關鍵語句
  • 的extraxting特點

代碼片段:

#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]]) 

  • 目標:功能列表

我:關鍵字

  • 數據名單通過分級通過這樣的:

    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) 
    

    但我得到一個錯誤:

    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 
    

    所以,我刪除了所有的列表項通過改變

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

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

    它工作。

    但我需要包括position_listpos_list

    我認爲這是不工作,因爲這些2列表。所以,我試圖將它們轉換爲數組:

    data.append([np.array(position_list[i]),np.array(pos_list[i]),len_list[i],freq_list[i]]) 
    

    但我仍然得到相同的錯誤。

  • 回答

    0

    在最後要嘗試將追加到data四個要素,即position_list[i]pos_list[i]len_list[i]freq_list[i]列表特徵提取代碼的循環。問題是前兩個元素本身是列​​表,但是個別特徵必須是(這就是爲什麼通過將子列表轉換爲numpy數組無法解決問題的原因)。他們每個人都需要不同的解決方法:

    1. position_list[i]
      這是浮點數的列表。你可以用它的一些統計數據來替換這個列表,例如平均值和標準偏差。
    2. pos_list[i]
      這是從由nltk.pos_tag得到的形式(標記,標籤)*的元組的列表中提取的標籤列表。通過計算它們的出現次數,標籤(即字符串)可以直接轉換爲數字。爲了簡單起見,我只會加上頻率'NN''NNS'標籤**

    爲了讓你的代碼工作,你只需要改變的最後一個for循環:

    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]]) 
    

    通過這樣做所產生的特徵向量變爲6維。毋庸置疑,您可以使用更高或更低數量的統計和/或標籤頻率,甚至可以使用不同的標籤集。

    *w,pos您在for循環創建pos_list使用標識符是有點誤導。

    **您可以利用collections.Counter更有效地計算每個標籤的出現次數。

    +0

    謝謝你!我得到了該計劃的工作:) –

    相關問題