鱼C论坛

 找回密码
 立即注册
查看: 1502|回复: 2

[已解决]怎么从文本中循环截取 不超过1800字符的完整句子(以. ? ! 。定界)?

[复制链接]
发表于 2023-2-27 14:41:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 blackantt 于 2023-2-27 16:13 编辑

怎么从文本中循环截取 不超过1800字符的完整句子(以. ? ! 。定界)?
比如文本是
字符1 字符2 字符3 *** 字符1780. 字符1781 ***字符1800***字符1805***字符3570.***字符3581。


取出
“字符1 字符2 字符3 *** 字符1780.”                                                 #  1800之前最后一个.是1780.
“字符1781 ***字符1800***字符1805***字符3570.”                          #从 字符1781往后数1800个字符,应该是3581,3581之前的最后一个.是在 字符3570.处
“***字符3581。”


取出在给定数值之前的最后一个定界符(以. ? ! 。定界)之前的文本.


实际需求就是:  要把大段文本分成  翻译软件最大吃进的句子, 以免从句子中间断开

这种是啥算法?
---------------------------------- 下面已经找到 第一段 符合要求的 句子,怎么移动起点到第一段 符合要求的 句子后面,开始下一个循环呢?
import re

len_fix = 150

 
def seg_tail_split(str1,sep=r"\.|。"): # 分隔符可为多样的正则表达式
    # 保留分割符号,置于句尾,比如标点符号
    wlist = re.split(sep,str1)
    seg_word = re.findall(sep,str1)
    seg_word.extend(" ") # 末尾插入一个空字符串,以保持长度和切割成分相同
    wlist = [ x+y for x,y in zip(wlist,seg_word) ] # 顺序可根据需求调换
    return wlist
 

 

inputstr = "王后听了大吃一惊,因为她知道这面镜子是从不说假话的,一定是那仆人蒙骗了她,她决不能容忍有任何比她更漂亮的人活在这个世上。所以,她把自己装扮成一个卖杂货的老太婆,翻山越岭来到了那七个小矮人的住处。她敲着门喊道:“卖杂货,多好的杂货呀!”白雪公主从窗户往外看去,说道:“老人家,你好!你卖的是什么啊?”她回答道:“好东西,好漂亮的东西,有各种颜色的带子和线筒。”白雪公主暗想:“这老太婆,好像并不是那种坏人,就让她进来吧。”想到这里,她跑过去打开门。老太婆进来后说道:“哎呀!看你的胸带多差呀,来吧,让我给你系上一根漂亮的新带子。”白雪公主做梦也没想到这会有危险,所以她走上前去站在了老太婆的面前。老太婆很熟练地将带子给她系在胸前,系着系着,突然,她猛地用力将带子拉紧,白雪公主便被勒得透不过气来,很快失去知觉倒在了地上,就像死去了一样。看到她的样子,恶毒的王后说道:“这下你的美丽该结束了吧!”说完放心地走了。"
res = seg_tail_split(inputstr)
print( res )


sen = globals()

sen[0] = ''
for i in range(len(res)):#通过下标
    print(i)
    sen[i+1] = sen[i] + res[i]
    
    print(sen[i+1])
    if len(sen[i+1]) > len_fix:
        print('小于定长的最长句子','\n', sen[i])
        break
最佳答案
2023-2-28 09:50:48
一点可能不算太好的设计
import re

len_fix = 15

 
def seg_tail_split(str1: str,sep: str=r"\.|。") -> list[str]: # 分隔符可为多样的正则表达式
    # 保留分割符号,置于句尾,比如标点符号
    wlist = re.split(sep,str1)
    seg_word = re.findall(sep,str1)
    # 之前这里插入的不是空字符串而是只有一个空格的字符串,已修改
    seg_word.append("") # 末尾插入一个空字符串,以保持长度和切割成分相同
    wlist = [ x+y for x,y in zip(wlist,seg_word) ] # 顺序可根据需求调换
    return wlist
 

 

