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

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

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

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

Mecab

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

Q&A

解決済

1回答

1558閲覧

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

aoisj

総合スコア27

Python 3.x

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

Mecab

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

0グッド

0クリップ

投稿2017/11/21 04:13

###困っていること
入力したファイルのトピックを抽出するための前段階として
指定したディレクトリ内の.txtファイルを用いてLDAモデルを作成するプログラムを実装したのですが、
現在のプログラムの場合全てのファイルの中身を1つの文字列に格納しているので、
どのファイルにどのようなトピックが含まれているのかを調べることができません。

実装したプログラムを以下に記します。

python

1import time 2import MeCab 3from gensim import corpora, models 4 5#ファイル指定 6doc = input('select file(ex, ○○.txt):') 7 8t0 = time.time() 9 10f = open(doc, "r",encoding = "utf-8") 11text = f.read() 12f.close() 13 14#文字列を改行位置で区切って分割する(形態素解析) 15m = MeCab.Tagger ("-Ochasen") 16chunks = m.parse(text).splitlines() 17 18sels = [] 19 20#絞り込み 21for chunk in chunks: 22 #chunk:形態素解析結果(1行の文字列) 23 #タブ(\t)で区切り、文字列リストを作成 24 cols = chunk.split('\t') 25 if len(cols) >= 4: 26 #parts[0]:品詞の種類 27 parts = cols[3].split('-') 28 #指定した品詞で始まっている場合 → true 29 if parts[0].startswith('名詞'): 30 #代名詞,非自立名詞,固有名詞,数を含めない 31 if parts[0].startswith('名詞') and parts[1] in ['代名詞','非自立','固有名詞','数']: 32 continue 33 #形態素を追加 34 #sels:形態素(原形)のみの行列 35 sels.append(cols[2]) 36 37#辞書作成 38dictionary = corpora.Dictionary([sels]) 39 40print(dictionary) 41 42#[辞書の単語数]次元のベクトルに変換(コーパス作成) 43corpus = [dictionary.doc2bow(sels)] 44 45""" 46print('corpus↓') 47print(corpus) 48""" 49 50t1 = time.time() 51 52#トピック数 53num_topics = 10 54 55#LDAモデルに投入 56lda = models.LdaModel(corpus = corpus, id2word = dictionary,num_topics = num_topics)

###質問
変数を用意し、ファイルを読み込む毎にインクリメントを行い、
[ファイル番号,そのファイルの中身]・・・①
もしくは
[ファイル番号,そのファイル番号のファイル名]・・・②
といった配列?辞書?のようなデータセットを作成すると
ファイル毎の情報の管理できるのではないかと思っています。
欲張りな相談になってしまうのですが、現在のプログラムとやりたいことを踏まえると、
①と②のどちらが良いなのか、
またどのように実装すれば良いのかアドバイスをいただきたいです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

例えば、テキストファイル全てを dataディレクトリに入れておき glob を使って

Python

1import glob 2files = glob.glob('data/*.txt') 3print(files)

とすると、dataディレクトリの中のテキストファイルがリスト化されfilesに入りますので、このリストを使って管理すると良いのではないでしょうか。

このfilesリストを使い、以下のようにループ処理を行うことで、各ファイル毎に文章行列を作成することができます。

Python

1import glob 2import MeCab 3from gensim import corpora, models 4 5files = glob.glob('data/*.txt') 6mecab = MeCab.Tagger ("-Ochasen") 7texts = [] 8for file in files: 9 f = open(file, "r",encoding = "utf-8") 10 text = f.read() 11 f.close() 12 13 chunks = mecab.parse(text).splitlines() 14 15 sels = [] 16 for chunk in chunks: 17 cols = chunk.split('\t') 18 if len(cols) >= 4: 19 parts = cols[3].split('-') 20 if parts[0].startswith('名詞'): 21 sels.append(cols[2]) 22 texts.append(sels) 23 24dictionary = corpora.Dictionary(texts) 25corpus = [dictionary.doc2bow(text) for text in texts]

またファイル番号に対応するファイル名は

Pyton

1topic_no = 5 2print(files[topic_no])

で確認できるかとおもいます。

投稿2017/11/21 05:10

magichan

総合スコア15898

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

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

aoisj

2017/11/21 06:49

回答ありがとうございます。 正しく実行できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問