自动标记用户代理字符串的统计信息?
我们跟踪我们网站的用户代理字符串。我想对他们做一些统计,看看我们有多少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.0
和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
这听起来像一个计算机科学家庭作业。这会被称为什么?有这样的事情存在吗,还是我自己写?
您正在查看longest common substring问题,或者考虑到上述具体的示例,最长的常见前缀问题可以通过trie来解决。
但是,从你上面的例子来看,你可能甚至不需要对此有效。相反,简单地说:
- 一些标点符号子集
记号化的字符串,如
[ ;/]
保存然而,许多令牌的每一个独特的前缀,替换原有的分隔符
对于每个前缀,得到的计数其中记录它匹配并保存
如果你把它分解成主要名字(部分在开头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
然后登录到浏览器和部件的引用,你可以做你想做的任何类型的分析。
如何使用正则表达式来解析用户代理串入相关的组件部分?用户代理字符串的基本规格是'[name]
/[version]
'或'[name]
[version]
'。有了这些信息,我们可以使用像([^\(\)\/\\;\n]+)([ ]((?=\d*\.+\d*|\d*_+\d*)[\d\.Xx_]+)|[/]([^\(\)\/; \n]+))
这样的正则表达式来获得匹配集合,其中集合中的第一个匹配是[name]
,集合中的第二个匹配是[version]
。当然,你必须从集合中的第二个匹配中去掉空格和/
,或者修改正则表达式以使用lookbehind(几种正则表达式不支持,所以我没有在这里包括它)。
获得所有这些元组后,您可以操作并计算它们,无论您想要如何。
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