|
|
|
|
|
|
|
|
|
import re |
|
from typing import Callable |
|
|
|
|
|
|
|
|
|
METHODS = dict() |
|
|
|
def get_method(name:str)->Callable: |
|
method = METHODS.get(name, None) |
|
if method is None: |
|
raise ValueError(f"Method {name} not found") |
|
return method |
|
|
|
def register_method(name): |
|
def decorator(func): |
|
METHODS[name] = func |
|
return func |
|
return decorator |
|
|
|
splits = {",", "。", "?", "!", ",", ".", "?", "!", "~", ":", ":", "—", "…", } |
|
|
|
def split_big_text(text, max_len=510): |
|
|
|
punctuation = "".join(splits) |
|
|
|
|
|
segments = re.split('([' + punctuation + '])', text) |
|
|
|
|
|
result = [] |
|
current_segment = '' |
|
|
|
for segment in segments: |
|
|
|
if len(current_segment + segment) > max_len: |
|
result.append(current_segment) |
|
current_segment = segment |
|
else: |
|
current_segment += segment |
|
|
|
|
|
if current_segment: |
|
result.append(current_segment) |
|
|
|
return result |
|
|
|
|
|
|
|
def split(todo_text): |
|
todo_text = todo_text.replace("……", "。").replace("——", ",") |
|
if todo_text[-1] not in splits: |
|
todo_text += "。" |
|
i_split_head = i_split_tail = 0 |
|
len_text = len(todo_text) |
|
todo_texts = [] |
|
while 1: |
|
if i_split_head >= len_text: |
|
break |
|
if todo_text[i_split_head] in splits: |
|
i_split_head += 1 |
|
todo_texts.append(todo_text[i_split_tail:i_split_head]) |
|
i_split_tail = i_split_head |
|
else: |
|
i_split_head += 1 |
|
return todo_texts |
|
|
|
|
|
|
|
@register_method("cut0") |
|
def cut0(inp): |
|
return inp |
|
|
|
|
|
|
|
@register_method("cut1") |
|
def cut1(inp): |
|
inp = inp.strip("\n") |
|
inps = split(inp) |
|
split_idx = list(range(0, len(inps), 4)) |
|
split_idx[-1] = None |
|
if len(split_idx) > 1: |
|
opts = [] |
|
for idx in range(len(split_idx) - 1): |
|
opts.append("".join(inps[split_idx[idx]: split_idx[idx + 1]])) |
|
else: |
|
opts = [inp] |
|
return "\n".join(opts) |
|
|
|
|
|
@register_method("cut2") |
|
def cut2(inp): |
|
inp = inp.strip("\n") |
|
inps = split(inp) |
|
if len(inps) < 2: |
|
return inp |
|
opts = [] |
|
summ = 0 |
|
tmp_str = "" |
|
for i in range(len(inps)): |
|
summ += len(inps[i]) |
|
tmp_str += inps[i] |
|
if summ > 50: |
|
summ = 0 |
|
opts.append(tmp_str) |
|
tmp_str = "" |
|
if tmp_str != "": |
|
opts.append(tmp_str) |
|
|
|
if len(opts) > 1 and len(opts[-1]) < 50: |
|
opts[-2] = opts[-2] + opts[-1] |
|
opts = opts[:-1] |
|
return "\n".join(opts) |
|
|
|
|
|
@register_method("cut3") |
|
def cut3(inp): |
|
inp = inp.strip("\n") |
|
return "\n".join(["%s" % item for item in inp.strip("。").split("。")]) |
|
|
|
|
|
@register_method("cut4") |
|
def cut4(inp): |
|
inp = inp.strip("\n") |
|
return "\n".join(["%s" % item for item in inp.strip(".").split(".")]) |
|
|
|
|
|
|
|
@register_method("cut5") |
|
def cut5(inp): |
|
|
|
|
|
inp = inp.strip("\n") |
|
punds = r'[,.;?!、,。?!;:…]' |
|
items = re.split(f'({punds})', inp) |
|
mergeitems = ["".join(group) for group in zip(items[::2], items[1::2])] |
|
|
|
if len(items)%2 == 1: |
|
mergeitems.append(items[-1]) |
|
opt = "\n".join(mergeitems) |
|
return opt |
|
|
|
|
|
|
|
if __name__ == '__main__': |
|
method = get_method("cut5") |
|
print(method("你好,我是小明。你好,我是小红。你好,我是小刚。你好,我是小张。")) |
|
|