2016-05-15 14 views
0

は、私は文字列の配列があるとします。Scikit-learn:テキストからフィーチャーを抽出する方法は?

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

私のようなこの記述の特徴から抽出したい:私は最初に事前定義された既知の特徴を準備する必要があります

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

?同様

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

は私がここにCountVectorizerTfidfVectorizerを使用する必要があることを確認していない、それはDictVictorizerを持っている方が適切だが、どのように私は、全体の文字列から値を抽出キーでdictsを作ることができますか?

scikit-learnのFeature Extractionで可能ですか?または私自身の.fit().transform()メソッドを作成する必要がありますか?

UPDATE:私はあなたが右の理解場合 @sergzach、確認してください:

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 

をので、各機能ごとにN-ループを作成?これは機能しているかもしれませんが、それが正しいかどうかはわかりません。

+0

すべてのブランドのリストを手作業で作成し、テキストから文字列を抽出して(おそらくstr.lower()で不要な文字を取り除く)、それらがほとんど認識されているかどうかを確認できます。次に、認識されなかった機能を表示し、それらと何をすべきかを決定します。その後、DV.fit_transformを使用して数値フィーチャに変換し、スケールして数値として使用します。 – sergzach

+0

@sergzachありがとう、私はあなたのレビューをお願いします。 – Novitoll

+0

ここで述べたようにsklearnの 'CountVectorizer()'を使うことができます:http://scikit-learn.org/stable/tutorial/text_analytics/working_with_text_data.html#tokenizing-text-with-scikit-learnしかし、どんな場合でも、 'fit_transform()'のためのデータを準備する必要があります。おかげさまで – sergzach

答えて

0

はい、次のようなものです。

すみません、下のコードを修正する必要があります。

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. 

これで、行名(not_found_columns)が見つかりませんでした。それらを表示すると、おそらくいくつかの機能を忘れてしまったでしょう

数値としてではなく文字列をカテゴリとして書き込んで、DVを使用することもできます。結果として、アプローチは同等である。

+0

私は、すでにスキルの中に組み込みの方法があると思っていました。しかしそれがより理にかなっていることを知っている再度、感謝します。 :) – Novitoll

+0

@Novitollかもしれません。しかし、このような方法の多くは、どのような場合でも準備データを必要とします。あなたは別の答えを待つことができます、それは私の人にとっても興味深いものです。 – sergzach

0

Scikit Learnのベクトル化ツールは、文字列の配列を逆インデックス行列(2次元配列、各単語/単語の列に対応)に変換します。元の配列の各行(1次元)は、出力行列の1つの行に対応します。各セルは、使用するベクタライザの種類とそのパラメータに応じて、カウントまたはウェイトを保持します。

コードに基づいて、これが必要なのかどうかはわかりません。あなたが探しているこの機能をどこで使うのかを教えてください。あなたは分類器を訓練するつもりですか?どのような目的に?

関連する問題