2010-02-16 3 views
3

J'ai un fichier journal contenant des requêtes de recherche entrées dans le moteur de recherche de mon site. J'aimerais regrouper les requêtes de recherche associées pour un rapport. J'utilise Python pour la plupart de ma webapp - donc la solution peut être basée sur Python ou je peux charger les chaînes dans Postgres s'il est plus facile de le faire avec SQL.Regroupement des mots clés de recherche associés

données Exemple:

dog food 
good dog trainer 
cat food 
veterinarian 

Les groupes doivent inclure:

chat:
cat food

chien:

dog food 
good dog trainer 

alimentaire:

dog food 
cat food 

etc ...

Idées? Une sorte d '"algorithme d'indexation" peut-être?

+0

Je ne suis pas sûr de comprendre. Pouvez-vous expliquer comment vous envisagez de décider quels mots sont liés? Ou est-ce la question? –

Répondre

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 

Cela pourrait être optimisé beaucoup, mais cela affichera le résultat suivant, en supposant que placer les données brutes dans un fichier texte externe:

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

Voici une version modifiée de votre réponse: http://stackoverflow.com/questions/2275901/grouping-related-search-keywords/2277710#2277710 – jfs

0

Pas un algorithme concret, mais ce que vous cherchez est essentiellement un index créé à partir de mots trouvés dans vos lignes de texte.

Vous aurez donc besoin d'une sorte d'analyseur pour reconnaître les mots, puis vous les mettrez dans une structure d'index et lierz chaque entrée d'index à la ou aux lignes où elle se trouve. Ensuite, en passant par les entrées d'index, vous avez vos "groupes".

1

Eh bien, il semble que vous voulez juste signaler chaque requête que contient un mot donné. Vous pouvez le faire facilement en SQL en utilisant la fonction correspondant à des caractères génériques, à savoir

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

Le seul problème avec la requête ci-dessus est qu'il trouve également des requêtes avec des chaînes de requête comme « dogbah », vous devez écrire un couple des alternatives en utilisant OU pour répondre aux différents cas en supposant que vos mots sont séparés par des espaces.

0

Votre algorithme a besoin des pièces suivantes (si elle est faite par vous-même)

  • un analyseur pour les données, la rupture dans les lignes, la rupture des lignes dans les mots.
  • Une structure de données pour contenir des paires de valeurs clés (comme une table de hachage).La clé est un mot, la valeur est un tableau dynamique de lignes (si vous gardez les lignes que vous analysables dans des pointeurs de mémoire ou les numéros de ligne SUFFICE)

dans pseudocode (génération):

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 

(recherche (mot: W))

seek W in set S into Item 
if found return array from Item 
else return empty array. 
0

version modifiée de @swanson's answer (non testé):

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) 
Questions connexes