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

浙公网安备 33010602011771号