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

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

新規登録して質問してみよう
ただいま回答率
85.48%
多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

機械学習

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1243閲覧

一次元リストを多次元リストに変換したい。

robotKR

総合スコア32

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

機械学習

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/10/25 08:30

編集2021/10/25 08:47

前提・実現したいこと

Twitterから取得したツイートをAIに学習させてツイートを生成したいと思っています。
そこで保存するときに一次元リストを多次元リストに変換する必要があったので質問しました。
具体的には、1番目のような一次リストがあったら、カンマで切って2番目のようにしたいです。

#1.['あいうえお<|endoftext|>,かきくけこ<|endoftext|>'] #2.[['あいうえお<|endoftext|>'], ['かきくけこ<|endoftext|>']]

また、最初から入る文字列の数などが決まっていないので、そこもどうしたら良いのかわからないので教えてほしいです。

該当のソースコード

import tweepy import csv import pprint import pandas as pd import os import time import datetime import re import itertools #ここはお決まりです。 consumer_key = '' consumer_secret = '' access_token = '' access_token_secret = '' auth = tweepy.OAuthHandler(consumer_key, consumer_secret) auth.set_access_token(access_token, access_token_secret) api = tweepy.API(auth) #ツイートを保存するGoogle Driveのディレクトリです。事前に作っておきましょう。 drive_path = '/content/drive/MyDrive/tweet' #学習用のデータセットで必要なツイート数を指定しています。 max_tweets = 10000 def getMtTweet(): #取得したツイートを格納するための配列 tweets = [] num = 0 i = 1 print('page ' + str(i)) #自分のタイムラインを取得するためuser_timelineを使用します。1リクエストで取得できるツイートの上限数は100です。 tweet_data = api.home_timeline(count=100) if(len(tweet_data) > 0): for tweet in tweet_data: #データセット用に各ツイートの最後に<|endoftext|>をつけて整形します。 tweets.append([tweet.text+"<|endoftext|>"]) num += 1 i += 1 next_max_id = tweet_data[-1].id while True: print('page ' + str(i)) tweet_data = api.user_timeline(count=100, max_id=next_max_id-1) if(len(tweet_data) > 0): next_max_id = tweet_data[-1].id for tweet in tweet_data: tweets.append([tweet.text+"<|endoftext|>"]) num += 1 if(num >= max_tweets): break i += 1 #Twitter API制限の上限でエラーにならないようにディレイをかけています。 time.sleep((15*60)/180) else: break saveTweets(tweets) else: print('zero tweet') def saveTweets(tweets): print(tweets) ut = time.time() tweets=list(itertools.chain.from_iterable(tweets)) tweets=','.join(map(str, tweets))#list型をstr型に変換 tweets=re.sub(r'https?://[\w/:%#$&?()~.=+\-…]+', "", tweets) tweets=re.sub('RT', "", tweets) tweets=re.sub('お気に入り', "", tweets) tweets=re.sub('まとめ', "", tweets) tweets=re.sub(r'[!-~]', "", tweets)#半角記号,数字,英字 tweets=re.sub(r'[︰-@]', "", tweets)#全角記号 tweets=re.sub('\n', " ", tweets)#改行文字 print(tweets) tweets = tweets.split(' ')#str型からlist型へ変換 print(tweets) #テキストファイルで保存 file_path = drive_path+'myTweets_' + str(ut) + '.txt' file = open(file_path, 'w') w = csv.writer(file) w.writerows(tweets) file.close() with open(file_path) as f: print(f.read()) getMtTweet()

ここの部分で、一次元リストから多次元リストに変換したいと思っています。
ツイートを格納している変数はtweetsです。

