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

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

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

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Q&A

解決済

1回答

6867閲覧

機械学習のためのデータセット作成

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

0グッド

0クリップ

投稿2017/07/26 06:34

編集2017/07/26 07:01

###前提・実現したいこと
テキストデータからtf-idf値が一定値以上の単語を抜き出し、そのデータをデータセットとして機械学習モデルに渡し、ジャンルを出力させるプログラムを作成したいと思っています。

現在、そのためのデータセットを準備しようとしている段階で、プログラム起動時にテキストファイル名と単語を絞り込むための数値を入力し、「文書(1つの文の)番号、単語、tf-idf値」を表示させることしかできていません。
これを[単語,tf-idf値]のリストを作成するように変更して機械学習させたいのですが、このようなデータセットの作成方法が正しいのか意見をいただきたいです。

また、現在のプログラムではテキストファイルを「全文書」、1つの文を「1つの文書」とみなしてtf-idf値を計算しているため、同じ単語を異なるtf-idf値で格納してしまいます。
なのでテキストファイルを「1つの文書」とみなすにはどうすればよいのか、それができた場合に、「全文書」はどのように定義するべきなのかを教えていただきたいです。

###作成途中のコード

python

1# -*- coding: utf-8 -*- 2#keyword表示 3#指定したテキストファイル(日本語は分かち書きされたもののみ)に対応 4 5import numpy as np 6from sklearn.feature_extraction.text import CountVectorizer 7from sklearn.feature_extraction.text import TfidfTransformer 8#from janome.tokenizer import Tokenizer 9 10#CountVectorizer():文書ごとの単語の出現頻度を取得 11count = CountVectorizer() 12 13#文書を指定 14doc = input('select file(ex,○○.txt):') 15doc_name = doc 16f = open(doc, encoding = 'utf-8') 17doc = f.readlines() 18f.close() 19 20#絞り込みの基準を設定 21level = float(input('set level(0.0 <= level <= 1.0):')) 22 23#文書を表示 24print('\n%s:%s\n' %(doc_name, doc)) 25 26#N種類の文字列を0からN-1までの整数に置き換える 27bag = count.fit_transform(doc) 28TF = bag.toarray() 29 30#ディクショナリを表示 31dic = count.get_feature_names() 32print('dictionary:%s\n' %dic) 33 34#各単語のインデックスを表示 35print('index:%s\n' %count.vocabulary_) 36 37#TfidfTransformer:(文書内の)TF-IDFを計算 38tfidf = TfidfTransformer(use_idf = True, norm = 'l2', smooth_idf = True) 39np.set_printoptions(precision = 2) 40TF_IDF = tfidf.fit_transform(bag).toarray() 41 42my_dic = [] 43w_cnt = 0 44 45#keywordを表示 46for idx, word, in zip(*np.where(level <= TF_IDF)): 47 print('doc_num:%s, keyword:%s, TF-IDF:%s' %(idx, dic[word], TF_IDF[(idx, word)])) 48 my_dic = list([(dic[word], TF_IDF[(idx, word)])]) #エラーは出ない 49 my_dic[w_cnt] = list([(dic[word], TF_IDF[(idx, word)])]) #エラーが出る 50 w_cnt += 1 51 52print('word count:%s'%w_cnt) 53 54#データセットを表示 55print(my_dic) 56

###補足情報
説明不足なところがあると思うので、不明なところがあれば質問をしていただけるとありがたいです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーを取るだけならappendを使えばよいです。

Python

1my_dic = [] 2my_dic[0] = list([]) # Error 3my_dic.append(list([])) # Ok

「ValueError: Iterable over raw text documents expected, string object received.」

というエラーが出てしまいます。

改めまして、こいつでどうでしょう?

Python

1doc_name = input('select file(ex,○○.txt):') 2with open(doc_name, encoding = 'utf-8') as f: 3 doc = [f.read().replace('\n', ' ')] # 改行文字を空白に置き換える

以下、残骸

こいつでどうでしょう?

Python

1doc_name = input('select file(ex,○○.txt):') 2with open(doc_name, encoding = 'utf-8') as f: 3 doc = f.read().split('\n')

関係ないところもちょいちょい書き直してしまいました。
失礼しました、これはreadlinesとほぼ一緒です。

投稿2017/07/26 06:47

編集2017/07/26 07:53
LouiS0616

総合スコア35660

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

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

退会済みユーザー

退会済みユーザー

2017/07/26 06:59

ありがとうございます。 リストの作成はできました。 readlines()をread()に変更した場合に 「ValueError: Iterable over raw text documents expected, string object received.」 というエラーが出てしまいます。 readlines()が各行を「1つの文書」とみなしている原因ということは理解することができたのですが、エラーの対処法が分かりません。 お手数をおかけしますが、アドバイスをいただきたいです。
退会済みユーザー

退会済みユーザー

2017/07/26 07:18

回答ありがとうございます。 アドバイスをいただいたのは """python doc = input('select file(ex,○○.txt):') doc_name = doc f = open(doc, encoding = 'utf-8') doc = f.read() f.close() """ の部分を書き換えればよいのでしょうか? 間違っている場合、どの部分を削除し、書き換えるのが正しいのかを教えていただきたいです。
LouiS0616

2017/07/26 07:19

その箇所であってます。 ちょっとファイルの開閉の部分もいじっていますが、次のように書き換えても同じです。 doc = input('select file(ex,○○.txt):') doc_name = doc f = open(doc, encoding = 'utf-8') doc = f.read().split('\n') f.close() まあ、冗長な部分が気になって、お節介しただけです。
退会済みユーザー

退会済みユーザー

2017/07/26 07:26

書き換えることはできたのですが、相変わらず各行を1つの文書とみなしているようで、同じ別の行にある同じ単語を異なるtf-idf値で格納しているようです。 変更をしたことでどのように変わったのか教えていただきたいです。
LouiS0616

2017/07/26 07:33

激しく凡ミスをしました。少々お待ちください。
退会済みユーザー

退会済みユーザー

2017/07/26 07:40

ありがとうございます。 よろしくお願いします。
退会済みユーザー

退会済みユーザー

2017/07/26 07:56

テキストファイルを1つの文書とみなし、リストを作成させることができました。 丁寧なアドバイスをしていただき、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問