1

在分析了许多 URL 后,我试图识别新模式。因此,假设我正在调查假设的网站 Yoohle.com,它们的 URL 具有以下结构。

  • 域 = yoohle.com
  • q= 搜索词组
  • lan= 使用的语言
  • 公关=合作伙伴ID
  • br = browser_id

所以一个示例网址看起来像这样

www.yoohle.com/test_folder/test_page?q=hello+world&lan=en&pr=stackoverflow&br=chrome

如果我正在调查该网站的网络流量并看到逐月异常增加,我想找出造成这种情况的原因。在这个例子中,我可以只解析 URL 并查看 pr= 值,因为它会告诉我是否有新的合作伙伴关系(也许 stackoverflow 将由 yoohle.com 提供支持并推动增长等)

问题是,我如何构建可以比较 2 个月(或更多)个月并准确告诉我推动增长的因素。我想得到类似的东西,“我们看到了增长,它是由以下模式驱动的”

www.yoohle.com/test_folder/test_page%pr=stackoverflow%

棘手的部分是,与此示例不同,您对令牌的含义一无所知,因为我不知道什么令牌代表 partner_id。另一个问题是,如果我们逐个标记,这将产生误导,因为假设用户仍将使用英语作为语言,lan=en 也会与新的合作伙伴一起使用。

我的想法是通过查看所有组合来分析令牌,但这非常昂贵(在这个例子中是 4!,对于其他网站可能是 10+!)。同样分析令牌本身也不能解决问题,因为我仍然需要分析令牌的值。

我尝试了 k-means 聚类,先验算法对 URL/文本挖掘做了一些研究,但无法得到我想要的。任何关于如何构建算法的想法都是有益的。

想象一下,您正在查看实时数据,因此我们正在讨论在给定月份分析大约 10 万个 URL。

4

1 回答 1

0

我会走下面的路。您可以创建下表:

URL
time
time_month -- time rounded to month, for demonstration purpose
q_bol   -- boolean flag whether question parameter was used
q       -- question parameter value
lan     -- language parameter value
lan_bol -- boolean flag whether language parameter was used
pr      -- partner parameter value
pr_bol  -- boolean flag whether partner parameter was used
br      -- browser parameter value
br_bol  -- boolean flag whether browse parameter was used

现在,您可以编写一些查询。

with t as (
select 
  time_month,
  q_bol, lan_bol, pr_bol, br_bol, count(*)
from
  urldata
where
  time_month > '2013-02-01'::date and time_month < '2013-04-01'::date -- last two months data
group by 
  time_month
)

, u as (
select
*,
t2-coalesce(t1,0) as abs_change, -- change in pattern MoM,
case when t1 is null then 0 else t2/t1 end as relchange  -- relative change
from
t t1 full outer join t t2 using (q_bol, lan_bol, pr_bol, br_bol)
) 

select * from u where abs_change > 5000 or relchange > 3

上面的查询为您提供了每月变化超过 5000 次或每月增加超过 300% 的参数模式。如果您可以group by rollup在您的 sql 系统中使用它,它还会提供更高级别的聚合(三个参数、两个参数、一个参数的组合)。

你可以对参数值做同样的事情。因为您不知道值将出现哪些标记,所以您可以在以下表结构中解析 url:

-- urls
id_url
url
time

-- parameters
id_url
token
value

然后你需要以某种方式重写上面的查询,例如你可以在 PostgreSQL 中使用数组聚合函数array_agg()

于 2013-04-12T13:47:23.813 回答