2014-10-29 113 views
1

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

例如:

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的话,这个词“测试”将有一个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 

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

+0

请参阅下面的回答,请分享成果! – 2014-10-29 22:30:23

回答

3

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

的替代方案,你可以尝试使用REGEXP_REPLACE用空格或任何一个分隔符来替换所有您想要的分隔符,就像这样:

SPLIT(REGEXP_REPLACE(message, ",|;|:|\\.|\\?|!|\t|\n", " "), " ") 
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/

相关问题