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

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

ただいまの
回答率

90.48%

  • Python 3.x

    10240questions

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

  • 機械学習

    984questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,374
退会済みユーザー

退会済みユーザー

前提・実現したいこと

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

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

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

作成途中のコード

# -*- coding: utf-8 -*-
#keyword表示
#指定したテキストファイル(日本語は分かち書きされたもののみ)に対応

import numpy as np
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
#from janome.tokenizer import Tokenizer

#CountVectorizer():文書ごとの単語の出現頻度を取得
count = CountVectorizer()

#文書を指定
doc = input('select file(ex,○○.txt):')
doc_name = doc
f = open(doc, encoding = 'utf-8')
doc = f.readlines()
f.close()

#絞り込みの基準を設定
level = float(input('set level(0.0 <= level <= 1.0):'))

#文書を表示
print('\n%s:%s\n' %(doc_name, doc))

#N種類の文字列を0からN-1までの整数に置き換える
bag = count.fit_transform(doc)
TF = bag.toarray()

#ディクショナリを表示
dic = count.get_feature_names()
print('dictionary:%s\n' %dic)

#各単語のインデックスを表示
print('index:%s\n' %count.vocabulary_)

#TfidfTransformer:(文書内の)TF-IDFを計算
tfidf = TfidfTransformer(use_idf = True, norm = 'l2', smooth_idf = True)
np.set_printoptions(precision = 2)
TF_IDF = tfidf.fit_transform(bag).toarray()

my_dic = []
w_cnt = 0

#keywordを表示
for idx, word, in zip(*np.where(level <= TF_IDF)):
    print('doc_num:%s, keyword:%s, TF-IDF:%s' %(idx, dic[word], TF_IDF[(idx, word)]))
    my_dic = list([(dic[word], TF_IDF[(idx, word)])]) #エラーは出ない
    my_dic[w_cnt] = list([(dic[word], TF_IDF[(idx, word)])]) #エラーが出る
    w_cnt += 1

print('word count:%s'%w_cnt)

#データセットを表示
print(my_dic)

補足情報

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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

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

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

「ValueError: Iterable over raw text documents expected, string object received.」
というエラーが出てしまいます。

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

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

以下、残骸

こいつでどうでしょう?

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

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

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/07/26 15:59

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

    キャンセル

  • 2017/07/26 16:18

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

    キャンセル

  • 2017/07/26 16: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 16:26

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

    キャンセル

  • 2017/07/26 16:33

    激しく凡ミスをしました。少々お待ちください。

    キャンセル

  • 2017/07/26 16:40

    ありがとうございます。
    よろしくお願いします。

    キャンセル

  • 2017/07/26 16:56

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

    キャンセル

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

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

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

  • Python 3.x

    10240questions

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

  • 機械学習

    984questions

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