我想使用SPLIT函数对各种文本条目进行单词分析,在本例中是git-commit注释。通常,一个单词由空格分隔,但我也希望在分隔符列表中包括逗号、分号、冒号、句点、问号、感叹号、制表符和新行。本质上使用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
如果您有建议避免提取非单词字符的额外步骤,我将不胜感激。
您可以尝试的另一种选择是使用REGEXP_REPLACE将所有所需的分隔符替换为空格或任何单个分隔符,如下所示:
SPLIT(REGEXP_REPLACE(message, ",|;|:|\.|\?|!|t|n", " "), " ")
更新:请参阅上的完整文章http://www.reddit.com/r/bigquery/comments/2kqe4g/words_that_these_developers_say_that_others_dont/
@socket说:先使用REGEX_RELACE,然后使用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/