0

0

Pandas DataFrame长文本列按长度和句子边界智能拆分指南

碧海醫心

碧海醫心

发布时间:2025-09-27 10:39:00

|

197人浏览过

|

来源于php中文网

原创

Pandas DataFrame长文本列按长度和句子边界智能拆分指南

本教程详细介绍了如何在Pandas DataFrame中处理超长文本列。针对需要将文本拆分为固定长度(例如300字符)且每个分段都保持句子完整性的场景,我们将利用NLTK库进行句子分词,并结合自定义函数实现按长度智能分段,最终将原始长文本列转换为多个新的、符合要求的分段列,确保数据导入和后续处理的便捷性。

引言:长文本数据处理的挑战

在数据分析和处理过程中,我们经常会遇到pandas dataframe中包含超长文本(例如描述、评论、文章内容等)的列。这些文本的长度可能远超某些系统或数据库的字段限制,导致数据导入或后续处理出现问题。常见的需求是将这些长文本拆分成多个较短的片段。然而,仅仅根据固定长度进行硬性截断往往会破坏文本的语义完整性,例如将一个句子从中间截断。更理想的方案是既要遵守长度限制,又要确保每个分段都以完整的句子结束。

解决方案概述:NLTK与自定义函数

为了实现这一目标,我们需要结合使用Python的自然语言工具包(NLTK)和自定义的逻辑函数。NLTK提供了强大的句子分词(Sentence Tokenization)能力,可以将长文本精确地拆分成独立的句子。在此基础上,我们可以设计一个函数来累积这些句子,直到它们的总长度接近或达到预设的最大长度限制,然后将累积的句子作为一个分段输出,并开始新的分段。

核心实现:split_sentences 函数详解

以下是实现上述逻辑的关键函数:

import pandas as pd
import nltk
# 确保NLTK的punkt分词器已下载
try:
    nltk.data.find('tokenizers/punkt')
except nltk.downloader.DownloadError:
    nltk.download('punkt')

def split_sentences(text, max_len=300, prefix='col'):
    """
    将长文本按句子和最大长度限制进行拆分。

    Args:
        text (str): 待拆分的原始长文本。
        max_len (int): 每个分段的最大字符长度。
        prefix (str): 生成新列名的前缀。

    Returns:
        pd.Series: 包含拆分后文本片段的Series,其索引将作为新列名的一部分。
    """
    out = []  # 存储最终的文本分段
    tmp = []  # 临时存储当前分段中的句子
    current_len = 0  # 当前分段的累计长度

    # 使用NLTK进行句子分词
    sentences = nltk.sent_tokenize(text)

    for sentence in sentences:
        # 考虑句子之间的空格,通常在join时添加
        sentence_with_space_len = len(sentence) + (1 if tmp else 0) # 只有非空tmp才加空格长度

        # 如果当前句子加入后会超过最大长度限制
        # 并且当前分段中已有句子(避免单个句子过长时,将空字符串作为第一个分段)
        if current_len + sentence_with_space_len > max_len and tmp:
            out.append(' '.join(tmp))  # 将当前累积的句子合并成一个分段
            tmp = []  # 重置临时句子列表
            current_len = 0 # 重置当前分段长度

        # 将当前句子添加到临时列表
        tmp.append(sentence)
        # 更新当前分段的累计长度
        current_len += sentence_with_space_len

    # 处理最后一个分段(如果tmp中还有剩余句子)
    if tmp:
        out.append(' '.join(tmp))

    # 将结果转换为Pandas Series,并使用指定前缀和序号命名列
    return pd.Series(out).rename(lambda x: f'{prefix}_{x+1}')

函数逻辑解析:

  1. NLTK句子分词: nltk.sent_tokenize(text) 是实现句子完整性的关键。它将输入文本精确地分割成一个句子列表。
  2. 累积与判断:
    • tmp 列表用于临时存储当前正在构建的分段中的句子。
    • current_len 跟踪 tmp 中所有句子的总长度(考虑句子之间的空格)。
    • 在遍历每个句子时,我们首先检查如果将当前句子加入 tmp,是否会超过 max_len。
    • 如果超过且 tmp 不为空(确保至少有一个句子可以作为前一个分段),则将 tmp 中的句子合并成一个字符串,添加到 out 列表,并清空 tmp 和 current_len,开始新的分段。
  3. 处理剩余句子: 循环结束后,tmp 中可能还包含最后一个分段的句子,需要将其添加到 out。
  4. 返回Pandas Series: 函数最终返回一个Pandas Series。这样做的目的是为了方便后续使用 df.apply 方法将多个分段结果作为新列添加到原始DataFrame中。rename 方法确保新列名具有一致的格式(例如 col_1, col_2)。

将函数应用于DataFrame

有了 split_sentences 函数,我们可以将其应用到DataFrame的指定文本列上。

示例数据准备:

ChatGPT Website Builder
ChatGPT Website Builder

ChatGPT网站生成器,AI对话快速生成网站

