2010-02-16 5 views
3

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

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

dog food 
good dog trainer 
cat food 
veterinarian 

группы должны включать в себя:

кошка:
cat food

собака:

dog food 
good dog trainer 

еды:

dog food 
cat food 

и т.д ...

Идеи? Может быть, какой-то «алгоритм индексирования»?

+0

Я не уверен, что понимаю. Можете ли вы объяснить, как вы планируете решать, какие слова связаны? Или это вопрос? –

ответ

3
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 
+0

Вот измененная версия вашего ответа: http://stackoverflow.com/questions/2275901/grouping-related-search-keywords/2277710#2277710 – jfs

0

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

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

1

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

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

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

0

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

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

в псевдокоде (поколения):

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

Модифицированная версия @swanson's answer (не проверено):

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) 
Смежные вопросы