質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.10%

感情分析をしたいのですが以下で詰まりました

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 334

KoMurase

score 4

ある映画の感想が入っているテキストのデータセットから感情分析を行いたいのですが以下のエラーが出て行き詰りました.どなたか教えてください.
試したことはGridSearchCVのn_jobsを-1にすることを推奨されていたのでためしてみたのですが,うまくいきませんでした.エラー文とコードを載せます.

import pyprind
import pandas as pd
import os
import numpy as np
import re #正規表現 re (regular expression)
from nltk.stem.porter import PorterStemmer
import nltk

from sklearn.model_selection import GridSearchCV
from sklearn.pipeline import Pipeline
from sklearn.linear_model import LogisticRegression
from sklearn.feature_extraction.text import TfidfVectorizer


basepath = 'aclImdb'
labels = {'pos':1,'neg':0}
pbar = pyprind.ProgBar(5000)

df=pd.DataFrame()

for s in ('test','train'):
    for l in ('pos','neg'):
        path = os.path.join(basepath,s,l)
        for file in os.listdir(path):
            with open(os.path.join(path,file),'r',encoding = 'utf-8') as infile:
                txt = infile.read()
            df = df.append([[txt,labels[l]]],ignore_index=True)
            pbar.update()
print('done')
df.columns = ['review','sentiment']

np.random.seed(0)
df = df.reindex(np.random.permutation(df.index))
df.to_csv('movie_data.csv',index=False,encoding='utf-8')

df = pd.read_csv('movie_data.csv',encoding = 'utf-8')

def preprocessor(text):
    text = re.sub('<[^>]*>','',text) # <[^>]*> でHTMLタグを削除
    emoticons = re.findall('(?::|;|=)(?:-)?(?:\)|\(|D|P)',text)
    text = (re.sub('[\W]+',' ',text.lower()) + ''.join(emoticons).replace('-',''))
    return text

def tokenizer(text):
    return text.split()

porter = PorterStemmer()
def tokenizer_porter(text):
    return [porter.stem(word) for word in text.split()]
from nltk.corpus import stopwords
stop = stopwords.words('english')
[w for w in tokenizer_porter('a runner likes running and runs a lot')[-10:]
if w not in stop]

X_train = df.loc[:25000,'review'].values
y_train = df.loc[:25000,'sentiment'].values
X_test = df.loc[25000:,'review'].values
y_test = df.loc[25000:,'sentiment'].values

tfidf = TfidfVectorizer(strip_accents=None,lowercase=False,preprocessor=None,)
param_grid = [{'vect_ngram_range': [(1,1)],
               'vect_stop_words': [stop,None],
               'vect_tokenizer' : [tokenizer,tokenizer_porter],
               'clf_penalty' : ['11','12'],
               'clf_C' : [1.0,10.0,100.0]},
              {
                  'vect_ngram_range' : [(1,1)],
                  'vect_stop_words' : [stop,None],
                  'vect_tokenizer' : [str.split],
                  'vect_use_idf' : [False],
                  'vect_norm' : [None],
                  'clf_penalty' : ['11','12'],
                  'clf_C' : [1.0,10.0,100.0]
              }
              ]
lr_tfidf = Pipeline([('vect',tfidf),('clf',LogisticRegression(random_state=0))])
gs_lr_tfidf = GridSearchCV(lr_tfidf,param_grid,scoring='accuracy',
                          cv=5,verbose=1,n_jobs=-1)
gs_lr_tfidf.fit(X_train,y_train)
ValueError: Invalid parameter clf_C for estimator Pipeline(memory=None,
         steps=[('vect',
                 TfidfVectorizer(analyzer='word', binary=False,
                                 decode_error='strict',
                                 dtype=<class 'numpy.float64'>,
                                 encoding='utf-8', input='content',
                                 lowercase=False, max_df=1.0, max_features=None,
                                 min_df=1, ngram_range=(1, 1), norm='l2',
                                 preprocessor=None, smooth_idf=True,
                                 stop_words=None, strip_accents=None,
                                 sublinear_tf=False,
                                 token_pattern='(?u)\\b\\w\\w+\\b',
                                 tokenizer=None, use_idf=True,
                                 vocabulary=None)),
                ('clf',
                 LogisticRegression(C=1.0, class_weight=None, dual=False,
                                    fit_intercept=True, intercept_scaling=1,
                                    l1_ratio=None, max_iter=100,
                                    multi_class='warn', n_jobs=None,
                                    penalty='l2', random_state=0, solver='warn',
                                    tol=0.0001, verbose=0, warm_start=False))],
         verbose=False). Check the list of available parameters with `estimator.get_params().keys()`.
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

パラメータを指定するときは名前とパラメータ名はアンダーバー二つで句切れとドキュメントにもあります。

sklearn.pipeline.Pipeline — scikit-learn 0.21.3 documentation

元々のパラメータ名にアンダーバーが入ってたりするとややこしいからなんですが・・・

'vect_ngram_range'ではなく'vect__ngram_range'という具合に、param_gridの中身をすべて直してください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/08/21 09:18

    アンダーバー二つというのには気づきませんでした
    ありがとうございます

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる