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

时间:2014-10-29 17:43:56

标签: google-bigquery

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

例如:

SELECT 
    split(commit_message, " ") as words,
FROM [project:dataset.table] 
LIMIT 1000

如果输入数据类似于:

"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."

我希望如果我们做一个GROUP BY单词,“test”这个单词的COUNT为4,但使用上面的查询只会计算一次。如果分隔符字段接受类似于下面的REGEXP会很好,但我认为这不可用,或者语法没有发布。

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

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

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

如果你有建议避免这个提取非单词字符的额外步骤,我感激不尽。

2 个答案:

答案 0 :(得分:3)

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

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

SPLIT(REGEXP_REPLACE(message, ",|;|:|\\.|\\?|!|\t|\n", " "), " ")

答案 1 :(得分:1)

更新:请参阅 http://www.reddit.com/r/bigquery/comments/2kqe4g/words_that_these_developers_say_that_others_dont/

上的完整文章

@sprocket说:首先使用REGEX_REPLACE,然后使用SPLIT()。

请参阅http://www.reddit.com/r/bigquery/comments/2ep8np/mining_the_top_news_words_for_each_day_with_gdelt进行类似分析。

一个有效的查询,Python开发人员说JavaScript开发人员没有说:

SELECT word, c 
FROM (
  SELECT word, COUNT(*) c
  FROM (
    SELECT SPLIT(msg, ' ') word
    FROM (
      SELECT REGEXP_REPLACE(LOWER(payload_commit_msg), r'[^a-z]', ' ') msg
      FROM [githubarchive:github.timeline]
      WHERE
        repository_language == 'Python'
        AND payload_commit_msg != ''
      GROUP EACH BY msg
    )
  )
  GROUP BY word
  ORDER BY c DESC
  LIMIT 500
)
WHERE word NOT IN (
  SELECT x FROM (SELECT word x, COUNT(*) c
  FROM (
    SELECT SPLIT(msg, ' ') word
    FROM (
      SELECT REGEXP_REPLACE(LOWER(payload_commit_msg), r'[^a-z]', ' ') msg
      FROM [githubarchive:github.timeline]
      WHERE
        repository_language == 'JavaScript'
        AND payload_commit_msg != ''
      GROUP EACH BY msg
    )
  )
  GROUP BY x
  ORDER BY c DESC
  LIMIT 1000)
);

请参阅 http://www.reddit.com/r/bigquery/comments/2kqe4g/words_that_these_developers_say_that_others_dont/

的完整文章