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

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

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

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

Q&A

解決済

1回答

193閲覧

ディレクトリ内のテキストファイルを入力に

aoisj

総合スコア27

Python 3.x

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

0グッド

0クリップ

投稿2017/10/27 03:33

###やりたいこと
タイトルにもある通りなのですが、python3で作成したプログラムの入力に
作業ディレクトリ内にある、テキストファイルを複数保存したフォルダを使いたいと
思っています。
以下に記すプログラムでは入力として、作業ディレクトリ内の1つのテキストファイルを指定するようになっています。
現在実装中のプログラムをどのように修正すれば良いのかを教えていただきたいです。
###実装中のプログラム

python3

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

汚いコードで申し訳ありません。

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

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

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

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

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

guest

回答1

0

ベストアンサー

このようにすれば、指定ディレクトリ直下のtxtファイルを取得できます。

Python

1import os 2import glob 3 4input_dir = input('select directory: ') 5txt_list = glob.glob(input_dir + os.sep + '*.txt') 6 7texts = [] 8for file in txt_list: 9 with open(file, 'r', encoding='utf-8') as f: 10 texts.append(f.read())

投稿2017/10/27 05:59

LouiS0616

総合スコア35660

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

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

aoisj

2017/10/27 06:26

アドバイスありがとうございます。 教えていただいたように修正し、 実行してみたのですが、以下のエラーが出てしまいました。 NotImplementedError: Wrong number or type of arguments for overloaded function 'Tagger_parse'. Possible C/C++ prototypes are: MeCab::Tagger::parse(MeCab::Model const &,MeCab::Lattice *) MeCab::Tagger::parse(MeCab::Lattice *) const MeCab::Tagger::parse(char const *) 「引数が間違っている」というエラーが出ていると思ったのですが、原因が分かりません。 追加でアドバイスをいただきたいです。 以下にいただいたアドバイスを元に修正した部分を記します。 import time import os import glob import MeCab from gensim import corpora, models, similarities from xlwt import Workbook #ディレクトリ指定 input_dir = input('select directory:') t0 = time.time() txt_list = glob.glob(input_dir + os.sep + '*.txt') texts = [] for file in txt_list: with open(file, 'r', encoding='utf-8') as f: texts.append(f.read()) f.close() #文字列を改行位置で区切って分割する(形態素解析) m = MeCab.Tagger ("-Ochasen") chunks = m.parse(texts).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])
LouiS0616

2017/10/27 06:33

textsがリストだからかと思います。 全てのファイルをごちゃまぜにしていいのなら、次のように書いてもいいでしょう。 texts = '' for file in txt_list: ....with open(file, 'r', encoding='utf-8') as f: ........texts += f.read()
aoisj

2017/10/27 07:12

アドバイスありがとうございます。 このように変更することでtexts内に、 指定したディレクトリ内の.txtファイルの内容がすべて入るということでよろしいでしょうか? 現在、修正版で実行してみているところなのですが、 最終的にはディレクトリ内の全てのファイルにトピック(ジャンル)のタグ付けをして、 どのようなトピックに分かれたのかを確認できるようにしたいです。 知識がないのでおかしな質問になってしまうかもしれないのですが、 リスト(texts)を入力にしたまま実行する方法があれば教えていただきたいです。
LouiS0616

2017/10/27 07:26

> このように変更することで... print(texts)すればすぐ確認できるかと思います。 > 知識がないのでおかしな質問になってしまうかもしれないのですが... 私は言語系は専門外の素人です。 誤ったアドバイスをしてしまう恐れがあるので、方針は他の人に相談した方がいいです。
LouiS0616

2017/10/27 07:28

まあ、リスト内の要素にアクセスしたいのであれば単にfor文を使えばいいのですが。 可読性は落ちますが、ネストしてしまうのが最も簡単です。 出来れば1ファイルに対する処理を関数にしたいところですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問