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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

2回答

4012閲覧

byteオブジェクトへの変換

jyon

総合スコア13

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2019/07/18 11:13

編集2019/07/18 11:25

前提・実現したいこと

int foundというエラーをなくしたいです。

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

--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-55-b3b1a98eecac> in <module> ----> 1 vec = dictionary.doc2bow(words) TypeError: decoding to str: need a bytes-like object, int found

該当のソースコード

python

1import MeCab 2from gensim.corpora.dictionary import Dictionary 3from gensim.models import LdaModel 4from gensim.models import HdpModel 5from collections import defaultdict 6 7# MeCabオブジェクトの生成 8mt = MeCab.Tagger('') 9 10mt.parse('') 11 12# トピック数の設定 13NUM_TOPICS = 3 14hdp_num_topics = 10 15 16if __name__ == "__main__": 17 # トレーニングデータの読み込み 18 # train_texts は二次元のリスト 19 # テキストデータを一件ずつ分かち書き(名詞、動詞、形容詞に限定)して train_texts に格納するだけ 20 train_texts = [] 21 with open('train.txt', 'r',encoding='utf-8') as f: 22 for line in f: 23 text = [] 24 node = mt.parseToNode(line.strip()) 25 while node: 26 fields = node.feature.split(",") 27 if fields[0] == '名詞': 28 text.append(node.surface) 29 node = node.next 30 train_texts.append(text) 31 words = Dictionary(train_texts) 32print(words) 33 34from gensim import corpora 35 36# words はさっきの単語リスト 37dictionary = corpora.Dictionary(train_texts) 38print(dictionary.token2id) 39 40# no_above: 使われてる文章の割合がno_above以上の場合無視 41dictionary.filter_extremes(no_below=20, no_above=0.3) 42 43dictionary.save_as_text('train.txt') 44words = bytes('words', 'UTF-8') 45dictionary = corpora.Dictionary.load_from_text('train.txt') 46type(words) 47 48vec = dictionary.doc2bow(words) 49print(vec)

試したこと

エラーでbyteのオブジェクトが必要とのことだったので、1行目でwordsをbyteに変換しましたが治りませんでした。

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

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

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

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

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

can110

2019/07/18 11:18

corporaとは何かが不明です。import文も含めて第三者が検証できるコードを提示ください。
jyon

2019/07/18 11:25

すみませんでした。 ただいま、コードを更新しました。 よろしくお願いいたします。
guest

回答2

0

ベストアンサー

以下のコードで動作を確認しました。ご確認ください。

python

1import MeCab 2from gensim.corpora.dictionary import Dictionary 3from gensim.models import LdaModel 4from gensim.models import HdpModel 5from collections import defaultdict 6 7# MeCabオブジェクトの生成 8mt = MeCab.Tagger('') 9 10mt.parse('') 11 12# トピック数の設定 13NUM_TOPICS = 3 14hdp_num_topics = 10 15 16if __name__ == "__main__": 17 # トレーニングデータの読み込み 18 # train_texts は二次元のリスト 19 # テキストデータを一件ずつ分かち書き(名詞、動詞、形容詞に限定)して train_texts に格納するだけ 20 train_texts = [] 21 with open('data.txt', 'r',encoding='utf-8') as f: 22 for line in f: 23 text = [] 24 node = mt.parseToNode(line.strip()) 25 while node: 26 fields = node.feature.split(",") 27 if fields[0] == '名詞': 28 text.append(node.surface) 29 node = node.next 30 train_texts.append(text) 31 words = Dictionary(train_texts) 32 33print(words) 34 35from gensim import corpora 36 37# words はさっきの単語リスト 38dictionary = corpora.Dictionary(train_texts) 39print(dictionary.token2id) 40 41# no_above: 使われてる文章の割合がno_above以上の場合無視 42# コメントアウト 43# dictionary.filter_extremes(no_below=20, no_above=0.3) 44 45dictionary.save_as_text('train.txt') 46words = bytes('words', 'UTF-8') 47dictionary = corpora.Dictionary.load_from_text('train.txt') 48type(words) 49 50vec = dictionary.doc2bow(train_texts[0]) 51print(vec) 52

data.txt

plain

1吾輩は猫である。 2名前はまだない。 3にゃーん。 4

結果

Dictionary(4 unique tokens: ['猫', 'ー', '名前', '吾輩']) {'猫': 1, 'ー': 3, '名前': 2, '吾輩': 0} [(0, 1), (1, 1)]

投稿2019/07/18 12:01

編集2019/07/18 12:47
hayataka2049

総合スコア30933

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

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

