2009-12-22 41 views
0

我们跟踪我们网站的用户代理字符串。我想对他们做一些统计,看看我们有多少IE6用户(所以我们知道我们需要开发什么),以及我们有多少移动用户。自动标记用户代理字符串的统计信息?

因此,我们必须登录entires这样的:

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 

这听起来像一个计算机科学家庭作业。这会被称为什么?有这样的事情存在吗,还是我自己写?

回答

1

您正在查看longest common substring问题,或者考虑到上述具体的示例,最长的常见前缀问题可以通过trie来解决。

但是,从你上面的例子来看,你可能甚至不需要对此有效。相反,简单地说:

  1. 一些标点符号子集

    记号化的字符串,如[ ;/]

  2. 保存然而,许多令牌的每一个独特的前缀,替换原有的分隔符

  3. 对于每个前缀,得到的计数其中记录它匹配并保存

0

如果你把它分解成主要名字(部分在开头paren之前),然后用分号分隔存储每个部分作为子记录,你可以做任何你想要的分析。例如,将其存储在关系数据库中:

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 

然后登录到浏览器和部件的引用,你可以做你想做的任何类型的分析。

+0

Tokenize在分号上不行;我有'Mozilla/5.0(Macintosh; U;英特尔Mac OS X 10_5_8; en-us)ApplewebKit/531.9(KHTML,如Gecko)版本/4.0.3 Safari/531.9' – user151841 2009-12-22 18:42:48

0

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

获得所有这些元组后,您可以操作并计算它们,无论您想要如何。