Разделите предложения на подстроки, содержащие различное количество слов, используя панд - PullRequest
2 голосов
/ 06 июня 2019

Мой вопрос связан с моим прошлым вопросом: Разделить текст в ячейках и создать дополнительные строки для токенов .

Давайте предположим, что у меня есть следующее в DataFrame в pandas:

id  text
1   I am the first document and I am very happy.
2   Here is the second document and it likes playing tennis.
3   This is the third document and it looks very good today.

, и я хочу разделить текст каждого идентификатора на токены случайного числа слов (варьирующихся между двумя значениями, например, 1 и 5), поэтому я, наконец, хочу получить что-то вродеследующее:

id  text
1   I am the
1   first document
1   and I am very
1   happy
2   Here is
2   the second document and it
2   likes playing
2   tennis
3   This is the third
3   document and
3   looks very
3   very good today

Имейте в виду, что в моем фрейме данных могут быть и другие столбцы, кроме этих двух, которые следует просто скопировать на новый фрейм данных так же, как id выше.

Какой самый эффективный способ сделать это?

1 Ответ

2 голосов
/ 06 июня 2019

Определите функцию для извлечения фрагментов случайным образом, используя 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'])))
...