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

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

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

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

Q&A

1回答

2369閲覧

gensimでの辞書作成

aoisj

総合スコア27

Python 3.x

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

0グッド

0クリップ

投稿2017/10/17 08:01

編集2022/01/12 10:55

#困っていること
pythonのトピックモデルライブラリであるgensimの利用経験がある方に質問です。
現在、テキストファイルからコーパスを生成するために辞書を作成しようと考えています。
しかし、以下のエラーが出てしまいました。

TypeError: doc2bow expects an array of unicode tokens on input, not a single string

エラーが出たコードは以下の通りです。

# -*- coding: utf-8 -*- import MeCab from gensim import corpora, models, similarities #ファイル指定 doc = input('select file(ex, ○○.txt):') f = open(doc, "r",encoding = "utf-8") text = f.read() f.close() #文字列を改行位置で区切って分割する(形態素解析) m = MeCab.Tagger ("-Ochasen") chunks = m.parse(text).splitlines() #絞り結果を格納 sels = [] #絞り込み for chunk in chunks: #chunk:形態素解析結果(1行の文字列) #タブ(\t)で区切り、文字列リストを作成 cols = chunk.split('\t') if len(cols) >= 4: #parts[0]:品詞の種類 parts = cols[3].split('-') #指定した品詞で始まっている場合 → 真 if parts[0].startswith('名詞') or parts[0].startswith('動詞'): #要素(形態素)を追加 #sels:要素(形態素)のみの行列 sels.append(chunk[0]) """print(sels)""" #辞書作成 dictionary = corpora.Dictionary(sels) #(単語の出現が1以下) を除く dictionary.filter_extremes(no_below = 1) #(辞書の単語数)次元のベクトルに変換 corpus = [dictionary.doc2bow(sels) for sel in sels] #LDAモデルに投入 lda = models.LdaModel(corpus = corpus, id2word = dictionary, #トピック数:10 num_topics = 10)

#やりたいこと
指定したテキストファイルから名詞と動詞のみを抜き出し、辞書を作成したいです。
参考にしたサイトのURLをいかに記します。

https://www.slideshare.net/HirofumiTsuruta/ss-71566139

私は以前作成した形態素解析を行うプログラムに追加する形で実装を試みているのですが、エラーの原因がわからないので、ご意見をいただきたいです。
調べてみると英語のものしか見つからず、辞書を初期化?するといった内容のことが書かれていたように思えますが、勘違いしている可能性が高いので、詳しく教えていただきたいです。

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

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

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

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

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

guest

回答1

0

API Document

"ドキュメントのコレクションから辞書を更新します。各ドキュメントはトークンのリストです" (Update dictionary from a collection of documents. Each document is a list of tokens.

とあります。
つまりcorpora.Dictionary() に渡すデータは「トークンリストの(ドキュメントごとの)リスト」となるようです。

今回の場合は、1つのドキュメントのトークンリストを渡してますので、

Python

1dictionary = corpora.Dictionary([sels])

とする必用があるのではないでしょうか。

投稿2017/10/18 01:57

magichan

総合スコア15898

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

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

aoisj

2017/10/19 04:37

回答が遅くなってしまい、申し訳ありません。 ご説明ありがとうございます。 教えて頂いた通りに変更したところ、このエラーは消えたのですが、 ``` #LDAモデルに投入 lda = models.LdaModel(corpus = corpus, id2word = dictionary, #トピック数:10 num_topics = 10) ``` この部分で ValueError: cannot compute LDA over an empty collection (no terms) 以上のエラーが出てしまいました。 コレクションが空だというエラーらしいのですが、 原因を教えていただきたいです。
aoisj

2017/10/19 06:03

「単語の出現が1以下を除く」という処理のせいで、 単語がすべて除去されていただけでした…。 ご迷惑をおかけしました。
aoisj

2017/10/19 06:29

作成したコーパス(印字して確認済)をLDAモデルに入力することはできたのですが、 どのようなコマンドでどのような情報が印字できるのかが調べても見つかりませんでした。 magichanさんがご存知のコマンド、もしくはそれらが紹介されているサイトなどがあれば 教えていただきたいです。
aoisj

2017/10/20 04:07

ありがとうございます。 参考にさせていただきます。
aoisj

2017/10/20 04:48

追加で質問をさせてください。 私は小説などの一つの作品が書かれたテキストファイルを入力として利用しているのですが、 https://qiita.com/HirofumiYashima/items/c8aa8df214d48c86ecba にあるようにテキストファイルの各行を1つの文書とするのではなく、 テキストファイルを1つの文書として指定したトピック数に分けることはできますか? 質問がわかりづらくて申し訳ありません。
magichan

2017/10/27 02:51

返答、大変遅くなりましてスミマセン。 単にデータの渡し方(作り方)の違いなので、その部分の修正だけで問題なく対応できるかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問