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

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

新規登録して質問してみよう
ただいま回答率
85.42%
Mecab

Mecabは、オープンソースの形態素解析エンジンです。 言語、辞書、コーパスに依存しない汎用的な設計を基本方針としています。 Mecabの由来は、開発者の好物である和布蕪(めかぶ)から名づけられました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

959閲覧

NameError: name 'stopwords_lists' is not defined のエラーの解決

Neosoft_8319

総合スコア2

Mecab

Mecabは、オープンソースの形態素解析エンジンです。 言語、辞書、コーパスに依存しない汎用的な設計を基本方針としています。 Mecabの由来は、開発者の好物である和布蕪(めかぶ)から名づけられました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

1クリップ

投稿2022/12/13 09:10

編集2022/12/13 11:40

前提

Pythonで学ぶテキストマイニング入門(2022; シーアンドアール研究所)で載っているcodeでMecabを使えるように練習している者です。
Mecabでストップワードを作成したいと考えており、Slothlibを使わせていただいています。
エラーが発生し、対処できなくなったためご指導いただきたいです。

実現したいこと

NameError: name 'stopwords_lists' is not defined
以上のエラーの改善

発生している問題・エラーメッセージ

--------------------------------------------------------------------------- --------------------------------------------------------------------------- TypeError Traceback (most recent call last) ~\AppData\Local\Temp\ipykernel_6896\659627611.py in <module> 1 import my_mecab as mm ----> 2 out = mm.tokens("分析目的に合わせて自分で作るのがベストだが、人の作ったもの(SlothLib)を使うのもあり。", stopwords_lists= stopwords) 3 print(out) TypeError: tokens() got an unexpected keyword argument 'stopwords_lists'

該当のソースコード

こちらが、.pyファイルの中身です。

import MeCab #path = '-d C:\mecab-ipadic-neologd -u /home/ishida/ishida.dic" path="" tagger=MeCab.Tagger(path) def tokens(text,pos =["名詞","形容詞","動詞"], stopwords_lists=[]): text= "".join(text.split()) node=tagger.parseToNode(text) word_list=[] while node: if node.surface != "":#BOSとEOSが空のfeatureなので、!= notイコールでそれ以外だけを繰り返させる。 elem= node.feature.split(",") term= elem[6] if elem[6] !='*' else node.surface if term not in stopwords_lists: if len(pos)<1 or elem[0] in pos: word_list.append(term) node=node.next return word_list if __name__ == "__main__": out=tokens("ランチを食べました。") print(out)

こちらがノートブックで実施したコードです。

import my_mecab as mm out = mm.tokens("分析目的に合わせて自分で作るのがベストだが、人の作ったもの(SlothLib)を使うのもあり。", stopwords_lists= stopwords) print(out)

試したこと

コードを書籍のものと照らし合わせて、何度も確認しましたが、解決できませんでした。

補足情報(FW/ツールのバージョンなど)

Windows10
Mecab 64bit
Python (jupyter notebook(anaconda))
です。

Neosoft_8319👍を押しています

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jbpb0

2022/12/13 09:27

> def tokens(text,pos =["名詞","形容詞","動詞"], stopwords_list=[]): は「stopwords_list」 > if term not in stopwords_lists: は「stopwords_lists」 最後の「s」の有無
quickquip

2022/12/14 06:34

表題と質問が書き換えられていなくて混乱しました。 解決したいのは TypeError: tokens() got an unexpected keyword argument 'stopwords_lists' なのでしょうか?
guest

回答2

0

.pyのファイル名を変更することで解決できました。

投稿2022/12/17 03:31

Neosoft_8319

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TakaiY

2022/12/17 06:15

それだとちょっと解決とは言えないと思います。 動けばいいということにするのは、今後同様の問題があったときに対応できないということになります。 「ファイル名を変えてインポートしたらできた」ということは、たぶん、.ipynb ファイルの内容が「汚れている」ということだと思います。 汚れているというのは、古い間違えた関数定義やimport文などが残っていて、流れによってそれが有効になっていたり無効になっていたりして、現在どのようなものが読み込まれているかわからない状況のことです。 ipynbファイルを精査して、不要なものを削除して、あらためて開きなおしてカーネルをリスタートして「元のファイル名でもちゃんとうごく」ようにすべきだと思います。
guest

0

ベストアンサー

関数の引数は「stopwords_list」で、関数の中、エラーになっているところで使っている変数は「stopwords_lists」になっているからでしょう。
最後の「s」のあるなしです。

投稿2022/12/13 09:24

TakaiY

総合スコア13147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Neosoft_8319

2022/12/13 09:31

