SPLIT_TEXT_RECURSIVE_CHARACTER (SNOWFLAKE.CORTEX)¶
SPLIT_TEXT_RECURSIVE_CHARACTER 函数递归地将字符串拆分为较短的字符串,以便预处理文本,以与文本嵌入或搜索索引函数一起使用。该函数返回一个文本块数组,其中块是根据提供的输入参数从原始文本派生。
拆分算法尝试按照分隔符的提供顺序在分隔符上拆分文本,要么默认根据格式隐式拆分,要么以 separators
实参显式分割。然后,以递归方式对长度超过指定 chunk_size
的每个块应用拆分,直到所有块都不超过指定 chunk_size
为止。
例如,如果格式设置为 'none'
,则算法首先按大多数格式中表示分段符的“\n\n”序列进行拆分。在任何仍长于 chunk_size
字符的结果块中,函数会按表示换行符的“\n”字符进行拆分。重复此过程,直到每个块的字符数都少于 chunk_size
。
语法¶
SNOWFLAKE.CORTEX.SPLIT_TEXT_RECURSIVE_CHARACTER (
'<text_to_split>',
'<format>',
<chunk_size>,
[ <overlap> ],
[ <separators> ]
)
实参¶
必填:
'text_to_split'
要拆分的文本。
'format'
输入文本的格式,决定拆分算法中的默认分隔符。必须是以下其中一项:
none
:没有格式特定的分隔符。只有separators
字段中的分隔符用于拆分。markdown
:除分隔符字段中的任何分隔符外,对标题、代码块和表进行分隔。
chunk_size
一个整数,指定每个块中的最大字符数。该值必须大于零。
可选:
overlap
一个整数,指定连续块之间要重叠的字符数。默认情况下,块没有重叠。如果已指定
overlap
,则它必须小于chunk_size
实参。重叠对于确保每个块都有与前一个块有关的一些上下文很有用。这有助于提高搜索结果或其他处理的质量。
separators
一个有序的字符序列列表,除
format
参数规定的任何分隔符外,在确定文本拆分位置时用作边界。此列表中的最后一项应该是通用分隔符,例如空字符串(允许在任意两个字符之间进行拆分),这样算法才能保证将文本拆分成所需大小的块。默认:["\n\n", "\n", " ", ""],表示任意两个字符(空字符串)之间的分段符、分行符和空格。
返回¶
返回一个字符串数组,包含从输入字符串中提取的文本块。
已知限制¶
在此预览中,错误消息可能很隐秘。大多数错误消息与实参验证失败有关。作为调试的第一步,确保所有实参都有有效值。
示例¶
简单用法¶
以下示例使用输入文本 hello world are you here
直接调用 SPLIT_TEXT_RECURSIVE_CHARACTER 函数。该函数将文本拆分为 15 个字符的块,块之间有 10 个字符的重叠。
SELECT SNOWFLAKE.CORTEX.SPLIT_TEXT_RECURSIVE_CHARACTER (
'hello world are you here',
'none',
15,
10
);
['hello world are', 'world are you', 'are you here']
使用 Markdown 格式化并将块数组展平成行的示例¶
以下示例创建表 sample_documents
,每行都包含简短的 Markdown 文档,然后调用 SPLIT_TEXT_RECURSIVE_CHARACTER 函数拆分每个文档。该函数将文本拆分为 25 个字符的块,块之间有 10 个字符的重叠。
-- Create sample markdown data table
CREATE OR REPLACE TABLE sample_documents (
doc_id INT AUTOINCREMENT, -- Monotonically increasing integer
document STRING
);
-- Insert sample data
INSERT INTO sample_documents (document)
VALUES
('### Heading 1\\nThis is a sample markdown document. It contains a list:\\n- Item 1\\n- Item 2\\n- Item 3\\n'),
('## Subheading\\nThis markdown contains a link [example](http://example.com) and some \**bold*\* text.'),
('### Heading 2\\nHere is a code snippet:\\n```\\ncode_block_here()\\n```\\nAnd some more regular text.'),
('## Another Subheading\\nMarkdown example with \_italic\_ text and a [second link](http://example.com).'),
('### Heading 3\\nText with an ordered list:\\n1. First item\\n2. Second item\\n3. Third item\\nMore text follows here.');
-- split text
SELECT
doc_id,
c.value
FROM
sample_documents,
LATERAL FLATTEN( input => SNOWFLAKE.CORTEX.SPLIT_TEXT_RECURSIVE_CHARACTER (
document,
'markdown',
25,
10
)) c;