2017-07-26 12 views
0

sklearnパイプラインをスクリーニングし、sklearnのドキュメントから勉強するのは初めてです。私はmovie reviewデータの感情分析に使った。データには、最初にclassと2番目のtextの2つの列が含まれています。sklearnパイプラインが機能していません

input_file_df = pd.read_csv("movie-pang.csv") 
x_train = input_file_df["text"] #used complete data as train data 
y_train = input_file_df["class"] 

は、私は、このためのカスタムトランス書いsentiment score for each sentence.、1つの特徴だけを使用:

pipeline = Pipeline([ 
("word_level_sentiment",GetWorldLevelSentiment()), 
("clf", MultinomialNB())]) 

して、パイプラインにフィットを呼び出します:

class GetWorldLevelSentiment(BaseEstimator, TransformerMixin): 

def __init__(self): 
    pass 

def get_word_level_sentiment(self, word_list): 
    sentiment_score = 1 
    for word in word_list: 
     word_sentiment = swn.senti_synsets(word) 

     if len(word_sentiment) > 0: 
      word_sentiment = word_sentiment[0] 
     else: 
      continue 

     if word_sentiment.pos_score() > word_sentiment.neg_score(): 
      word_sentiment_score = word_sentiment.pos_score() 
     elif word_sentiment.pos_score() < word_sentiment.neg_score(): 
      word_sentiment_score = word_sentiment.neg_score()*(-1) 
     else: 
      word_sentiment_score = word_sentiment.pos_score() 

     print word, " " , word_sentiment_score 
     if word_sentiment_score != 0: 
      sentiment_score = sentiment_score * word_sentiment_score 

    return sentiment_score 

def transform(self, review_list, y=None): 
    sentiment_score_list = list() 
    for review in review_list: 
     sentiment_score_list.append(self.get_word_level_sentiment(review.split())) 

    return np.asarray(sentiment_score_list) 

def fit(self, x, y=None): 
    return self 

パイプライン私が使用している

pipeline.fit(x_train, y_train) 

しかし、これは私には、次のエラーを与えている:

This MultinomialNB instance is not fitted yet. Call 'fit' with appropriate arguments before using this method.

誰かが私がここで間違ってやっているものを私を導いてくださいことはできますか?それは大きな助けになるでしょう。

+0

を振る舞いを複製するために、エラーと完全なコードの完全なスタックトレースを投稿してください。 –

+0

( "clf"、MultinomialNB) – CrazyElf

+1

@CrazyElfのようにかっこを削除してください。かっこを削除しても機能しません。パイプラインには、クラスではなくインスタンスが必要です。 –

答えて

0

は、これが私の仕事:

class GetWorldLevelSentiment(BaseEstimator, TransformerMixin): 

def __init__(self): 
    pass 

def get_word_level_sentiment(self, word_list): 
    sentiment_score = 1 
    for word in word_list: 
     word_sentiment = swn.senti_synsets(word) 

     if len(word_sentiment) > 0: 
      word_sentiment = word_sentiment[0] 
     else: 
      continue 

     if word_sentiment.pos_score() > word_sentiment.neg_score(): 
      word_sentiment_score = word_sentiment.pos_score() 
     elif word_sentiment.pos_score() < word_sentiment.neg_score(): 
      word_sentiment_score = word_sentiment.neg_score()*(-1) 
     else: 
      word_sentiment_score = word_sentiment.pos_score() 

     print word, " " , word_sentiment_score 
     if word_sentiment_score != 0: 
      sentiment_score = sentiment_score * word_sentiment_score 

    return sentiment_score 

def transform(self, review_list, y=None): 
    sentiment_score_list = list() 
    for review in review_list: 
     sentiment_score_list.append(self.get_word_level_sentiment(review.split())) 

    return pandas.DataFrame(sentiment_score-list) 

def fit(self, x, y=None): 
    return self 
関連する問題