下载
# 示例输入数据
lipsum = '''Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor. Cras elementum ultrices diam. Maecenas ligula massa, varius a, semper congue, euismod non, mi. Proin porttitor, orci nec nonummy molestie, enim est eleifend mi, non fermentum diam nisl sit amet erat. Duis semper. Duis arcu massa, scelerisque vitae, consequat in, pretium a, enim. Pellentesque congue. Ut in risus volutpat libero pharetra tempor. Cras vestibulum bibendum augue. Praesent egestas leo in pede. Praesent blandit odio eu enim. Pellentesque sed dui ut augue blandit sodales. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aliquam nibh. Mauris ac mauris sed pede pellentesque fermentum. Maecenas adipiscing ante non diam sodales hendrerit.'''
df = pd.DataFrame({'other': [1, 2], 'text': [lipsum, lipsum.upper()]})

print("原始DataFrame:")
print(df)
print("\n原始文本长度示例:")
print(df['text'].apply(len))

应用函数并处理DataFrame:

# 应用split_sentences函数到'text'列
# df['text'].apply(split_sentences) 会为每一行返回一个Series
# df.join() 将这些Series作为新列添加到原始DataFrame中
# drop(columns='text') 移除原始的长文本列
out_df = df.join(df['text'].apply(split_sentences, max_len=300)).drop(columns='text')

print("\n处理后的DataFrame:")
print(out_df)

示例输出:

原始DataFrame:
   other                                               text
0      1  Lorem ipsum dolor sit amet, consectetur adipis...
1      2  LOREM IPSUM DOLOR SIT AMET, CONSECTETUR ADIPIS...

原始文本长度示例:
0    867
1    867
Name: text, dtype: int64

处理后的DataFrame:
   other                                              col_1  \
0      1  Lorem ipsum dolor sit amet, consectetur adipis...   
1      2  LOREM IPSUM DOLOR SIT AMET, CONSECTETUR ADIPIS...   

                                               col_2  \
0  Proin porttitor, orci nec nonummy molestie, en...   
1  PROIN PORTTITOR, ORCI NEC NONUMMY MOLESTIE, EN...   

                                               col_3  \
0  Praesent egestas leo in pede. Praesent blandit...   
1  PRAESENT EGESTAS LEO IN PEDE. PRAESENT BLANDIT...   

                                               col_4  
0  Maecenas adipiscing ante non diam sodales hend...  
1  MAECENAS ADIPISCING ANTE NON DIAM SODALES HEND...  

从输出中可以看到,原始的 text 列已被删除,取而代之的是 col_1, col_2, col_3, col_4 等新列,每个新列都包含长度不超过300字符且保持句子完整性的文本片段。

注意事项

  1. NLTK安装与模型下载: 在运行代码之前,请确保已安装NLTK库 (pip install nltk),并且下载了 punkt 分词器模型 (nltk.download('punkt'))。代码中已包含自动下载的逻辑。
  2. max_len 参数: max_len 参数是控制分段长度上限的关键。根据实际需求调整此值。需要注意的是,如果单个句子的长度超过 max_len,该句子仍会被完整地放入一个分段中,导致该分段的长度超出 max_len。此函数优先保证句子完整性。
  3. 性能考量: 对于包含数百万行或非常长文本的DataFrame,df.apply() 操作可能会比较耗时。在这种情况下,可以考虑使用 pandarallel 等库进行并行处理,或者优化 split_sentences 函数的内部逻辑以提高效率。
  4. 列名生成: prefix 参数允许您自定义生成的新列名的前缀,这在处理多个需要分段的文本列时非常有用。
  5. 文本预处理: 在某些情况下,原始文本可能需要进行额外的预处理,例如去除HTML标签、特殊字符或进行标准化,以确保NLTK分词的准确性。

总结

通过结合NLTK的句子分词能力和自定义的长度累积逻辑,我们成功地解决了Pandas DataFrame中长文本列的智能拆分问题。这种方法不仅满足了长度限制,更重要的是保证了文本分段的语义完整性,极大地提高了数据处理的灵活性和后续利用的便利性。在实际应用中,根据具体的数据特点和性能要求,可以进一步优化和调整此方案。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

69

2025.12.04

pip安装使用方法
pip安装使用方法

安装步骤:1、确保Python已经正确安装在您的计算机上;2、下载“get-pip.py”脚本;3、按下Win + R键,然后输入cmd并按下Enter键来打开命令行窗口;4、在命令行窗口中,使用cd命令切换到“get-pip.py”所在的目录;5、执行安装命令;6、验证安装结果即可。大家可以访问本专题下的文章,了解pip安装使用方法的更多内容。

339

2023.10.09

更新pip版本
更新pip版本

更新pip版本方法有使用pip自身更新、使用操作系统自带的包管理工具、使用python包管理工具、手动安装最新版本。想了解更多相关的内容,请阅读专题下面的文章。

416

2024.12.20

pip设置清华源
pip设置清华源

设置方法:1、打开终端或命令提示符窗口;2、运行“touch ~/.pip/pip.conf”命令创建一个名为pip的配置文件;3、打开pip.conf文件,然后添加“[global];index-url = https://pypi.tuna.tsinghua.edu.cn/simple”内容,这将把pip的镜像源设置为清华大学的镜像源;4、保存并关闭文件即可。

761

2024.12.23

python升级pip
python升级pip

本专题整合了python升级pip相关教程,阅读下面的文章了解更多详细内容。

349

2025.07.23

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

320

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1503

2023.10.24

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

14

2026.01.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 3.7万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号