文書分類モデルのためのデータを作成しているのですが
可変長の文書から単語を順序を保持したままランダム抽出して固定長にする方法がわかりません。
例えば
sentence = ["I","can","not","understand","deep","learning"]
とある時に、3つ取り出したいとすると
["I","can","deep"]や["not","understand","learning"]
などのように 単語が逆走しないように順番を守られたまま取り出したいです。
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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総合スコア11038
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総合スコア15898
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
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総合スコア1009
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/26 00:43 編集
2018/09/26 01:39 編集
2018/09/26 02:00