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

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

ただいまの
回答率

90.37%

  • Python 3.x

    10767questions

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

  • Mecab

    239questions

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

複数のテキストファイルをLDAモデルに

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 773

aoisj

score 19

やりたいこと

複数のテキストファイルを入力とし、指定したトピック数に分類するプログラムを作成したいと考えています。
現在、一つのテキストファイルをLDAモデルに投入するプログラムは実装することができたのですが、複数のテキストファイルを入力とする方法が分かりません。
例えば、指定したディレクトリ内にあるテキストファイルを入力として、
10個のトピックに分類するとします。
各テキストファイルにはジャンルのタグを付与しておいて分類に同じタグのファイルが
同じような分類にされているのかをチェックできるようにしたいです。

以下に現在実装中のコードを記します。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-


import time
import MeCab
from gensim import corpora, models, similarities
from xlwt import Workbook

#ファイル指定
doc = input('select file(ex, ○○.txt):')
t0 = time.time()
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])

#辞書作成
dictionary = corpora.Dictionary([sels])
"""
#単語の出現回数が1以下を除く
dictionary.filter_extremes(no_below = 1)
"""

#[辞書の単語数]次元のベクトルに変換(コーパス作成)
corpus = [dictionary.doc2bow(sels) for sel in sels]

t1 = time.time()
#LDAモデルに投入
lda = models.LdaModel(corpus = corpus, id2word = dictionary,
                      #トピック数:5
                      num_topics = 5)
t2 = time.time()
print(lda)


#各トピックにおける各トークンの出現確率を係数で表示
for topic in lda.show_topics(-1):
    print(topic)

"""
#文書の推定トピック番号 , 推定の確信度を表示
for topics_per_document in lda[corpus]:
    print(topics_per_document)
"""

lda_time = t2 -t1
print('LDAモデル生成時間:%f秒'%lda_time)

total_time = t2 - t0
print('合計時間:%f秒'%total_time)


まとめると、やりたいと思っているのは
①テキストファイルにタグを付ける
②複数のテキストファイル(1つのディレクトリ内)を同時に入力とする
この2つです。
できれば2つとも意見をいただきたいのですが、
①か②どちらか片方についてのご意見、またその他の部分についてのご意見
でも非常にありがたいです。

実行環境

OS:ubuntsu
言語:python3

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

指定したディレクトリ内の複数のファイルを指定する方法ですが、globを使用すると良いかと思います。
これにより、

import glob
files = glob.glob('TARGET_DIR/*.txt')

のようにワイルドカードを使用したファイルの選択することが出来ますので、その結果(ファイルのリスト)にてループ処理を行い、各ファイルの単語リストを生成すると良いのではないでしょうか。

質問のコードに以上を箇所の修正を加えましたので参考にしてください

import time
import MeCab
import glob
from gensim import corpora, models, similarities
from xlwt import Workbook


# ファイル指定
files = glob.glob('*.txt')

mecab = MeCab.Tagger ("-Ochasen")

# 文章(ファイル)毎の単語リストを登録するためのリスト
words_list = []

# ファイル毎の処理
for file in files:
    f = open(file, "r",encoding = "utf-8")
    text = f.read()
    f.close()

    #文字列を改行位置で区切って分割する(形態素解析)
    chunks = mecab.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(cols[2])

    # 単語リストの登録
    words_list.append(sels)


#辞書作成
dictionary = corpora.Dictionary(words_list)

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

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

  • Python 3.x

    10767questions

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

  • Mecab

    239questions

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