2016-07-30 5 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]]) 
    

    • ターゲット:キーワードのリストが
    • データ:機能のリスト

    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([len_list[i],freq_list[i]]) 
    

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

    を変更することにより、すべてのリスト項目を削除しました

    それは働いた。

    しかし、私はこれらの2がリストされているので、それが働いていなかったと思っposition_listpos_list

    を含める必要があります。だから、私はそれらを配列に変換しようとしました:

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

    私はまだ同じエラーが発生します。

    あなたがdataに、4つの要素、すなわち、position_list[i]pos_list[i]len_list[i]freq_list[i]のリストを追加しようとしている特徴抽出コードのループの最後で

    答えて

    0

    。問題は最初の2つの要素はリストそのものですが、個々の機能はエスカラーでなければなりません(サブリストを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次元になります。言うまでもなく、より高いまたはより少ない数の統計および/またはタグ頻度、または異なるタグセットを使用することができます。

    *pos_listを作成するforループで使用する識別子w,posは少し誤解を招くことがあります。

    **collections.Counterを使用すると、各タグの出現回数をより効率的にカウントできます。

    +0

    thanks tonechas!私は仕事をするプログラムを持っている:) –

    関連する問題