TxT2Docx/text_splitter.py
2025-09-26 15:49:06 +08:00

140 lines
7.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import re
class TextSplitter:
def __init__(self, min_length=100, max_length=300):
"""
初始化文本分段器
:param min_length: 目标段落最小长度
:param max_length: 目标段落最大长度
"""
self.min_length = min_length
self.max_length = max_length
# 匹配标点符号的正则表达式,作为分段点(中文和英文标点)
# 这些标点符号通常表示一个完整句子的结束
self.sentence_ending_punct = re.compile(r'([。?!.!?])')
def split_text(self, text):
"""
将文本分割成符合长度要求的段落,仅使用标点符号分割
:param text: 待分割的原始文本
:return: 分割后的段落列表
"""
if not text:
return []
# 自动判断原始文本长度
original_length = len(text)
print(f"原始文本长度: {original_length} 字符")
# 如果原始文本长度小于最小长度,直接返回
if original_length <= self.min_length:
return [text.strip()]
# 将文本分割成完整句子(保留标点符号)
parts = self.sentence_ending_punct.split(text)
sentences = []
# 重组句子,确保标点符号与前面的文本在一起
for i in range(0, len(parts)-1, 2):
sentence = (parts[i] + parts[i+1]).strip()
if sentence: # 跳过空句子
sentences.append(sentence)
# 如果没有找到任何标点符号,将整个文本作为一个段落
if not sentences:
return [text.strip()]
# 合并句子形成段落,确保在长度范围内
paragraphs = []
current_paragraph = ""
for sentence in sentences:
# 尝试添加当前句子
temp = current_paragraph + (" " if current_paragraph else "") + sentence
# 检查添加后是否超出最大长度
if len(temp) > self.max_length:
# 如果当前段落不为空,先保存当前段落
if current_paragraph:
paragraphs.append(current_paragraph)
current_paragraph = sentence
else:
# 如果单个句子就超过最大长度,也必须接受(避免分割句子)
paragraphs.append(sentence)
current_paragraph = ""
else:
current_paragraph = temp
# 添加最后一个段落
if current_paragraph:
paragraphs.append(current_paragraph)
# 检查是否有段落短于最小长度,如果有则与下一段合并
i = 0
while i < len(paragraphs) - 1:
if len(paragraphs[i]) < self.min_length:
# 合并当前段落和下一段落
paragraphs[i] = paragraphs[i] + " " + paragraphs[i+1]
del paragraphs[i+1]
else:
i += 1
print(f"分割后段落数量: {len(paragraphs)}")
return paragraphs
# 使用示例
if __name__ == "__main__":
# 示例文本
sample_text = """
最近,晓蕾又上热搜了!
咋回事呢?原来,她和老公刘剑一起开了直播带货的副业。但特意声明:她早就离开了上海电视台的编制,也不拿电视台的工资。换句话说,现在卖东西,完全是私营业态。
这事儿一下子引爆了大家的八卦魂。毕竟,明星主持扎堆直播间,也不算新鲜事。但还是挺多人纳闷:这些当年的 "话筒头牌",是不是集体选择摆烂了?
其实,晓蕾和刘剑干脆落落大方,在直播间直接回应了这点。俩人意思很明确:“我们不是来拉低职业口碑的”。而且还耐心解释了自己转行的理由。
曾经的大佬,变成了烟火气
说到晓蕾,不了解点她背景都不好意思讨论人家。当年上视新闻部的 "当家花旦",光学历和气质,足够秒杀隔壁主持圈的八条街。而刘剑,早年可是 "台柱子",播音腔精致到令人耳膜怀孕。照理来说,这样一对,在编制铁饭碗里躺平一辈子没毛病。
可人家偏不。
晓蕾说过这样一句话:“其实,我就是个普通人。” 真的那么普通吗?她不这么说,没人敢忘了她的标杆履历啊!她离开台里后,居然一头扎进了童语言教育这个赛道,一干就是十年,让机构做到了业内小圈子的爆款水准。
而这次直播,打的商品也不混乱,主打性价比和实用属性,晓蕾每件商品还得亲测过。如果你觉得她自吹自擂,建议去看看她直播间的粉丝评论。大家的意思是:晓蕾推品 = 放心买。
刘剑这枚 “前一哥”,更狠!
说晓蕾牛,别忘了,刘剑十年前也上演了一场 “豪赌”。那个年代,辞去电视台稳定工作,和 “打水漂” 差不多。
可是刘剑敢把梭全下,为啥?因为他看中了播音考生和辅导课程的市场,那时还没有多少人扎堆干这块,他觉得这是个机会。
果然,就这么辞了职,工作的腰板从跟组织吃工资,摇身变成了名副其实的事业单位 —— 自己家老板。虽然后来也是磕磕绊绊,但终究从试验田里掘出了一片肥沃地。
主持人的 “下海”,是换方向走
有人觉得,曾经的新闻人、主持人 “跑去带货”,肯定是混不下去了。你要放在十年前,这种联想不稀奇,可现在不一样了。大环境变了,传统媒体是真的在互联网时代被打败得找不到调。
原来电视频道的观众,现在早转移到手机端,看知乎、刷短视频,甚至晚上蹲个带货直播会。你说新闻节目的高冷主播,现在换脸做带货主持,是不是 “落魄”?未必。
晓蕾夫妻这一波,实际上是转型很成功的范例。不管带啥网红货,他们俩把品质第一的逻辑摆明白了。这样的主播,不止卖产品,更卖信誉,靠着时间积攒了观众的信任。
直播间哪门子 LOW明明是主战场
网友说得有趣:“谁嫌直播带货 LOW谁就输定了。” 道理没跑儿,移动互联网成了咱生活重心,生意也跟着迁移。这是明显趋势,看不懂的还真不想赚钱了。
而且,做直播一点不轻松。站几个小时口播、随时照顾弹幕情绪,这比坐着念提词器辛苦多了。像晓蕾和刘剑这样的 “摸鱼资历”,能转过身来赚饭钱,这不是 “混”,是 “拼” 啊。
别说传统意义的职业崇拜消失殆尽,你觉得稳如狗的岗位,说散架就散。老一辈金饭碗情结,对于下一代新创别说香,而是种被淘汰跑赢速度内心创新积极点。
我不是电视台员工了,早就离职 10 年了。"""
# 创建分段器实例,设置目标段落长度范围
splitter = TextSplitter(min_length=10, max_length=20)
# 分割文本
paragraphs = splitter.split_text(sample_text)
# 打印结果
print("\n分割结果:")
for i, para in enumerate(paragraphs, 1):
print(para)