在BigQuery中,如何对Stackoverflow标签进行聚类?

问题描述 投票:0回答:1

我正在尝试对 BigQuery 公共数据集中的 Stackoverflow 标签进行聚类。 据我的一位数据专家同事说,标准程序是将每个标签链接到“最近”的标签。 为此,我计划搜索摘录中的相关标签并生成一个包含以下列的表格

例如,考虑以下标签信息

id 标签名称 摘录 描述
3 61060 打开包装 OpenWrap 是 .net 平台的依赖管理器

OpenWrap 是 .net 平台的依赖管理器。可以在 http://openwrap.org 找到。

我想生成一个表格,例如

id 标签名称 .net 依赖管理器 java 春天
61060 打开包装 1 1 0 0

这将允许我运行 k 均值计算。

为此,我想使用 SQL PIVOT,但我不明白如何操作。

到目前为止, 我的 SQL 查询看起来像

DECLARE tag_names ARRAY <STRING> ;
SET tag_names = ARRAY ( 
    SELECT tags.tag_name 
    FROM ${ref("stackoverflow_tags_with_non_null_excerpt")} AS tags
);

SELECT *
FROM ${ref("stackoverflow_tags_with_non_null_excerpt")} AS tags
PIVOT(
-- I don't know what I'm doing
)

我从来没有写过任何 PIVOT,所以我应该考虑什么,我想运行“为我摘录中的每个标签返回 1,否则返回 0”之类的东西,这应该用

excerpt like "%s{tag}%s" for tag in UNNEST(tag_names)

来实现

我离好的答案还远吗?

sql google-bigquery pivot sql-like dataform
1个回答
0
投票

创建一个数组

tag_names
,其中包含数据集中的所有标签名称。然后,在原始表和未嵌套的 tag_names 数组之间执行
CROSS JOIN
。此组合将每个标签与数组中的每个标签名称配对。

在 SELECT 子句中,它使用 MAX 聚合函数中的 CASE 语句来确定 tag_name 是否出现在摘录中。如果是,则将 is_related 设置为 1;否则,将其设置为 0。

最后,它按 id 和 tag_name 对结果进行分组以获得所需的格式。

此查询将为您提供一个表,其中每行代表一个标签,列代表该标签是否根据摘录中标签名称的存在与其他每个标签相关。如果相关,is_lated 列将为 1,如果不相关,则为 0。您可以使用此表进行聚类或需要执行的任何其他分析。

这个示例查询可能会给您一个提示:

DECLARE tag_names ARRAY<STRING>;
SET tag_names = ARRAY(
    SELECT tag_name
    FROM ${ref("stackoverflow_tags_with_non_null_excerpt")}
);

-- Use a CROSS JOIN to pair each tag with each tag name in the array
SELECT
    t.id AS id,
    t.tag_name AS tag_name,
    MAX(CASE WHEN t.excerpt LIKE CONCAT('%', tn, '%') THEN 1 ELSE 0 END) AS is_related
FROM
    ${ref("stackoverflow_tags_with_non_null_excerpt")} AS t
CROSS JOIN
    UNNEST(tag_names) AS tn
GROUP BY
    t.id,
    t.tag_name;
© www.soinside.com 2019 - 2024. All rights reserved.