2009-12-22 11 views
0

Nous gardons une trace des chaînes d'agent utilisateur dans notre site Web. Je veux faire quelques statistiques sur eux, pour voir combien d'utilisateurs IE6 nous avons (donc nous savons ce que nous devons développer par rapport), et aussi combien d'utilisateurs mobiles nous avons.auto-tokenize chaînes d'agents utilisateur pour les statistiques?

Nous avons donc connecter entires comme ceci:

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) 

Et idéalement, il serait assez impressionnant de voir toutes les chaînes « significatives », qui simplement signifier des chaînes probablement plus d'une certaine longueur. Par exemple, je voudrais voir combien d'entrées ont FunWebProducts, ou .NET CLR, ou .NET CLR 1.0.3705 - mais ne veulent pas veulent voir combien ont un point-virgule. Je ne recherche donc pas forcément des chaînes uniques, mais toutes les chaînes, même les sous-ensembles. Donc, je voudrais voir le nombre de tous Mozilla, sachant que cela comprend les chiffres pour Mozilla/5.0 et Mozilla/4.0. Ce serait bien s'il y avait un affichage imbriqué pour cela, en commençant par les chaînes les plus courtes, et en descendant. Quelque chose peut-être comme

4,2093 Mozilla 
1,093 Mozilla/5.0 
    468 Mozilla/5.0 (Windows; 
    47 Mozilla/5.0 (Windows; U 
2,398 Mozilla/4.0 

Cela ressemble à un devoir de science informatique. Comment serait-ce appelé? Est-ce que quelque chose comme ça existe là-bas, ou est-ce que j'écris le mien?

Répondre

1

Vous êtes à la recherche d'un problème longest common substring, ou, étant donné votre exemple spécifique ci-dessus, un plus long problème de préfixe commun, qui peut être approché avec un trie. Cependant, à partir de votre exemple ci-dessus, vous n'avez probablement même pas besoin d'être efficace à ce sujet. Au lieu de cela, tout simplement:

  1. cordes tokenize sur un sous-ensemble de la ponctuation, comme [ ;/]

  2. Enregistrer chaque préfixe unique mais beaucoup de jetons, en remplaçant les délimiteurs d'origine

  3. Pour chaque préfixe, obtenir un compte dont enregistrements enregistrements et enregistrer que

0

Si vous le divisez en nom principal (partie avant le paren), puis que vous enregistrez chaque partie séparée par un point-virgule en tant qu'enregistrement enfant, vous pouvez effectuer l'analyse souhaitée. Par exemple, le stocker dans une base de données relationnelle:

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 

Ensuite, connectez-vous des références au navigateur et les pièces et vous pouvez faire tout type d'analyse que vous voulez.

+0

Le marquage par un point-virgule ne le fera pas; J'ai des chaînes comme 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; fr-fr) AppleWebKit/531.9 (KHTML, comme Gecko) Version/4.0.3 Safari/531.9' – user151841

0

Qu'en est-il de l'utilisation d'une expression régulière pour analyser l'agent utilisateur chaîne dans ses parties constituantes pertinentes? La spécification de base pour une chaîne d'agent utilisateur est '[name]/[version]' ou '[name][version]'. Avec cette information, nous pouvons utiliser une regex comme ([^\(\)\/\\;\n]+)([ ]((?=\d*\.+\d*|\d*_+\d*)[\d\.Xx_]+)|[/]([^\(\)\/; \n]+)) pour obtenir des ensembles de correspondances où la première correspondance dans un ensemble est le [name] et la deuxième correspondance dans un ensemble est le [version]. Bien sûr, vous devrez supprimer les espaces et / du second match de l'ensemble, ou modifier l'expression rationnelle pour utiliser lookbehind (que plusieurs expressions regex ne supportent pas, donc je ne l'ai pas inclus ici). Après avoir obtenu tous ces tuples, vous pouvez les manipuler et les compter comme bon vous semble.

Questions connexes