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

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

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

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

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

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

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

核心实现:split_sentences 函数详解

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

import pandas as pdimport 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}')

函数逻辑解析:

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

将函数应用于DataFrame

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

示例数据准备:

# 示例输入数据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                                               text0      1  Lorem ipsum dolor sit amet, consectetur adipis...1      2  LOREM IPSUM DOLOR SIT AMET, CONSECTETUR ADIPIS...原始文本长度示例:0    8671    867Name: text, dtype: int64处理后的DataFrame:   other                                              col_1        1  Lorem ipsum dolor sit amet, consectetur adipis...   1      2  LOREM IPSUM DOLOR SIT AMET, CONSECTETUR ADIPIS...                                                  col_2    Proin porttitor, orci nec nonummy molestie, en...   1  PROIN PORTTITOR, ORCI NEC NONUMMY MOLESTIE, EN...                                                  col_3    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字符且保持句子完整性的文本片段。

注意事项

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

总结

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

以上就是Pandas DataFrame长文本列按长度和句子边界智能拆分指南的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1373977.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月14日 13:44:57
下一篇 2025年12月14日 13:45:12

相关推荐

  • 如何解决本地图片在使用 mask JS 库时出现的跨域错误?

    如何跨越localhost使用本地图片? 问题: 在本地使用mask js库时,引入本地图片会报跨域错误。 解决方案: 要解决此问题,需要使用本地服务器启动文件,以http或https协议访问图片,而不是使用file://协议。例如: python -m http.server 8000 然后,可以…

    2025年12月24日
    200
  • 使用 Mask 导入本地图片时,如何解决跨域问题?

    跨域疑难:如何解决 mask 引入本地图片产生的跨域问题? 在使用 mask 导入本地图片时,你可能会遇到令人沮丧的跨域错误。为什么会出现跨域问题呢?让我们深入了解一下: mask 框架假设你以 http(s) 协议加载你的 html 文件,而当使用 file:// 协议打开本地文件时,就会产生跨域…

    2025年12月24日
    200
  • 正则表达式在文本验证中的常见问题有哪些?

    正则表达式助力文本输入验证 在文本输入框的验证中,经常遇到需要限定输入内容的情况。例如,输入框只能输入整数,第一位可以为负号。对于不会使用正则表达式的人来说,这可能是个难题。下面我们将提供三种正则表达式,分别满足不同的验证要求。 1. 可选负号,任意数量数字 如果输入框中允许第一位为负号,后面可输入…

    2025年12月24日
    000
  • 为什么多年的经验让我选择全栈而不是平均栈

    在全栈和平均栈开发方面工作了 6 年多,我可以告诉您,虽然这两种方法都是流行且有效的方法,但它们满足不同的需求,并且有自己的优点和缺点。这两个堆栈都可以帮助您创建 Web 应用程序,但它们的实现方式却截然不同。如果您在两者之间难以选择,我希望我在两者之间的经验能给您一些有用的见解。 在这篇文章中,我…

    2025年12月24日
    000
  • 姜戈顺风

    本教程演示如何在新项目中从头开始配置 django 和 tailwindcss。 django 设置 创建一个名为 .venv 的新虚拟环境。 # windows$ python -m venv .venv$ .venvscriptsactivate.ps1(.venv) $# macos/linu…

    2025年12月24日
    000
  • 花 $o 学习这些编程语言或免费

    → Python → JavaScript → Java → C# → 红宝石 → 斯威夫特 → 科特林 → C++ → PHP → 出发 → R → 打字稿 []https://x.com/e_opore/status/1811567830594388315?t=_j4nncuiy2wfbm7ic…

    2025年12月24日
    000
  • 学会从头开始学习CSS,掌握制作基本网页框架的技巧

    从零开始学习CSS,掌握网页基本框架制作技巧 前言: 在现今互联网时代,网页设计和开发是一个非常重要的技能。而学习CSS(层叠样式表)是掌握网页设计的关键之一。CSS不仅可以为网页添加样式和布局,还可以为用户呈现独特且具有吸引力的页面效果。在本文中,我将为您介绍一些基本的CSS知识,以及一些常用的代…

    2025年12月24日
    200
  • 揭秘Web标准涵盖的语言:了解网页开发必备的语言范围

    在当今数字时代,互联网成为了人们生活中不可或缺的一部分。作为互联网的基本构成单位,网页承载着我们获取和分享信息的重要任务。而网页开发作为一门独特的技术,离不开一些必备的语言。本文将揭秘Web标准涵盖的语言,让我们一起了解网页开发所需的语言范围。 首先,HTML(HyperText Markup La…

    2025年12月24日
    000
  • 揭开Web开发的语言之谜:了解构建网页所需的语言有哪些?

    Web标准中的语言大揭秘:掌握网页开发所需的语言有哪些? 随着互联网的快速发展,网页开发已经成为人们重要的职业之一。而要成为一名优秀的网页开发者,掌握网页开发所需的语言是必不可少的。本文将为大家揭示Web标准中的语言大揭秘,介绍网页开发所需的主要语言。 HTML(超文本标记语言)HTML是网页开发的…

    2025年12月24日
    400
  • 常用的网页开发语言:了解Web标准的要点

    了解Web标准的语言要点:常见的哪些语言应用在网页开发中? 随着互联网的不断发展,网页已经成为人们获取信息和交流的重要途径。而要实现一个高质量、易用的网页,离不开一种被广泛接受的Web标准。Web标准的制定和应用,涉及到多种语言和技术,本文将介绍常见的几种语言在网页开发中的应用。 首先,HTML(H…

    2025年12月24日
    000
  • 网页开发中常见的Web标准语言有哪些?

    探索Web标准语言的世界:网页开发中常用的语言有哪些? 在现代社会中,互联网的普及程度越来越高,网页已成为人们获取资讯、娱乐、交流的重要途径。而网页的开发离不开各种编程语言的应用和支持。在这个虚拟世界的网络,有许多被广泛应用的标准化语言,用于为用户提供优质的网页体验。本文将探索网页开发中常用的语言,…

    2025年12月24日
    000
  • 深入探究Web标准语言的范围,涵盖了哪些语言?

    Web标准是指互联网上的各个网页所需遵循的一系列规范,确保网页在不同的浏览器和设备上能够正确地显示和运行。这些标准包括HTML、CSS和JavaScript等语言。本文将深入解析Web标准涵盖的语言范围。 首先,HTML(HyperText Markup Language)是构建网页的基础语言。它使…

    2025年12月24日
    000
  • CSS 超链接属性解析:text-decoration 和 color

    CSS 超链接属性解析:text-decoration 和 color 超链接是网页中常用的元素之一,它能够在不同页面之间建立连接。为了使超链接在页面中有明显的标识和吸引力,CSS 提供了一些属性来调整超链接的样式。本文将重点介绍 text-decoration 和 color 这两个与超链接相关的…

    2025年12月24日
    000
  • 看看这些前端面试题,带你搞定高频知识点(一)

    每天10道题,100天后,搞定所有前端面试的高频知识点,加油!!!,在看文章的同时,希望不要直接看答案,先思考一下自己会不会,如果会,自己的答案是什么?想过之后再与答案比对,是不是会更好一点,当然如果你有比我更好的答案,欢迎评论区留言,一起探讨技术之美。 面试官:给定一个元素,如何实现水平垂直居中?…

    2025年12月24日 好文分享
    300
  • 看看这些前端面试题,带你搞定高频知识点(二)

    每天10道题,100天后,搞定所有前端面试的高频知识点,加油!!!,在看文章的同时,希望不要直接看答案,先思考一下自己会不会,如果会,自己的答案是什么?想过之后再与答案比对,是不是会更好一点,当然如果你有比我更好的答案,欢迎评论区留言,一起探讨技术之美。 面试官:页面导入样式时,使用 link 和 …

    2025年12月24日 好文分享
    200
  • 看看这些前端面试题,带你搞定高频知识点(三)

    每天10道题,100天后,搞定所有前端面试的高频知识点,加油!!!,在看文章的同时,希望不要直接看答案,先思考一下自己会不会,如果会,自己的答案是什么?想过之后再与答案比对,是不是会更好一点,当然如果你有比我更好的答案,欢迎评论区留言,一起探讨技术之美。 面试官:清除浮动有哪些方式? 我:呃~,浮动…

    2025年12月24日 好文分享
    000
  • 看看这些前端面试题,带你搞定高频知识点(四)

    每天10道题,100天后,搞定所有前端面试的高频知识点,加油!!!,在看文章的同时,希望不要直接看答案,先思考一下自己会不会,如果会,自己的答案是什么?想过之后再与答案比对,是不是会更好一点,当然如果你有比我更好的答案,欢迎评论区留言,一起探讨技术之美。 面试官:请你谈一下自适应(适配)的方案 我:…

    2025年12月24日 好文分享
    000
  • 看看这些前端面试题,带你搞定高频知识点(五)

    每天10道题,100天后,搞定所有前端面试的高频知识点,加油!!!,在看文章的同时,希望不要直接看答案,先思考一下自己会不会,如果会,自己的答案是什么?想过之后再与答案比对,是不是会更好一点,当然如果你有比我更好的答案,欢迎评论区留言,一起探讨技术之美。 面试官:css 如何实现左侧固定 300px…

    2025年12月24日 好文分享
    000
  • HTML+CSS+JS实现雪花飘扬(代码分享)

    使用html+css+js如何实现下雪特效?下面本篇文章给大家分享一个html+css+js实现雪花飘扬的示例,希望对大家有所帮助。 很多南方的小伙伴可能没怎么见过或者从来没见过下雪,今天我给大家带来一个小Demo,模拟了下雪场景,首先让我们看一下运行效果 可以点击看看在线运行:http://hai…

    2025年12月24日 好文分享
    500
  • 分享20个首页流行布局样式,总有一款适合你!

    本篇文章给大家分享20个首页流行布局样式,总有一款适合你,快来收藏试试吧,希望对大家有所帮助! 有时我们会在网站上遇到一些内容布局问题,如文字对齐、图片设计与内容和谐、为文章选择合适的字体……在今天的文章中,介绍一些设计精美的创意布局,let‘s  开始。 代号 001 源码…

    2025年12月24日 好文分享
    000

发表回复

登录后才能评论
关注微信