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?

Foi útil?

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:

  1. Tokenize strings em algum subconjunto de pontuação, como [ ;/]

  2. Salve cada prefixo exclusivo de quantos tokens, substituindo os delimitadores originais

  3. 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top