将相关搜索关键字分组

时间:2010-02-16 20:01:23

标签: python algorithm postgresql data-structures

我有一个日志文件,其中包含输入到我网站搜索引擎中的搜索查询。我想将相关的搜索查询“分组”在一起以获得报告。我在我的大多数webapp上使用Python - 所以解决方案可以是基于Python的,或者我可以将字符串加载到Postgres中,如果使用SQL更容易做到这一点。

示例数据:

dog food
good dog trainer
cat food
veterinarian

小组应包括:

猫:
cat food

狗:

dog food
good dog trainer

食品:

dog food
cat food

等...

想法?某种“索引算法”或许?

5 个答案:

答案 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

答案 1 :(得分:1)

好吧,您似乎只想报告包含给定单词的每个查询。您可以使用通配符匹配功能(即

)在纯SQL中轻松完成此操作
SELECT * FROM QUERIES WHERE `querystring` LIKE '%dog%'.

上面查询的唯一问题是它还会查找带有查询字符串的查询,例如“dogbah”,您需要使用OR编写几个替代方案,以便在假设您的单词被空格分隔的情况下满足不同的情况。

答案 2 :(得分:0)

不是具体的算法,但您所寻找的基本上是根据文本行中的单词创建的索引。

因此,您需要某种解析器来识别单词,然后将它们放在索引结构中,并将每个索引条目链接到找到它的行。然后,通过查看索引条目,您就拥有了“组”。

答案 3 :(得分: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.

答案 4 :(得分: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)