jyon

2019/07/18 12:05

辞書中の単語IDと頻度のタプルを表示したいのですが、["words"]に変えた時に、PRINT(VEC)が[]になってしまいました、、 、
hayataka2049

2019/07/18 12:08

dictionaryにwordsという単語が含まれていないのでは? 確実に存在する単語で試してみましょう。
hayataka2049

2019/07/18 12:09

コードをちゃんと読んでいませんが、mecabを使っているということは日本語だと思うので、wordsを入れるのがそもそもおかしいという話になります。
hayataka2049

2019/07/18 12:10

あれ、最初のエラーは vec = dictionary.doc2bow(words) で出ていたんでしたっけ。方向性としてはこっちが正しいみたいですね。"words"という文字列を渡しても、変数wordsとは無関係ですから気をつけましょう。
hayataka2049

2019/07/18 12:13

少し真面目にコードを読んでみました。 doc2bowを使うのであれば、 dictionary.doc2bow(train_texts[0]) とすれば0番目の文書のBoW表現が得られるかと。 全文書の頻度や、全文書に対するBoW表現を得たければ、また違う方法で行う必要があるでしょう。
jyon

2019/07/18 12:15 編集

WORDSの中身が、このような感じです。 ['アイ', 'の', '真実', '審査', 'カード']...) DICTIONARYの中身は、このように単語の出現回数を表示します。 アイ': 0, 'の': 1, '真実': 2, '審査': 3, 'カード': 4,
hayataka2049

2019/07/18 12:15

dictionary.save_as_text('train.txt') の行は修正しないと、元のtrain.txtを上書きするのでよくなさそうですね。
jyon

2019/07/18 12:16

実行結果がまたも[]になってしまいました…
jyon

2019/07/18 12:17

違う名前に変えてみます!
hayataka2049

2019/07/18 12:22

ファイル名を変えてから、たぶんtrain.txtの中身がぜんぶ上書きされているはずなので、元の中身を復元しておいてください。
jyon

2019/07/18 12:26

承知しました。 やはり、実行結果が[]になってしまいます、、、
hayataka2049

2019/07/18 12:29

dictionary.filter_extremes(no_below=20, no_above=0.3) が厳しすぎるのでは? この行をコメントアウトしてみてはいかがでしょうか。
jyon

2019/07/18 12:32

コメントアウトしてもうまくいきませんでした。。 vec = dictionary.doc2bow(train_texts) print(vec) これで実行すると、 decoding to str: need a bytes-like object, list foundこのエラーが出ます。
hayataka2049

2019/07/18 12:33

vec = dictionary.doc2bow(train_texts[0]) としてください。これで0番目の文書のBoW表現が得られるはずです(少なくとも手元環境ではうまくいっています)。
jyon

2019/07/18 12:36

そのコードを入力し、print(vec)をすると実行結果は[]になってしまうんですよね、、、
hayataka2049

2019/07/18 12:46

回答を修正しました。こちらを試してみてください。 data.txtを保存する必要があります。書き換えるのはオリジナルのデータを読み込む部分のみです。(他のtrain.txtはそのままにしています)。
jyon

2019/07/18 12:49

ありがとうございます!今は[0]の部分のみしか行っていませんが、すべての単語に対して出力したい場合はどのようにしたらよいでしょうか。
hayataka2049

2019/07/18 12:56 編集

すべての文書に対して出力したい、ということでよろしいですか? 今はデータが2重リストになっていますが内包表記で1重リストに変換してあげて、 vec = dictionary.doc2bow([y for x in train_texts for y in x]) で [(0, 1), (1, 1), (2, 1), (3, 1)] を得るということでしょうか。
jyon

2019/07/23 02:36

そうです!!ありがとうございます。 その後のクラスター分析の行い方など、お分かりでしたら教えていただきたいです。
guest

0

gensimの処理関係的にwordsはリストだと思います。
また、wordsにNaNは含まれていないでしょうか?

投稿2019/07/18 11:25

bamboo-nova

総合スコア1408

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

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

jyon

2019/07/18 11:29

NaNは含まれていません。 byteに変換せずにtype(words)と実行すると、gensim.corpora.dictionary.Dictionaryとでてきました。
bamboo-nova

2019/07/18 11:54

混乱しててすみません汗 やってみたいのはwords.doc2bowとかではないですか?
jyon

2019/07/18 11:58

WORDSにはリストのようなものが入っています。 辞書には単語ごとに区切れたものが入っていて、辞書中の単語IDと、頻度のタプルを表示したいので、DICTIONARY.DOC2BOWかと思っていました、、、
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問