inputstr = "王后听了大吃一惊,因为她知道这面镜子是从不说假话的,一定是那仆人蒙骗了她,她决不能容忍有任何比她更漂亮的人活在这个世上。所以,她把自己装扮成一个卖杂货的老太婆,翻山越岭来到了那七个小矮人的住处。她敲着门喊道:“卖杂货,多好的杂货呀!”白雪公主从窗户往外看去,说道:“老人家,你好!你卖的是什么啊?”她回答道:“好东西,好漂亮的东西,有各种颜色的带子和线筒。”白雪公主暗想:“这老太婆,好像并不是那种坏人,就让她进来吧。”想到这里,她跑过去打开门。老太婆进来后说道:“哎呀!看你的胸带多差呀,来吧,让我给你系上一根漂亮的新带子。”白雪公主做梦也没想到这会有危险,所以她走上前去站在了老太婆的面前。老太婆很熟练地将带子给她系在胸前,系着系着,突然,她猛地用力将带子拉紧,白雪公主便被勒得透不过气来,很快失去知觉倒在了地上,就像死去了一样。看到她的样子,恶毒的王后说道:“这下你的美丽该结束了吧!”说完放心地走了。"
res = seg_tail_split(inputstr)
print( res )

buffer = res.pop(0)
for item in res:
    if len(item) == 0:  # 空字符串作为结束标识
        print(f'len={len(buffer)}', buffer)
    else:
        if len(buffer + item) > len_fix:
            print(f'len={len(buffer)}', buffer)
            buffer = item
        else:
            buffer += item
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-2-28 09:50:48 | 显示全部楼层    本楼为最佳答案   
一点可能不算太好的设计
import re

len_fix = 15

 
def seg_tail_split(str1: str,sep: str=r"\.|。") -> list[str]: # 分隔符可为多样的正则表达式
    # 保留分割符号,置于句尾,比如标点符号
    wlist = re.split(sep,str1)
    seg_word = re.findall(sep,str1)
    # 之前这里插入的不是空字符串而是只有一个空格的字符串,已修改
    seg_word.append("") # 末尾插入一个空字符串,以保持长度和切割成分相同
    wlist = [ x+y for x,y in zip(wlist,seg_word) ] # 顺序可根据需求调换
    return wlist
 

 

inputstr = "王后听了大吃一惊,因为她知道这面镜子是从不说假话的,一定是那仆人蒙骗了她,她决不能容忍有任何比她更漂亮的人活在这个世上。所以,她把自己装扮成一个卖杂货的老太婆,翻山越岭来到了那七个小矮人的住处。她敲着门喊道:“卖杂货,多好的杂货呀!”白雪公主从窗户往外看去,说道:“老人家,你好!你卖的是什么啊?”她回答道:“好东西,好漂亮的东西,有各种颜色的带子和线筒。”白雪公主暗想:“这老太婆,好像并不是那种坏人,就让她进来吧。”想到这里,她跑过去打开门。老太婆进来后说道:“哎呀!看你的胸带多差呀,来吧,让我给你系上一根漂亮的新带子。”白雪公主做梦也没想到这会有危险,所以她走上前去站在了老太婆的面前。老太婆很熟练地将带子给她系在胸前,系着系着,突然,她猛地用力将带子拉紧,白雪公主便被勒得透不过气来,很快失去知觉倒在了地上,就像死去了一样。看到她的样子,恶毒的王后说道:“这下你的美丽该结束了吧!”说完放心地走了。"
res = seg_tail_split(inputstr)
print( res )

buffer = res.pop(0)
for item in res:
    if len(item) == 0:  # 空字符串作为结束标识
        print(f'len={len(buffer)}', buffer)
    else:
        if len(buffer + item) > len_fix:
            print(f'len={len(buffer)}', buffer)
            buffer = item
        else:
            buffer += item
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-28 16:14:07 | 显示全部楼层
dolly_yos2 发表于 2023-2-28 09:50
一点可能不算太好的设计

感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-24 11:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表