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

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

ただいまの
回答率

90.76%

  • Python 3.x

    5318questions

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

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

解決済

回答 1

投稿

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

aoisj

score 19

やりたいこと

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

実装中のプログラム

# -*- 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,
                      #トピック数:20
                      num_topics = 20)
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)


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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

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

import os
import glob

input_dir = input('select directory: ')
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())

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/10/27 15: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])

    キャンセル

  • 2017/10/27 15:33

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

    キャンセル

  • 2017/10/27 16:12

    アドバイスありがとうございます。
    このように変更することでtexts内に、
    指定したディレクトリ内の.txtファイルの内容がすべて入るということでよろしいでしょうか?

    現在、修正版で実行してみているところなのですが、
    最終的にはディレクトリ内の全てのファイルにトピック(ジャンル)のタグ付けをして、
    どのようなトピックに分かれたのかを確認できるようにしたいです。

    知識がないのでおかしな質問になってしまうかもしれないのですが、
    リスト(texts)を入力にしたまま実行する方法があれば教えていただきたいです。

    キャンセル

  • 2017/10/27 16:26

    > このように変更することで...
    print(texts)すればすぐ確認できるかと思います。

    > 知識がないのでおかしな質問になってしまうかもしれないのですが...
    私は言語系は専門外の素人です。
    誤ったアドバイスをしてしまう恐れがあるので、方針は他の人に相談した方がいいです。

    キャンセル

  • 2017/10/27 16:28

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

    キャンセル

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

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

関連した質問

  • 解決済

    mecab-asyncによる文字化け

    mecab-asyncの例にあった var MeCab = new require('mecab-async') , mecab = new MeCab() ; var

  • 解決済

    pythonでMecabを利用した語彙解析がうまくできない。

    ●環境 ・Windows Edition:Windows 7 Professional  Service Pack 1 ・pythonバージョン:Python 3.6.2 (v3.

  • 解決済

    mecab 品詞 選択

    やりたいこと 選択したテキストファイル内の文章をmecabを用いて形態素解析し、 品詞(名詞、動詞など)を絞り込みたいと考えています。 現在、テキストファイルの文章を形態素解析する

  • 解決済

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

    やりたいこと 複数のテキストファイルを入力とし、指定したトピック数に分類するプログラムを作成したいと考えています。 現在、一つのテキストファイルをLDAモデルに投入するプログラムは

  • 解決済

    指定した言葉を排除したい

    やりたいこと テキストファイルからトピックモデルを作成するプログラムを実装中なのですが、コーパスを生成するのに用いる辞書に指示語(あれ、ここ、そちら)や、それ自体に重要な意味を持た

  • 解決済

    mecabでセリフのみを抽出したい

    やりたいこと mecabを用いて入力したテキストファイルのセリフ部分(「」や『』で囲まれている部分)の 名詞(代名詞,非自立名詞,数,固有名詞を除く)を取り出して行列selsに格納

  • 解決済

    テキストに番号を付けて管理したい

    困っていること 入力したファイルのトピックを抽出するための前段階として 指定したディレクトリ内の.txtファイルを用いてLDAモデルを作成するプログラムを実装したのですが、 現在の

  • 受付中

    1つのファイルのトピックを調べたい(LDAモデル)

    質問 LDAモデルに詳しい方に質問です。 また、以下に記すプログラムで 複数の小説のテキストファイルからLDAモデルを作成したとき、その中に含まれる 1つの文書のトピックを参照

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

  • Python 3.x

    5318questions

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