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

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

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

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

自然言語処理

自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

Q&A

1回答

4578閲覧

python bag of words .count() で「AttributeError: 'generator' object has no attribute 'count'」のエラーが出る

nyaaaaaan0129

総合スコア0

Python

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

自然言語処理

自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

0グッド

0クリップ

投稿2020/08/26 10:08

前提・実現したいこと

本を見ながらpythonで機械学習の勉強中です。自然言語処理の分野でbag of wordsについての勉強をしている中で、文章中に一意の単語が何回出現かをカウントするのに.count()を使ったところ、下記のエラーが発生しました。

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

AttributeError Traceback (most recent call last) <ipython-input-23-074696bbff5c> in <module> 3 bag_of_words = [] 4 for unique_word in unique_words: ----> 5 num = words.count(unique_word) 6 bag_of_words.append(num) 7 bow_list.append(bag_of_words) AttributeError: 'generator' object has no attribute 'count'

該当のソースコード

from janome.tokenizer import Tokenizer t = Tokenizer() sentences = [ 'おいしいビールを飲む', 'コーヒーを飲む', 'おいしいクラフトビールを買う' ] words_list = [] for sentence in sentences: words_list.append(t.tokenize(sentence, wakati=True)) words_list unique_words = [] for words in words_list: for word in words: if word not in unique_words: unique_words.append(word) unique_words bow_list = [] for words in words_list: bag_of_words = [] for unique_word in unique_words: num = words.count(unique_word) bag_of_words.append(num) bow_list.append(bag_of_words) bow_list

書籍では、最後のbow_listを表示すると下記のように各文章にunique_wordが何度出てきたか表すリストができます。([1,1,1,1,0,0,0], [0,0,1,1,1,0,0,], [1,1,1,0,0,1,1])
が、ここでAttributeError: 'generator' object has no attribute 'count'が出ます。

試したこと

エラー文で検索をしてみたのですが同じような状況の方が見つけられずにいます。わかる方いらっしゃいましたらどなたか回答をお願いいたします。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

google翻訳
「AttributeError: 「ジェネレータ」オブジェクトには属性「カウント」がありません」

ってことなんで、wordsになにが入ってるのか調べてみよう

投稿2020/08/26 10:09

y_waiwai

総合スコア88042

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

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

nyaaaaaan0129

2020/08/26 18:02

ご回答をいただきましてありがとうございます! wordsを表示してみますと、「<generator object Tokenizer.__tokenize_stream at 0x7f8c032bd510>」と出てきます。ちなみに、words_listには'おいしいビールを飲む', 'コーヒーを飲む', 'おいしいクラフトビールを買う'の3つの文を分かち書きにしたものが入っていて欲しいのです。wordsには、3つの文を1つずつ取り出した物が入るはずです。 本の通りだと、words_listを表示すると[['おいしい','ビール','を','飲む'],[ 'コーヒー','を','飲む'], ['おいしい','クラフト','ビール','を','買う']が表示されますが、これも今私の場合は[<generator object Tokenizer.__tokenize_stream at 0x7f8c032bd510>, <generator object Tokenizer.__tokenize_stream at 0x7f8c032bd580>, <generator object Tokenizer.__tokenize_stream at 0x7f8c032bd890>]と表示されます。 この時点で理解ができていないことに気がつきました。もしまたご覧になっていただけましたら、ご協力のほどお願いできますでしょうか・・・。何卒よろしくお願いいたします。
y_waiwai

2020/08/26 23:07

words_list.append(t.tokenize(sentence, wakati=True)) words_listに入れてるのは文字列じゃないですよね? t.tokenize(sentence, wakati=True) ってのはなにをしてるのか考えてみよう
nyaaaaaan0129

2020/08/27 10:48

トークンのリストということでしょうか・・・ <generator object Tokenizer.__tokenize_stream at 0x7f8c032bd510>これを文字列にできるのかと色々と調べたのですが、結局のところわかりませんでした。.surfaceとかは関係あるでしょうか? 本を見ると上記のコードで文字列のリストが出てきているのも何故なのでしょうか?バージョンの違いとかでしょうか?
退会済みユーザー

退会済みユーザー

2020/08/29 07:36

とりあえずpython3でpipでjanomeだけ入れて実行してみたところ、再現しました。 結論だけ言うと、 words_list.append(t.tokenize(sentence, wakati=True)) を words_list.append(list(t.tokenize(sentence, wakati=True))) に変えたら動きました。 janomeのバージョンが書籍と違っているのかもしれませんね。 generatorは https://docs.python.org/ja/3/glossary.html#term-generator に公式の説明があります。 listはfor x in some_list:のように、ループの対象になりますが、こういうことが出来るタイプのことをiteratorと呼びます。some_listは実際に[1,2,3]みたいな中身を持っているのですが、一定の規則に従って生成できるものをいつもリストの形に展開するのは効率が悪いので、規則の部分だけを関数のようなものにして、iteratorタイプとして使用できるものをgeneratorと呼びます。 恐らく、古いjanomeはtokenのリストを返していたのでしょうけど、効率が悪い場合があってgeneratorに変えたのだと思います。forでループの対象にするときには同じように使えるのですが、実際にwords_listに格納する場合は、generatorのまま格納されてしまうのでcountなどが使用できなかったということのようです。そのため、generatorをlistの形に変換するべく、list()を使用してみたところ、うまく動いてくれたというわけです。 本のjanomeのバージョンが分からないので、それ以上の追求はしませんでした。ご参考までに。
退会済みユーザー

退会済みユーザー

2020/08/29 07:39

あと、jupytorを使ってる場合は、そう書いてくださいね。 pythonのバージョンも必要ですよ。 anacondaを使用してる場合も書いてほしいです。 それぞれタグも付けてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問