SPLIT 可以与多个分隔符一起使用吗?

Ste*_*rer 3 google-bigquery

我想使用 SPLIT 函数对各种文本条目进行单词分析,在本例中是 git commit 注释。通常,单词由空格分隔,但我还想在分隔符列表中包含逗号、分号、冒号、句点、问号、感叹号、制表符、新行。本质上使用 REGEX 模式来指定分隔符,如果找到其中任何一个,则将其视为分隔符。

例如:

SELECT 
    split(commit_message, " ") as words,
FROM [project:dataset.table] 
LIMIT 1000
Run Code Online (Sandbox Code Playgroud)

如果输入数据类似于:

"Commit message XYX:  Hello.  This is a test.  This is a fun test!  First, we'll run a test, then we'll check the results.  A test is currently running."
Run Code Online (Sandbox Code Playgroud)

我希望如果我们对单词进行 GROUP BY 操作,单词“test”的计数将为 4,但使用上面的查询 test 只会计数一次。如果分隔符字段接受类似于下面的 REGEXP,那就太好了,但我认为这是不可用的,或者语法尚未发布。

SELECT 
    split(commit_message, "[\W]+") as words,
FROM [project:dataset.table] 
LIMIT 1000
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,如果检测到一个或多个非单词字符,这些字符都将被视为分隔符。如果这个功能不存在,是否可以考虑在未来进行改进?此时,我需要获取“单词”列中的结果并删除所有非单词字符以获得我想要的结果。(见下文)

SELECT
    LOWER(REGEXP_EXTRACT(words, r'(\w+)')) as words
FROM
    (
    SELECT 
        split(commit_message, " ") as words,
    FROM [project:dataset.table] 
    )
LIMIT 1000
Run Code Online (Sandbox Code Playgroud)

如果您有建议来避免提取非单词字符的这一额外步骤,我将不胜感激。

spr*_*ket 6

SPLIT 函数仅接受常量字符串作为分隔符。正则表达式分隔符没有隐藏语法。

您可以尝试的另一种方法是使用 REGEXP_REPLACE 将所有所需的分隔符替换为空格或任何单个分隔符,如下所示:

SPLIT(REGEXP_REPLACE(message, ",|;|:|\\.|\\?|!|\t|\n", " "), " ")
Run Code Online (Sandbox Code Playgroud)