我有一个如下所示的 Pandas 文本数据框:
+-----------------------------------+
| text |
+-----------------------------------+
| A very long sentence |
+-----------------------------------+
| Another very long sentence |
+-----------------------------------+
但我想用每行不超过 512 个单词的句子分割每一行:
+-----------------------------------+
| text |
+-----------------------------------+
| A piece of very long sentence |
+-----------------------------------+
| One more piece of long sentence |
+-----------------------------------+
我可以将我的数据转换为 python 列表,但 str.split()
可以使用分隔符。
有pythonic的方法来做到这一点吗?
答案 0 :(得分:0)
如果句子被 str.split()
分隔,您可以通过 str.join()
+' '
尝试:
df['text']=df['text'].str.split().str[:512].str.join(' ')
现在要检查长度(运行上述代码后),您可以执行以下操作:
df['text_len']=df['text'].str.split().str.len()
答案 1 :(得分:0)
让我们尝试 str.split
通过空格将文本拆分为“单词”,然后使用 Series.apply
将单词列表分成 512
组。然后使用 DataFrame.explode
拆分成多行:
limit = 512 # Set to limit words per row
df['text'] = (
df['text'].str.split().apply(lambda s: [
' '.join(s[pos:pos + limit]) # group into 512 size chunks
for pos in range(0, len(s), limit)
])
)
# Explode Into Multiple Rows
df = df.explode('text')
*请注意,此方法与 ' '
相结合,这意味着如果保存了 \n
或 \t
等格式信息,这将丢失。
使用lorem
生成样本数据的示例程序:
import random
import pandas as pd
from lorem.text import TextLorem
random.seed(5) # For reproducibility
gen = TextLorem(srange=(512, 1023))
df = pd.DataFrame({'text': [gen.sentence() for _ in range(2)]})
limit = 512
df['text'] = (
df['text'].str.split().apply(lambda s: [
' '.join(s[pos:pos + limit]) # group into 512 size chunks
for pos in range(0, len(s), limit)
])
)
# Explode Into Multiple Rows
df = df.explode('text')
# Sanity Check to count words per row
df['word_count'] = df['text'].str.split().str.len()
print(df)
df
:
text word_count
0 Tempora labore velit sit voluptatem tempora qu... 512
0 quiquia quaerat sit sit quisquam quisquam non ... 261
1 Ut labore ipsum aliquam sit adipisci sed neque... 512
1 quisquam velit sit ipsum tempora amet aliquam ... 352