Определите функцию для извлечения фрагментов случайным образом, используя itertools.islice
:
from itertools import islice
import random
lo, hi = 3, 5 # change this to whatever
def extract_chunks(it):
chunks = []
while True:
chunk = list(islice(it, random.choice(range(lo, hi+1))))
if not chunk:
break
chunks.append(' '.join(chunk))
return chunks
Вызовите функцию через понимание списка, чтобы обеспечить наименьшие возможные издержки, затем stack
, чтобы получить вывод:
pd.DataFrame([
extract_chunks(iter(text.split())) for text in df['text']], index=df['id']
).stack()
id
1 0 I am the
1 first document and I
2 am very happy.
2 0 Here is the
1 second document and
2 it likes playing tennis.
3 0 This is the third
1 document and it looks
2 very good today.
Вы можете расширить функцию extract_chunks
для выполнения токенизации. Прямо сейчас я использую простое разбиение на пустое пространство, которое вы можете изменить.
Обратите внимание, что если у вас есть другие столбцы, к которым вы не хотите прикасаться, вы можете сделать что-то вроде melt
операции здесь.
u = pd.DataFrame([
extract_chunks(iter(text.split())) for text in df['text']])
(pd.concat([df.drop('text', 1), u], axis=1)
.melt(df.columns.difference(['text'])))