我有一个日志文件,其中包含输入到我网站搜索引擎中的搜索查询。我想将相关的搜索查询“分组”在一起以获得报告。我在我的大多数webapp上使用Python - 所以解决方案可以是基于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
答案 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)