--------------------------------------------------------------------------- TypeError Traceback (most recent call last) ~\AppData\Local\Temp\ipykernel_6896\659627611.py in <module> 1 import my_mecab as mm ----> 2 out = mm.tokens("分析目的に合わせて自分で作るのがベストだが、人の作ったもの(SlothLib)を使うのもあり。", stopwords_lists= stopwords) 3 print(out) TypeError: tokens() got an unexpected keyword argument 'stopwords_lists' ご回答ありがとうございます。実行してみましたが、以上のようなエラーが出てきてしまい、解決できないことを明記できておりませんでした。書籍の方は、sは統一されておりません。
TakaiY

2022/12/13 09:49 編集

「書籍の方は、sは統一されておりません。」であれば、そのコードはバグっていますので、作者に問い合わせるなどしてみるといいと思います。 (「sは統一されておりません」の意味をこちらが正しく理解していればですが) ちなみに直すなら「 if term not in stopwords_lists:」こちらの方でしょう。
jbpb0

2022/12/13 09:54

> ---> 2 out = mm.tokens("分析目的に合わせて自分で作るのがベストだが、人の作ったもの(SlothLib)を使うのもあり。", stopwords_lists= stopwords) そこ変えるなら、 > def tokens(text,pos =["名詞","形容詞","動詞"], stopwords_list=[]): も「stopwords_lists」に変えないと
Neosoft_8319

2022/12/13 11:36

ありがとうございます。全て統一してみたものの、同じエラーが出てしまいます。 .pyファイルはjupyterのファイルに入れているのですが、、 以下に実行コードを上げさせていただきます。 ご指導いただけますと幸いです。
Neosoft_8319

2022/12/13 11:37

.pyファイル import MeCab #path = '-d C:\mecab-ipadic-neologd -u /home/ishida/ishida.dic" path="" tagger=MeCab.Tagger(path) def tokens(text,pos =["名詞","形容詞","動詞"], stopwords_lists=[]): text= "".join(text.split()) node=tagger.parseToNode(text) word_list=[] while node: if node.surface != "":#BOSとEOSが空のfeatureなので、!= notイコールでそれ以外だけを繰り返させる。 elem= node.feature.split(",") term= elem[6] if elem[6] !='*' else node.surface if term not in stopwords_lists: if len(pos)<1 or elem[0] in pos: word_list.append(term) node=node.next return word_list if __name__ == "__main__": out=tokens("ランチを食べました。") print(out)
TakaiY

2022/12/13 11:37

コードはここではなく、質問を編集して追加してください。 ここでは読めないので。
Neosoft_8319

2022/12/13 11:37

jupyter notebookでの実行結果 import my_mecab as mm out = mm.tokens("分析目的に合わせて自分で作るのがベストだが、人の作ったもの(SlothLib)を使うのもあり。", stopwords_lists= stopwords) print(out)
Neosoft_8319

2022/12/13 11:40

失礼しました。編集しましたのでご高閲いただけますと幸いです。よろしくお願いいたします。
TakaiY

2022/12/13 11:41

ちなみに、そのように修正したのであれば「同じエラー」は出ないはずです。 ちゃんと修正後のコードが実行されているかどうか確認してください。 よくわからなければ、わかるようにprint文を入れるなどしてみるといいでしょう。
Neosoft_8319

2022/12/13 11:46

修正後のコードが実行されているかどうか確認した後の、エラー文について、編集をいたしました。「発生している問題・エラーメッセージ」の欄をご覧いただけますと幸いです。よろしくお願いいたします。
TakaiY

2022/12/13 11:53 編集

(コメントを修正) その、.pyファイル(my_mecab.py)がちゃんと読まれていないように思います。 関数内にprint文を仕込むなどして、ちゃんと変更後のファイルが読まれて実行されているか確認してみてください。 「修正後のコードが実行されているかどうか確認」はどのようにしていますか?
Neosoft_8319

2022/12/13 11:57 編集

.pyファイルはPythonのスクリプトファイルの事を指しておりました。説明不足、勉強不足で申し訳ございません。  ①当該のスクリプトファイル(テキストファイル)にモジュール化したい自作関数の式を入力しています。  ②そのスクリプトファイルをjupyterの「Files」タブにコピー&ペーストしました。 ③そのファイルのモジュールを、「ノートブックで実行」することで呼び出して、使用する  という流れだと理解しております。よろしくお願いいたします。 (修正コメントを拝見しましたので追記します。) 修正したコードで再度実行することで、 「修正後のコードが実行されているかどうか確認」をいたしました。
Neosoft_8319

2022/12/13 12:15