tweets=list(itertools.chain.from_iterable(tweets)) tweets=','.join(map(str, tweets))#list型をstr型に変換 tweets=re.sub(r'https?://[\w/:%#$&?()~.=+\-…]+', "", tweets) tweets=re.sub('RT', "", tweets) tweets=re.sub('お気に入り', "", tweets) tweets=re.sub('まとめ', "", tweets) tweets=re.sub(r'[!-~]', "", tweets)#半角記号,数字,英字 tweets=re.sub(r'[︰-@]', "", tweets)#全角記号 tweets=re.sub('\n', " ", tweets)#改行文字 print(tweets) tweets = tweets.split(' ')#str型からlist型へ変換 print(tweets)

よろしくお願いします。

試したこと

Webサイトなどで調べても特定の文字で区切る方法が見つからなかったので質問させていただきました。

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

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

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

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

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

meg_

2021/10/25 10:57

> Webサイトなどで調べても特定の文字で区切る方法が見つからなかった どんな「検索ワード」で調べられましたか?
robotKR

2021/10/25 12:40

一次元リスト 二次元リスト 変換 というキーワードで調べました。
meg_

2021/10/25 12:52

そうですか。質問者さんのやりたいことが「1番目のような一次リストがあったら、カンマで切って2番目のようにしたい」でしたら、文字列操作について調査された方がベターだったかもしれません。※こちらについては既に回答がついていましたね。
robotKR

2021/10/25 12:58

なるほど。 そうですね〜。これからはそういう感じで調べてみようと思います! アドバイスありがとうございます。
guest

回答1

0

ベストアンサー

ご質問のコードでも使われているstr.split()ではダメでしょうか。

tweets['あいうえお<|endoftext|>,かきくけこ<|endoftext|>', ...]とすると、[['あいうえお<|endoftext|>'], ['かきくけこ<|endoftext|>'], ...]に変換するには以下のようにすればいいのではないかと。

python

1import itertools 2 3def flatten(xs): 4 return list(itertools.chain.from_iterable(xs)) 5 6# tweet は 'あいうえお<|endoftext|>,かきくけこ<|endoftext|>' なので split(',') すると 7# ['あいうえお<|endoftext|>', 'かきくけこ<|endoftext|>'] になる 8# [ ['あいうえお<|endoftext|>'], ['かきくけこ<|endoftext|>'], ... ] にしたいので、一旦 9# [ [['あいうえお<|endoftext|>'], ['かきくけこ<|endoftext|>']], ... ]として、それをflattenする 10tweets2d = flatten([[[content] for content in tweet.split(',')] for tweet in tweets])

一応、[ ['あいうえお<|endoftext|>', 'かきくけこ<|endoftext|>'], ... ]に変換する場合は以下です。

python

1tweets2d = [tweet.split(',') for tweet in tweets]

ご参考になれば幸いです。

投稿2021/10/25 08:58

fj68

総合スコア752

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

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

robotKR

2021/10/25 12:42

回答ありがとうございます。 明日試してみようと思います。
robotKR

2021/10/26 08:50 編集

すいません。 どうしてもわからないことがあるので質問させてほしいです。 NameError Traceback (most recent call last) <ipython-input-3-3f5c96f6b0b8> in <module>() 65 # [ ['あいうえお<|endoftext|>'], ['かきくけこ<|endoftext|>'], ... ] にしたいので、一旦 66 # [ [['あいうえお<|endoftext|>'], ['かきくけこ<|endoftext|>']], ... ]として、それをflattenする ---> 67 tweets2d = flatten([[[content] for content in tweet.split(',')] for tweet in tweets]) 68 69 def saveTweets(tweets): NameError: name 'tweets' is not defined とエラーが出てしまうんですが、どうしたらいいんでしょうか。 tweetsという変数はもう定義されているはずなのに何故こういうエラーが出るのがわからないので できれば教えていただけると幸いです。 追記:原因が突き止められたので多分自分で解決できると思います。 丁寧な回答ありがとうございました!!
fj68

2021/10/26 09:14

ご返信遅くなりましたが、解決できそうとのこと、良かったです。 頑張ってください!
robotKR

2021/10/26 10:04

ありがとうございます!!
robotKR

2021/10/28 10:06 編集

