自动标记用户代理字符串以进行统计?

时间:2009-12-22 18:24:01

标签: string substring user-agent tokenize text-processing

我们会在我们的网站上跟踪用户代理字符串。我想对它们做一些统计,看看我们有多少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 - 但我想要查看有多少人有分号。所以我不一定要寻找独特的字符串,而是所有的字符串,甚至是子集。所以,我希望看到所有Mozilla的计数,知道这包括Mozilla/5.0Mozilla/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

这听起来像是计算机科学的功课。这叫什么?这样的事情是存在的,还是我自己写的?

3 个答案:

答案 0 :(得分:1)

您正在查看longest common substring问题,或者,鉴于您上面的具体示例,问题是最长的常见前缀问题,可以使用trie来解决。

但是,从上面的例子开始,你可能甚至不需要对此有效。相反,只需:

  1. 对某些标点子集上的字符串进行标记,例如[ ;/]

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

  3. 对于每个前缀,获取与其匹配的记录的计数并保存

答案 1 :(得分: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

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

答案 2 :(得分:0)

使用正则表达式将用户代理字符串解析为其相关组件部分怎么样?用户代理字符串的基本规范是' [name] / [version]'或' [name] [version]'。根据该信息,我们可以使用([^\(\)\/\\;\n]+)([ ]((?=\d*\.+\d*|\d*_+\d*)[\d\.Xx_]+)|[/]([^\(\)\/; \n]+))这样的正则表达式来获取匹配集,其中集合中的第一个匹配项是[name],而集合中的第二个匹配项是[version]。当然,你必须从集合中的第二个匹配中去除空格和/,或者修改正则表达式以使用lookbehind(几个正则表达式不支持,所以我没有#&# 39;在这里包括它。)

获得所有这些元组后,您可以根据需要操作和计算它们。