Title

文本智能切分:满足长度限制与自然断句

在最近的项目开发过程中,我频繁遇到一个需求:将用户输入的长文本智能切分成多个段落,每个段落的长度需控制在特定范围内,同时还要遵循自然语言的断句规则。把实现记录一下

复制import org.apache.commons.lang.StringUtils;
import java.util.*;
public class TextSpiltUtils{
    private static final int MAX_LENGTH = 670;
    private static final List<Character> PUNCTUATION_PATTERN = Arrays.asList('。', '!', '?', ';', ',', ',', '.', '!', '?', ';');
    public static List<String> splitText(String text) {
        List<String> segments = new ArrayList<>();
        int contentLength = text.length();
        int curIndex = 0;

        while (curIndex < contentLength) {
            // 计算当前分段的结束位置(不超过内容长度)
            int endIndex = Math.min(curIndex + MAX_LENGTH, contentLength);

            // 从后向前寻找最近的标点符号作为分割点,在到达切分文本开始仍未寻找到标点,直接硬切分
            for (int i = endIndex - 1; i >= curIndex; i--) {
                if (PUNCTUATION_PATTERN.contains(text.charAt(i))) {
                    endIndex = i + 1;  // 包含标点符号本身
                    break;
                }
            }
            // 截取分段并处理空内容
            String segment = text.substring(curIndex, endIndex).trim();
            if (!segment.isEmpty()) {
                segments.add(segment);
            }

            // 更新当前索引到下一个分段的起始位置
            curIndex = endIndex;
        }

        return segments;
    }
}
posted @   唔芜舞雾  阅读(5)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示