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

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

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

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

Mecab

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

Q&A

解決済

1回答

2139閲覧

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

aoisj

総合スコア27

Python 3.x

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

Mecab

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

0グッド

0クリップ

投稿2017/10/24 05:32

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

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

python3

1#!/usr/bin/env python3 2# -*- coding: utf-8 -*- 3 4 5import time 6import MeCab 7from gensim import corpora, models, similarities 8from xlwt import Workbook 9 10#ファイル指定 11doc = input('select file(ex, ○○.txt):') 12t0 = time.time() 13f = open(doc, "r",encoding = "utf-8") 14text = f.read() 15f.close() 16 17#文字列を改行位置で区切って分割する(形態素解析) 18m = MeCab.Tagger ("-Ochasen") 19chunks = m.parse(text).splitlines() 20 21#絞り結果を格納 22sels = [] 23 24#絞り込み 25for chunk in chunks: 26 #chunk:形態素解析結果(1行の文字列) 27 #タブ(\t)で区切り、文字列リストを作成 28 cols = chunk.split('\t') 29 if len(cols) >= 4: 30 #parts[0]:品詞の種類 31 parts = cols[3].split('-') 32 #指定した品詞で始まっている場合 → 真 33 if parts[0].startswith('名詞') or parts[0].startswith('動詞'): 34 #要素(形態素)を追加 35 #sels:要素(形態素)のみの行列 36 sels.append(chunk[0]) 37 38#辞書作成 39dictionary = corpora.Dictionary([sels]) 40""" 41#単語の出現回数が1以下を除く 42dictionary.filter_extremes(no_below = 1) 43""" 44 45#[辞書の単語数]次元のベクトルに変換(コーパス作成) 46corpus = [dictionary.doc2bow(sels) for sel in sels] 47 48t1 = time.time() 49#LDAモデルに投入 50lda = models.LdaModel(corpus = corpus, id2word = dictionary, 51 #トピック数:5 52 num_topics = 5) 53t2 = time.time() 54print(lda) 55 56 57#各トピックにおける各トークンの出現確率を係数で表示 58for topic in lda.show_topics(-1): 59 print(topic) 60 61""" 62#文書の推定トピック番号 , 推定の確信度を表示 63for topics_per_document in lda[corpus]: 64 print(topics_per_document) 65""" 66 67lda_time = t2 -t1 68print('LDAモデル生成時間:%f秒'%lda_time) 69 70total_time = t2 - t0 71print('合計時間:%f秒'%total_time)

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

###実行環境
OS:ubuntsu
言語:python3

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

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

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

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

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

guest

回答1

0

ベストアンサー

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

Python

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

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

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

Python

1import time 2import MeCab 3import glob 4from gensim import corpora, models, similarities 5from xlwt import Workbook 6 7 8# ファイル指定 9files = glob.glob('*.txt') 10 11mecab = MeCab.Tagger ("-Ochasen") 12 13# 文章(ファイル)毎の単語リストを登録するためのリスト 14words_list = [] 15 16# ファイル毎の処理 17for file in files: 18 f = open(file, "r",encoding = "utf-8") 19 text = f.read() 20 f.close() 21 22 #文字列を改行位置で区切って分割する(形態素解析) 23 chunks = mecab.parse(text).splitlines() 24 25 #絞り結果を格納 26 sels = [] 27 28 #絞り込み 29 for chunk in chunks: 30 #chunk:形態素解析結果(1行の文字列) 31 #タブ(\t)で区切り、文字列リストを作成 32 cols = chunk.split('\t') 33 if len(cols) >= 4: 34 #parts[0]:品詞の種類 35 parts = cols[3].split('-') 36 #指定した品詞で始まっている場合 → 真 37 if parts[0].startswith('名詞') or parts[0].startswith('動詞'): 38 #要素(形態素)を追加 39 #sels:要素(形態素)のみの行列 40 sels.append(cols[2]) 41 42 # 単語リストの登録 43 words_list.append(sels) 44 45 46#辞書作成 47dictionary = corpora.Dictionary(words_list)

投稿2017/11/09 02:36

magichan

総合スコア15898

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問