0

我们在我们的网站上跟踪用户代理字符串。我想对它们做一些统计,看看我们有多少 IE6 用户(所以我们知道我们必须针对什么进行开发),以及我们有多少移动用户。

所以我们有这样的日志条目:

Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; FunWebProducts)
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; FunWebProducts; .NET CLR 1.0.3705; .NET CLR 1.1.4322; Media Center PC 4.0; .NET CLR 2.0.50727)

理想情况下,看到所有“有意义的”字符串会非常整洁,这意味着可能字符串长度可能超过一定长度。例如,我可能想查看其中有多少条目FunWebProducts,或.NET CLR,或.NET CLR 1.0.3705-- 但我不想查看有多少条目带有分号。所以我不一定要寻找唯一的字符串,而是所有的字符串,甚至是子集。所以,我想看看 all 的计数Mozilla,知道这包括Mozilla/5.0and的计数Mozilla/4.0。如果有一个嵌套显示,从最短的字符串开始,然后向下工作,那就太好了。也许像

4,2093 Mozilla
 1,093 Mozilla/5.0
    468 Mozilla/5.0 (Windows;
     47 Mozilla/5.0 (Windows; U 
 2,398 Mozilla/4.0

这听起来像是计算机科学作业。这会叫什么?是否存在类似的东西,还是我自己写?

4

3 回答 3

1

您正在查看最长的公共子字符串问题,或者,给定上面的具体示例,最长的公共前缀问题,可以使用trie来解决。

但是,从上面的示例来看,您可能甚至不需要对此保持高效。相反,简单地说:

  1. 在某些标点符号子集上标记字符串,例如[ ;/]

  2. 保存多个标记的每个唯一前缀,替换原始分隔符

  3. 对于每个前缀,计算它匹配的记录并保存

于 2012-09-28T01:50:36.257 回答
0

如果将其分解为主要名称(开头括号之前的部分),然后将每个部分以分号分隔存储为子记录,您可以进行任何您想要的分析。例如,将其存储在关系数据库中:

BrowserID   BrowserText
---------   -----------
1           Mozilla/4.0
2           Mozilla/5.0

FeatureID   FeatureText
---------   -----------
1           compatible
2           MSIE 7.0
3           Windows NT 5.1
4           FunWebProducts
5           .NET CLR 1.0.3705
6           .NET CLR 1.1.4322
7           Media Center PC 4.0
8           .NET CLR 2.0.50727

然后记录对浏览器和部件的引用,您可以进行任何类型的分析。

于 2009-12-22T18:39:29.800 回答
0

使用正则表达式将用户代理字符串解析为其相关组件部分怎么样?用户代理字符串的基本规范是“ [name]/ [version]”或“ [name] [version]”。有了这些信息,我们可以使用正则表达式([^\(\)\/\\;\n]+)([ ]((?=\d*\.+\d*|\d*_+\d*)[\d\.Xx_]+)|[/]([^\(\)\/; \n]+))来获取匹配集,其中集合中的第一个匹配是 the [name],第二个匹配是[version]. 当然,您必须/从集合中的第二个匹配项中删除空格,或者修改正则表达式以使用后向查找(几种正则表达式不支持,所以我没有在此处包含它)。

获得所有这些元组后,您可以随心所欲地操作和计数它们。

于 2014-09-08T16:14:15.977 回答