.pyファイルの関数をnotebookで実行したところ、 ['ランチ', '食べる'] というように、正しく出力されました。ご指摘いただきありがとうございます。 おっしゃる通り、.pyファイルがうまく読み込めていないことが問題点です。jupyter が参照するデフォルトのフォルダを確認して(os.getcwd())、エクスプローラーから、当該の.pyファイルを確認しました。しかし、同様に、実行しても同じエラーが返されてしまいます。 関数内にprint文を仕込むというのは、例えばどのように行うのでしょうか。よろしくお願いいたします。
TakaiY

2022/12/13 12:16

修正したコードが動いているとすると「tokens() got an unexpected keyword argument 'stopwords_lists' 」というエラーにはならないように思います。 実行中のファイル .ipynbと 同じ階層(フォルダ)に 修正したファイル(my_mecab.py)はありますか? my_mecab.py の tokens関数内に適当なprint文を仕込んで、実行時にそれが表示されるかどうか確認していただけますか。
Neosoft_8319

2022/12/13 12:16

関数自体の問題は解決できましたが、そこから自作モジュールを使えるようにする段階で詰まっております。
TakaiY

2022/12/13 12:18

例えば、 def tokens(text,pos =["名詞","形容詞","動詞"], stopwords_lists=[]): print("修正したファイルです") # 以降そのまま のように、実行されたら必ず通るところに入れます。
TakaiY

2022/12/13 12:19

まずは、「jupyter note 自作モジュール import」あたりで検索して、やりかたを確認してみてはどうでしょう。
Neosoft_8319

2022/12/13 12:25

実行中のファイル .ipynbと 同じ階層(フォルダ)に 修正したファイル(my_mecab.py)は入っております。 以下のようにprint(text)を挿入すると、 「ランチを食べました。 ランチを食べました。 ランチを食べました。 ランチを食べました。 ランチを食べました。 ランチを食べました。 ランチを食べました。 ランチを食べました。」のように出力されました。 挿入した部分 node=node.next print(text) <------------------挿入しました。 return word_list
TakaiY

2022/12/13 12:25

ちょっと整理すると、 - 最初は、.pyが読み込まれていた -----> でなければ、エラーが出ない -----> ファイルの内容は当初はjupyter内にあったりしましたか? -----> だとしても、ファイルが無ければ、importでエラーになるはず。 - os.getcwd() で確認したところに、修正したファイルはあるんですよね? -----> ファイル名は、 my_mecab.py であってますか? -
TakaiY

2022/12/13 12:26

あれ? 「以下のようにprint(text)を挿入すると」「のように出力されました。」 のときはどのように実行していますか?
Neosoft_8319

2022/12/13 12:31

ファイルはmy_mecab.pyであっており、os.getcwd() で確認したところに、修正したファイルはございます。 my_mecab.pyで書いてあるコードをnotebookにコピペして、実行することで確認しました。その結果、以上の返答が返ってくるという状況です。
Neosoft_8319

2022/12/13 12:32

当該の.pyファイルの内容はjupyter内に現在もございます。
TakaiY

2022/12/13 13:47

おかしいですね。 my_mecab.py の名前を別名(my_mecab2.pyとか)に変更して、 セルのimport文も、「import my_mecab2 as mm」に変更して実施するとどうなりますか?
jbpb0

2022/12/14 10:50

> my_mecab.pyで書いてあるコードをnotebookにコピペして、実行することで確認しました。 > 当該の.pyファイルの内容はjupyter内に現在もございます。 が、「my_mecab.py」の内容と同じものがjupyterのノートブックのセルにも書いてある、という意味ならば、jupyterのノートブックからそこは削除してください そうしないと、今実行してるのがどれかが分かりません その上で、TakaiYさんが書いてるように下記を行なってみて、その「*.py」ファイルが正しくインポートされてるのかを確認してください ・「my_mecab.py」の中に「print」文を追加する ・「my_mecab.py」のファイル名を変えて、jupyter側のインポート文もそれに合わせて変える
jbpb0

2022/12/14 11:02 編集

> 実行中のファイル .ipynbと 同じ階層(フォルダ)に 修正したファイル(my_mecab.py)は入っております。 jupyterで下記を実行したら表示されるパスに、「my_mecab.py」が置いてありますでしょうか? %pwd jupyterで下記を実行したら表示されるファイル名一覧に、「my_mecab.py」が含まれてますでしょうか? !dir もし、TakaiYさんの助言に従って、既に「my_mecab.py」のファイル名を「my_mecab2.py」とかに変えてたら、上記はそう読み替えてください
Neosoft_8319

2022/12/17 03:31

.pyのファイル名を変更することで解決できました。 ご指導いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.42%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問