テキストファイルへ一部のデータしか保存されない。

受付中

回答 2

投稿

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

1mzmk

score 16

私は、あるjsonファイルを使用しています。
私のjsonファイルは、下のURLのjsonファイルでワインについてのレビューについてのデータで、多くの種類のワインのレビューについてリストとして記載されています。
'https://github.com/tulip-lab/sit742/raw/master/Assessment/2019/data/wine.json'

行には”country”,"variety", "price", "point", "description"などの項目があります。
私のjsonファイルは下のような表になります。(1行が1レビューになってます。)

イメージ説明
このjsonファイルの”description”の列に含まれる単語でTF-IDF>0.4となるものを下のコードで出力しました。

import pandas as pd
from nltk.tokenize import RegexpTokenizer

df = pd.read_json("wine.json")
df2 = df.dropna(subset=['points','price'])
with open('stopwords.txt') as f:
    stop_words = f.read().splitlines()
stop_words = set(stop_words)

tokenizer = RegexpTokenizer(r"\w+(?:[-']\w+)?")

def f(s):
    tokens = tokenizer.tokenize(s)
    return " ".join(word for word in tokens if word not in stop_words)

df2["description"] = df2["description"].map(f)
df2.to_json("result.json")

df6 = pd.read_json("result.json")

df7 = df2["description"]

df8 = df6.query('variety == "Shiraz"')

df9 = df8["description"]
df9

from sklearn.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer(analyzer='word', stop_words = 'english')

vecs = tfidf.fit_transform(df9)

TF_IDF = vecs.toarray()
print(TF_IDF[TF_IDF>0.4])

import numpy as np

TF_IDF = vecs.toarray()
terms = tfidf.get_feature_names()
for idx, word in zip(*np.where(TF_IDF> 0.4)):
   print("INDEX:{}, WORD:{}, TF-IDF:{}".format(idx, terms[word], TF_IDF[(idx,word)])) 


上のコードを出力すると、下のようなTF-IDF>0.4の単語の一覧とTF-IDFのそれぞれの値が出力されました。

イメージ説明
これを'key_Shiraz.txt'という名前のテキストファイルに保存するために下のコードを入力しました。

df10 =  print("INDEX:{}, WORD:{}, TF-IDF:{}".format(idx, terms[word], TF_IDF[(idx,word)]))

text = df10
with open('key_Shiraz.txt','w') as f:
    f.write(text)


しかし、'key_Shiraz.txt'のファイルには下の写真のようにTF-IDF>0.4の単語の一覧とTF-IDFのそれぞれの値が出力されておらず、一つの行しか保存されていませんでした。
イメージ説明

私が出力したすべてのTF-IDF>0.4の単語の一覧とTF-IDFのそれぞれの値を”key_Shiraz.txt”
に保存するためにはdf10をどのように定義すればよろしいのでしょうか。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

+1

提示のコードは1行を出力するようなコードなので、そういう結果になりますね
複数行保存させたいならそのようにコードを書く必要があります

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/04/05 16:12

    その複数行保存させるためのコードはどのように書くことができるのでしょうか?
    お願いします。

    キャンセル

0

printがちゃんとできているなら、そこでファイルへの書き込みを同時にやってしまえば済むのでは。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/04/05 16:36

    TF_IDF = vecs.toarray()
    terms = tfidf.get_feature_names()
    for idx, word in zip(*np.where(TF_IDF> 0.4)):
    text = print("INDEX:{}, WORD:{}, TF-IDF:{}".format(idx, terms[word], TF_IDF[(idx,word)]))
    with open('key_Shiraz.txt','w') as f:
    f.write(text)
    と書くということでしょうか?

    キャンセル

  • 2019/04/05 19:53

    openは予め別のところで行って開きっぱなしにしておかないとまずいでしょうね。

    キャンセル

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

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

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