автоматически маркировать строки пользовательских агентов для статистики? - PullRequest
0 голосов
/ 22 декабря 2009

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

Итак, у нас есть такие записи:

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

Это звучит как домашнее задание по информатике. Как бы это называется? Существует ли что-то подобное или я пишу свое?

Ответы [ 3 ]

1 голос
/ 28 сентября 2012

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

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

  1. Токенизация строк в некотором подмножестве пунктуации, например [ ;/]

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

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

0 голосов
/ 08 сентября 2014

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

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

0 голосов
/ 22 декабря 2009

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

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

Затем запишите ссылки на браузер и детали, и вы сможете выполнить любой тип анализа.

...