すいません。追加で質問よろしいでしょうか。 二日も経ってからの追加の質問ですので、面倒などと思われた場合は無視していただいても構いません。 エラーが出てしまっていて困っているので良ければ教えていただけると幸いです。 このようなコードで問題ないでしょうか? import tweepy import csv import pprint import pandas as pd import os import time import datetime import re import itertools #ここはお決まりです。 consumer_key = '' consumer_secret = '' access_token = '' access_token_secret = '' auth = tweepy.OAuthHandler(consumer_key, consumer_secret) auth.set_access_token(access_token, access_token_secret) api = tweepy.API(auth) #ツイートを保存するGoogle Driveのディレクトリです。事前に作っておきましょう。 drive_path = '/content/drive/MyDrive/tweet' #学習用のデータセットで必要なツイート数を指定しています。 max_tweets = 10000 def getMtTweet(): #取得したツイートを格納するための配列 global tweets tweets = [] num = 0 i = 1 print('page ' + str(i)) #自分のタイムラインを取得するためuser_timelineを使用します。1リクエストで取得できるツイートの上限数は100です。 tweet_data = api.home_timeline(count=100) if(len(tweet_data) > 0): for tweet in tweet_data: #データセット用に各ツイートの最後に<|endoftext|>をつけて整形します。 tweets.append([tweet.text+"<|endoftext|>"]) num += 1 i += 1 next_max_id = tweet_data[-1].id while True: print('page ' + str(i)) tweet_data = api.user_timeline(count=100, max_id=next_max_id-1) if(len(tweet_data) > 0): next_max_id = tweet_data[-1].id for tweet in tweet_data: tweets.append([tweet.text+"<|endoftext|>"]) num += 1 if(num >= max_tweets): break i += 1 #Twitter API制限の上限でエラーにならないようにディレイをかけています。 time.sleep((15*60)/180) else: break saveTweets(tweets) else: print('zero tweet') def saveTweets(tweets): print(tweets) ut = time.time() tweets=list(itertools.chain.from_iterable(tweets)) tweets=','.join(map(str, tweets))#list型をstr型に変換 tweets=re.sub(r'https?://[\w/:%#$&?()~.=+\-…]+', "", tweets) tweets=re.sub('RT', "", tweets) tweets=re.sub('お気に入り', "", tweets) tweets=re.sub('まとめ', "", tweets) tweets=re.sub(r'[!-~]', "", tweets)#半角記号,数字,英字 tweets=re.sub(r'[︰-@]', "", tweets)#全角記号 tweets=re.sub('\n', " ", tweets)#改行文字 print(tweets) flatten(xs) print(tweets) #テキストファイルで保存 file_path = drive_path+'myTweets_' + str(ut) + '.txt' file = open(file_path, 'w') w = csv.writer(file) w.writerows(tweets) file.close() with open(file_path) as f: print(f.read()) getMtTweet() def flatten(xs): return list(itertools.chain.from_iterable(xs)) tweets2d = flatten([[[content] for content in tweet.split(',')] for tweet in tweets]) エラーはこんな感じです。 NameError Traceback (most recent call last) <ipython-input-28-508c7d0c9bc8> in <module>() 88 89 ---> 90 getMtTweet() 91 92 def flatten(xs): 1 frames <ipython-input-28-508c7d0c9bc8> in saveTweets(tweets) 73 tweets=re.sub('\n', " ", tweets)#改行文字 74 print(tweets) ---> 75 flatten(xs) 76 tweets2d = flatten([[[content] for content in tweet.split(',')] for tweet in tweets]) 77 print(tweets) NameError: name 'xs' is not defined
fj68

2021/10/28 11:07

「flatten(xs)」ではなく「flatten(tweets)」が意図しているコードではないでしょうか。
fj68

2021/10/28 11:09

コメントなのでインデントが潰れてしまっているため正しく読み取れているかわかりませんが「getMtTweet()」という関数も定義されていないようです。 ご確認ください。
robotKR

2021/10/28 11:30

なるほど!! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問