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

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

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

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

Q&A

解決済

1回答

4091閲覧

大量のベクトルデータをCSVファイルに出力したら、途中のデータが省略されてしまう

okuya

総合スコア19

Python 3.x

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

1グッド

3クリップ

投稿2017/08/31 11:39

編集2022/05/26 13:42

CountVectorizerで単語の出現数をカウントしたデータをCSVファイルに出力したところ、
途中のデータが省略されてしまいます。(printも同様)

全データを出力するにはどうすれば良いでしょうか?

```python

from sklearn.feature_extraction.text import CountVectorizer
import csv

csvc_vec = CountVectorizer()
count = c_vec.fit_transform(data)
with open('count.csv', 'wt') as f:
writer = csv.writer(f)
writer.writerows(count)

以下、count.csvファイルをエディタ等で開いた表示 " (0, 0) 29 (0, 1) 22 省略 (0, 31) 6 (0, 32) 6 : : (0, 28745) 11 (0, 28749) 3 省略 (0, 28791) 1 (0, 28793) 26" 実際のdetaは、test5.pyのサンプルにように単語がブランクで区切られた文字列の配列です。 countの型とサイズは以下の通りです。 print(type(count)): <class 'scipy.sparse.csr.csr_matrix'> print(count.shape):(1, 28799) <test5.py> ```python from sklearn.feature_extraction.text import CountVectorizer import csv data = ['Twinkle twinkle little star' 'How I wonder what you are' 'Up above the world so high' 'Like a diamond in the sky' 'Twinkle twinkle little star' 'How I wonder what you are'] csvc_vec = CountVectorizer() count = csvc_vec.fit_transform(data) with open('count.csv', 'wt') as f: writer = csv.writer(f) writer.writerows(count) print(count) print(type(count)) print(count.shape)

test5.py

(0, 1) 1
(0, 7) 1
(0, 5) 1
(0, 3) 1
(0, 4) 1
(0, 8) 1
(0, 14) 1
(0, 10) 2
(0, 0) 1
(0, 2) 1
(0, 15) 2
(0, 12) 2
(0, 13) 2
(0, 9) 2
(0, 6) 2
(0, 11) 3
<class 'scipy.sparse.csr.csr_matrix'>
(1, 16)

退会済みユーザー👍を押しています

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

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

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

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

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

coco_bauer

2017/09/01 00:25

出力したCSVファイルの大きさ(バイト数)は、どうなっていますか? 単にPythonが人間が見やすいように途中を省略して表示しているだけではありませんか? 参考:https://ja.stackoverflow.com/questions/23332/
okuya

2017/09/01 05:04

サイズは1KBです。CSVファイルを開いても、質問に貼付したように途中が省略されています。
mdj

2017/09/01 05:45

興味本位で調べてみている程度なので、スルーしていただいても構いません。 dataにあたるデータを適当に作って処理してみているのですが、「(0, 0) 29 / (0, 1) 22 / ・・・」のようなカッコ内の値にならず、「(0, 78) 1 / (0, 58) 1 / (0, 184) 1」などのようになります。これはどのようなデータをdataとして渡しているのでしょうか。
okuya

2017/09/01 06:06

dataは、文章中の形態素を空白区切りで並べたデータです。 countは、detaをCountVectorizer()のfit_transformメソッドで学習させて、 ベクトルに変換した結果です。 '(0, 0) 29'は、行列(0,0)の形態素の数は29個であることを示してます。
can110

2017/09/01 06:58

countの詳細が分からないので、print(type(count))とprint(count.shape)の実行結果を追記ください。
okuya

2017/09/02 05:41

print(type(count))とprint(count.shape)の実行結果を追記しました。
okuya

2017/09/02 13:58

module_jungさん ありがとうございます。
guest

回答1

0

ベストアンサー

原因は、print(count)同様の出力結果を文字列としてそのまま書き込んでいるからです。

今一つやりたいことが分かりませんが、疎行列のまま、行列位置と値をCSV形式で出力したい場合は
scipy.io.mmwriteにてMatrix Market形式で出力したテキストを中間ファイルとして利用すれば可能です。

参考:Dump a sparse matrix into a file

Python

1from sklearn.feature_extraction.text import CountVectorizer 2 3# Scikit learnで行う文章の特徴ベクトルの抽出 4# http://nonbiri-tereka.hatenablog.com/entry/2015/06/04/070933 5cv = CountVectorizer() 6data = [ 7 'This is a pen.', 8 'That is a bot.', 9 'These are red document and blue document.', 10] 11count = cv.fit_transform(data) 12print(count) 13 14# Matrix Marketファイル(.mtx)を中間ファイルとして利用 15from scipy import io 16io.mmwrite( 'count', count) 17with open( 'count.mtx', 'r') as t: 18 lines = t.read().split('\n') 19 lines = lines[3:] # 不要な先頭3行を飛ばす 20 print(lines) 21import os 22#os.remove('count.mtx') # 不要なので削除 23 24import csv 25with open('count.csv', 'wt',newline='') as f: 26 writer = csv.writer(f) 27 for l in lines: 28 # 1 7 1 29 dat = l.split() 30 if len(dat) == 3: 31 # 行列位置を0オリジンに 32 dat[0] = int(dat[0]) - 1 33 dat[1] = int(dat[1]) - 1 34 writer.writerow(dat)

出力結果 : count.csv

0,6,1 0,5,1 0,10,1 1,3,1 1,8,1 1,5,1 2,2,1 2,0,1 2,4,2 2,7,1 2,1,1 2,9,1

あるいは自力で出力することもできます。

Python

1# 略 2 3def to_lines(m): 4 lines = [] 5 ip = m.indptr 6 for x in range(len(ip)-1): 7 s,e = ip[x], ip[x+1] 8 if s != e: 9 for y, v in zip( m.indices[s:e], m.data[s:e]): 10 lines.append((x,y,v)) 11 return lines 12 13lines = to_lines(count) 14lines.sort() # 分かりやすいように 15 16with open('ret.csv', 'w') as f: 17 for l in lines: 18 f.write(f'{l[0]},{l[1]},{l[2]}\n')

投稿2017/09/01 09:30

編集2022/05/26 04:42
can110

総合スコア38233

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

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

okuya

2017/09/02 05:46

can110さん いつも適切な助言ありがとうございます。 ご回答で示して頂いたコードを参考に実際のコードを修正したところ、やりたかったことができました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問