140 lines
7.2 KiB
Python
140 lines
7.2 KiB
Python
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)
|
||
|