2009-12-22 2 views
0

Мы отслеживаем строки пользовательских агентов на нашем веб-сайте. Я хочу сделать некоторые статистические данные о них, чтобы узнать, сколько у нас пользователей IE6 (поэтому мы знаем, что нам нужно развивать против), а также сколько у нас мобильных пользователей.авто-tokenize пользовательские агенты строки для статистики?

Таким образом, мы имеем заходы войти как это:

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 

Это звучит как домашнее задание на компьютерную науку. Что бы это называлось? Что-то вроде этого существует там, или я пишу сам?

ответ

1

Вы сталкиваетесь с проблемой longest common substring или, с учетом вашего конкретного примера выше, самой длинной общей проблемы с префиксами, к которой можно обратиться с помощью trie.

Однако, исходя из вашего примера выше, вам, вероятно, даже не нужно быть эффективным. Вместо этого просто:

  1. разбития строки на некоторых знаков препинания подмножество, как [ ;/]

  2. Сохранить каждый уникальный префикс, однако многие лексем, заменяя оригинальные разделители

  3. Для каждого префикса, получить количество из которых записи соответствуют и сохраняются, что

0

Если вы разделите его на основное имя (часть перед открытием), а затем сохраните каждую часть, разделенную точкой с запятой, в качестве дочерней записи, вы можете выполнить любой анализ, который вы хотите. Например, хранить в реляционной базе данных:

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 on semi-colon не будет делать; У меня есть строки типа «Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-us) AppleWebKit/531.9 (KHTML, например, Gecko) Версия/4.0.3 Safari/531.9' – user151841

0

Как насчет использования регулярного выражения для анализа агента пользователя строка в соответствующие компоненты? Основной спецификацией для строки пользовательского агента является «[name]/[version]» или «[name][version]». С этой информацией мы можем использовать регулярное выражение, например ([^\(\)\/\\;\n]+)([ ]((?=\d*\.+\d*|\d*_+\d*)[\d\.Xx_]+)|[/]([^\(\)\/; \n]+)), чтобы получить совпадения, где первое совпадение в наборе - это [name], а второе совпадение в наборе - [version]. Конечно, вам придется разделить пробелы и / со второго совпадения в наборе или изменить регулярное выражение для использования lookbehind (что несколько вариантов регулярных выражений не поддерживают, поэтому я не включил его здесь).

После того, как вы получите все эти кортежи, вы можете манипулировать и считать их, как хотите.