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

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

ただいまの
回答率

90.45%

  • Python 3.x

    10334questions

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

gensimでの辞書作成

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,381

aoisj

score 19

困っていること

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

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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

0

API Document に

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

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

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

dictionary = corpora.Dictionary([sels])

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/10/19 13:37

    回答が遅くなってしまい、申し訳ありません。
    ご説明ありがとうございます。
    教えて頂いた通りに変更したところ、このエラーは消えたのですが、

    ```
    #LDAモデルに投入
    lda = models.LdaModel(corpus = corpus, id2word = dictionary,
    #トピック数:10
    num_topics = 10)
    ```

    この部分で

    ValueError: cannot compute LDA over an empty collection (no terms)

    以上のエラーが出てしまいました。
    コレクションが空だというエラーらしいのですが、
    原因を教えていただきたいです。

    キャンセル

  • 2017/10/19 15:03

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

    キャンセル

  • 2017/10/19 15:29

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

    キャンセル

  • 2017/10/19 18:09

    どもです
    https://qiita.com/HirofumiYashima/items/c8aa8df214d48c86ecba
    なんかは参考になるのではないでしょうか。
    あとは素直に Tutorial やるとか
    https://radimrehurek.com/gensim/wiki.html
    API 眺めるとか
    https://radimrehurek.com/gensim/models/ldamodel.html

    キャンセル

  • 2017/10/20 13:07

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

    キャンセル

  • 2017/10/20 13:48

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

    キャンセル

  • 2017/10/27 11:51

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

    キャンセル

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

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

同じタグがついた質問を見る

  • Python 3.x

    10334questions

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