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

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

新規登録して質問してみよう
ただいま回答率
85.48%
深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

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

Q&A

解決済

4回答

1233閲覧

文書内の単語の順序を保持したままでのリストからのランダム抽出

退会済みユーザー

退会済みユーザー

総合スコア0

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

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

0グッド

0クリップ

投稿2018/09/25 22:47

編集2018/09/25 23:11

文書分類モデルのためのデータを作成しているのですが
可変長の文書から単語を順序を保持したままランダム抽出して固定長にする方法がわかりません。

例えば

sentence = ["I","can","not","understand","deep","learning"]

とある時に、3つ取り出したいとすると

["I","can","deep"]や["not","understand","learning"]

などのように 単語が逆走しないように順番を守られたまま取り出したいです。

よろしくお願いします。

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

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

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

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

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

guest

回答4

0

公式ドキュメントのrandomを上から下まで全部読みましょう。迂遠に思えても大抵はそれが最善です。

https://docs.python.org/ja/3.6/library/random.html#random.sample

母集団のシーケンスまたは集合から選ばれた長さ k の一意な要素からなるリストを返します。重複無しのランダムサンプリングに用いられます。
(略)
ある範囲の整数からサンプルを取る場合、引数に range() オブジェクトを使用してください。大きな母集団の場合、これは特に速く、メモリ効率が良いです: sample(range(10000000), k=60)。

Python

1sentence = ["I","can","not","understand","deep","learning"] 2result = [sentence[i] for i in sorted(random.sample(range(len(sentence)), k=3))]

In [1]: import itertools, random In [2]: sentence = sorted(list(map(str, range(1000)))) In [3]: %timeit [sentence[i] for i in sorted(random.sample(range(len(sentence)), k=3))] 6.7 µs ± 99.3 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each) In [4]: %timeit [k for i, k in sorted(random.sample(list(enumerate(sentence)), k=3))] 49.4 µs ± 604 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each) In [5]: %time random.choice(list(itertools.combinations(sentence, 3))) CPU times: user 23.3 s, sys: 15 s, total: 38.2 s Wall time: 41.6 s

投稿2018/09/25 23:58

編集2018/09/26 00:12
quickquip

総合スコア11038

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

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

opyon

2018/09/26 00:43 編集

>random.sample とても便利ですね参考になります。 試しに実行速度計測したら面白い結果が出ました。 ソースのリストは共通のものを使用。 a-zの26文字x10回コピー=要素260個のリスト a-zの26文字x100回コピー=要素2600個のリスト 各コードを関数にして前後でtimes_nsで計測。 要素数増やせば総当たりの組み合わせ作るコードが遅くなるのは予測つきましたが @quiquiさんのコードがずっと0のままなのは何故なのでしょう? start = ns() cc() end = ns() print(end-start) 各結果上が要素260個,下が2600個 >@quiquiさんのコード cc() ['u', 'a', 's'] 0 ['f', 'u', 'u'] 0 >私のコード aa() c', 'g', 'o'] 4991200 ['g', 'r', 'u'] 3989500 >@magichanさんのコード bb() ('w', 'l', 'x') 340086900 bb() File "C:\workspace\Python\memo\C8.py", line 143, in bb ret = random.choice(list(itertools.combinations(sentence, 3))) MemoryError
quickquip

2018/09/26 01:39 編集

実際はPythonのコードを読まないとわからないですが、 random.sample は rangeオブジェクトを特別扱いしているんだと思います。https://docs.python.org/ja/3.6/library/stdtypes.html#range を見るとわかりますが、rangeオブジェクトは len()にも対応してるし、indexも実装してるし、in演算子もあります。いずれもシーケンスを**実際に生成する必要なく**実行可能です(rangeの引数に小数を許さない利点がここにあります)。たぶん random.sample もrangeを与えた場合は、range全体のシーケンスを**生成しない**んだろうと思います。なにしろ"これは特に速く、メモリ効率が良いです" って書いてありますからね。
opyon

