Группировка связанных ключевых слов поиска - PullRequest
3 голосов
/ 16 февраля 2010

У меня есть файл журнала, содержащий поисковые запросы, введенные в поисковую систему моего сайта. Я хотел бы «сгруппировать» связанные поисковые запросы для отчета. Я использую Python для большей части моего веб-приложения - поэтому решение может быть либо на основе Python, либо я могу загрузить строки в Postgres, если это проще сделать с помощью SQL.

Пример данных:

dog food
good dog trainer
cat food
veterinarian

Группы должны включать:

кошка
cat food

собака

dog food
good dog trainer

питание:

dog food
cat food

и т.д ...

Идеи? Может быть, это какой-то "алгоритм индексации"?

Ответы [ 5 ]

3 голосов
/ 16 февраля 2010
f = open('data.txt', 'r')
raw = f.readlines()

#generate set of all possible groupings
groups = set()
for lines in raw:
    data = lines.strip().split()
    for items in data:
        groups.add(items)

#parse input into groups
for group in groups:
    print "Group \'%s\':" % group
    for line in raw:
        if line.find(group) is not -1:
            print line.strip()
    print

#consider storing into a dictionary instead of just printing

Это может быть сильно оптимизировано, но при этом вы получите следующий результат, если вы поместите необработанные данные во внешний текстовый файл:

Group 'trainer':
good dog trainer

Group 'good':
good dog trainer

Group 'food':
dog food
cat food

Group 'dog':
dog food
good dog trainer

Group 'cat':
cat food

Group 'veterinarian':
veterinarian
1 голос
/ 16 февраля 2010

Что ж, похоже, вы просто хотите сообщить о каждом запросе, который содержит данного слова. Вы можете легко сделать это в простом SQL с помощью функции сопоставления с подстановочными знаками, т.е.

SELECT * FROM QUERIES WHERE `querystring` LIKE '%dog%'.

Единственная проблема с запросом, указанным выше, состоит в том, что он также находит запросы со строками запроса, такими как "dogbah", вам нужно написать пару альтернатив, используя OR для удовлетворения различных случаев, предполагая, что ваши слова разделены пробелами.

0 голосов
/ 17 февраля 2010

Модифицированная версия ответа @ swanson (не тестировалась):

from collections import defaultdict
from itertools   import chain

# generate set of all possible words
lines = open('data.txt').readlines()
words = set(chain.from_iterable(line.split() for line in lines))

# parse input into groups
groups = defaultdict(list)
for line in lines:    
    for word in words:
        if word in line:
           groups[word].append(line)
0 голосов
/ 16 февраля 2010

Вашему алгоритму нужны следующие части (если все сделано самостоятельно)

  • синтаксический анализатор данных, разбивающийся на строки, разбивающий строки на слова.
  • Структура данных для хранения пар ключ-значение (например, хеш-таблица). Ключ - это слово, значение - динамический массив строк (если вы сохраняете строки, которые вы анализировали в указателях памяти, или достаточно номеров строк)

в псевдокоде (генерация):

create empty set S for name value pairs.
for each line L parsed
  for each word W in line L
    seek W in set S -> Item
    if not found -> add word W -> (empty array) to set S
    add line L reference to array in Ietm
  endfor
endfor

(поиск (слово: W))

seek W in set S into Item
if found return array from Item
else return empty array.
0 голосов
/ 16 февраля 2010

Не конкретный алгоритм, но вы ищете индекс, созданный из слов, найденных в ваших текстовых строках.

Таким образом, вам понадобится какой-то синтаксический анализатор для распознавания слов, затем вы помещаете их в структуру индекса и связываете каждую запись индекса со строками, в которых она найдена. Затем, просматривая записи индекса, вы получаете свои «группы».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...