Strings de agentes de usuários automáticos para estatísticas?
-
21-09-2019 - |
Pergunta
Continuamos com seqüências de strings de agentes do usuário em nosso site. Quero fazer algumas estatísticas sobre eles, para ver quantos usuários do IE6 temos (por isso sabemos o que temos para desenvolver) e também quantos usuários móveis temos.
Então, temos o registro de log como este:
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)
E, idealmente, seria muito legal ver todas as cordas 'significativas', o que significaria apenas cordas mais longas do que um certo comprimento. Por exemplo, eu gostaria de ver quantas entradas têm FunWebProducts
nele, ou .NET CLR
, ou .NET CLR 1.0.3705
-- mas eu não Quer ver quantos têm um semi-colon. Portanto, não estou necessariamente procurando cordas únicas, mas todas as cordas, mesmo subconjuntos. Então, eu gostaria de ver a contagem de todos Mozilla
, sabendo que isso inclui as contagens para Mozilla/5.0
e Mozilla/4.0
. Seria bom se houvesse uma exibição aninhada para isso, começando com as cordas mais curtas e descendo. Algo talvez goste
4,2093 Mozilla
1,093 Mozilla/5.0
468 Mozilla/5.0 (Windows;
47 Mozilla/5.0 (Windows; U
2,398 Mozilla/4.0
Isso soa como um dever de casa de ciência da computação. Como isso seria chamado? Algo assim existe por aí, ou eu escrevo o meu?
Solução
Você está olhando para um Substring mais comum mais longa problema, ou, dado o seu exemplo específico acima, um problema de prefixo comum mais longo, que pode ser abordado com um Trie.
No entanto, indo do seu exemplo acima, você provavelmente nem precisa ser eficiente sobre isso. Em vez disso, simplesmente:
Tokenize strings em algum subconjunto de pontuação, como
[ ;/]
Salve cada prefixo exclusivo de quantos tokens, substituindo os delimitadores originais
Para cada prefixo, obtenha uma contagem de quais registra ele corresponde e salve isso
Outras dicas
Se você dividi -lo no nome principal (parte antes do Paren de abertura) e, em seguida, guarde cada parte separada por Semicolon como um registro infantil, poderá fazer qualquer análise que desejar. Por exemplo, armazene -o em um banco de dados relacional:
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
Em seguida, registre referências ao navegador e peças e você pode fazer qualquer tipo de análise que desejar.
Que tal usar um regex para analisar a string do agente do usuário em suas peças de componentes relevantes? A especificação básica para uma string de agente do usuário é '[name]
/[version]
' ou '[name]
[version]
'. Com essa informação, podemos usar um regex como ([^\(\)\/\\;\n]+)([ ]((?=\d*\.+\d*|\d*_+\d*)[\d\.Xx_]+)|[/]([^\(\)\/; \n]+))
Para obter conjuntos de partidas onde a primeira partida em um conjunto é o [name]
e a segunda partida em um conjunto é o [version]
. Claro, você terá que tirar os espaços e /
A partir da segunda partida no conjunto ou modifique o regex para usar o LookBehind (que vários sabores regex não suportam, então eu não o incluí aqui).
Depois de obter todas essas tuplas, você pode manipulá -las e contá -las como quiser.