2018/09/26 02:00

>"これは特に速く、メモリ効率が良いです" 素晴らしいですね。とても参考になりました。 @quiquiさんのコードから便利なtimeitを見つけたので計測し直してみました。 以下結果です。 sentence = [str(i) for i in range(10)] cc() 0.00943 aa() 0.00518 bb() 0.00669 sentence = [str(i) for i in range(50)] cc() 0.00563 aa() 0.00761 bb() 1.16263 sentence = [str(i) for i in range(100)] cc() 0.00458 aa() 0.00876 bb() 13.23051 for i in [10,50,100]: src_range = i loop = 1000 sentence = [str(j) for j in range(i)] print(f'sentence = [str(i) for i in range({src_range})]') t = timeit.timeit('cc()', globals=globals(),number=loop) print('cc()',f"{t:0.5f}") t = timeit.timeit('aa()', globals=globals(),number=loop) print('aa()',f"{t:0.5f}") t = timeit.timeit('bb()', globals=globals(),number=loop) print('bb()',f"{t:0.5f}")
guest

0

ベストアンサー

もとのリストの要素数にもよりますが、
先に itertools.combinations() にて全組み合わせのリストを作成し、random.choice()にてその中から1つ選択するという方法はいかがでしょうか

Python

1import itertools 2import random 3 4sentence = ["I","can","not","understand","deep","learning"] 5ret = random.choice(list(itertools.combinations(sentence, 3)))

投稿2018/09/25 23:23

編集2018/09/25 23:27
magichan

総合スコア15898

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

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

退会済みユーザー

退会済みユーザー

2018/09/25 23:47

ありがとうございます! お見受けしたところ自然言語処理をやられていらっしゃるようですが ゼロパディングや打ち切り以外に可変長から固定長に変換する方法などご存知ありませんでしょうか? また、この単語の取り方はどうでしょうか? お時間ありましたらアドバイスをよろしくお願いします。
guest

0

回答している間に仕様変わったので追記。
愚直にchoiceして削除してリストに追加してソートしてみました。
途中indexリストで順番を保持し最後にindexから単語を取得し出力。

Python3

1import random as rd 2def f(): 3 ch = rd.choice(src) 4 src.remove(ch) 5 return ch 6sentence = ["I","can","not","understand","deep","learning"] 7src = sentence.copy() 8ch_lst = [f() for _ in range(3)] 9print(ch_lst) 10id_lst = [] 11for ch in ch_lst: 12 id_lst.append(sentence.index(ch)) 13id_lst.sort() 14print(id_lst) 15result = [] 16for id_ in id_lst: 17 result.append(sentence[id_]) 18print(result)
['learning', 'deep', 'not'] [2, 4, 5] ['not', 'deep', 'learning']

愚直にchoiceして削除してリストに追加してソートしてみました。

Python3

1import random as rd 2def f(): 3 ch = rd.choice(src) 4 src.remove(ch) 5 return ch 6src = ["a","b","c","d","e","f","g","h","i","j"] 7ch_lst = [f() for _ in range(3)] 8ch_lst.sort() 9print(ch_lst)
['b', 'e', 'g']

投稿2018/09/25 23:15

編集2018/09/25 23:47
opyon

総合スコア1009

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

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

opyon

2018/09/25 23:20

仕様が変わってる。。。
退会済みユーザー

退会済みユーザー

2018/09/25 23:49

素早い回答ありがとうございます!
opyon

2018/09/25 23:52

回答してしまったけどよく見たら丸投げですね。
guest

0

3つ取り出してからソートする、って、3つ程度なら比較して格納でいいですね

投稿2018/09/25 22:59

y_waiwai

総合スコア87774

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

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

退会済みユーザー

退会済みユーザー

2018/09/25 23:06

すみません。この例ではアルファベットの抽出なのですが、 実際は文書分類モデルを作るときのデータとして 単語の順番を保持したままランダム抽出する時に使いたいんです。 誤解を生んですみません。書き直します!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問