2017-05-10 6 views
1

Quel est le meilleur moyen de filtrer les URL en comparant où se trouve un mot-clé dans l'URL ou non? J'ai une liste de mots-clés (une sorte de liste noire) qui contient 50000 mots. La méthode de recherche utilise les étapes suivantes:Méthode efficace de filtrage des URL en parcourant la liste des mots-clés

While (fin de mots-clés) 1. Obtenir le mot-clé de la base de données 2. Vérifiez si le mot clé est dans l'url 3. redirigent l'utilisateur vers une page spécifique. Lorsque j'utilise cette méthode, l'utilisation du processeur devient autour de% 90. Y a-t-il un moyen efficace de le faire? Il semble que je ne puisse pas utiliser regex, puisque le mot clé change toujours.

+0

Construire un arbre binaire équilibré des mots-clés et la recherche que. 5000 mots-clés ne sont pas trop pour une structure de données en mémoire. –

+0

Merci Paul. C'est 50 000 et ça va augmenter dans le temps. Ce sera comme une recherche en arrière. Disons que mon URL est www.selldrugs.com. J'ai une liste de mots-clés qui contient de la drogue. Je dois obtenir les mots-clés un par un, puis appeler la méthode doesUrlContainsKeyword(). Si le mot clé est 50 000e mot-clé, alors c'est un problème. –

+0

50.000 mots-clés ne devraient toujours pas être un problème pour une structure de données en mémoire sur une machine 64-bit. –

Répondre

0
  1. Vérifiez si le mot clé est dans l'url [...] Y at-il un moyen efficace de le faire?

Le vice versa sera beaucoup plus efficace: diviser l'URL sur les mots-clés et les rechercher dans la base de données.

Pour accélérer la recherche dans la base de données, vous pouvez utiliser une variété de méthodes. Par exemple, trier la base de données et faire une recherche binaire, utiliser une structure trie, table de hachage, etc

+0

Merci Andriy. Si j'ai une URL contient 2000 caractères, je dois créer des combinaisons de mots clés avec 2000 caractères. Cela ne coûterait-il pas cher? –

+0

Bien sûr, vous avez besoin de séparateurs de mots clés pour fractionner l'URL efficacement. IMO il est logique pour la filtration, puisque le sexe et unisexe pourrait avoir une signification tout à fait différente. Mais bien sûr, c'est à vous et c'est juste mes 2 cents ... –

2

Le problème est la recherche multi-modèle et peut être résolu efficacement avec l'algorithme Aho-Coracisk. Cet algorithme recherche simultanément un ensemble de chaînes. La complexité de l'algorithme est linéaire dans la longueur des mots-clés, plus la longueur de l'URL plus le nombre de correspondances de sortie.

+0

Voir https://en.wikipedia.org/wiki/Aho%E2%80%93Corasick_algorithm –

+0

Merci Marcin. C'était exactement ce que je cherchais. –

0

L'algorithme Aho-Corasick est la meilleure solution pour ce problème. Voici la mise en œuvre de python Aho-Corasick

Ci-dessous un exemple de code

import ahocorasick 
A = ahocorasick.Automaton() 
for index, word in enumerate('asim sinan yuksel uksel sel sina sim asi as nan an in ina uks .com .co www. http//'.split()): 
    A.add_word(word, (index, word)) 
A.make_automaton() 
for item in A.iter('http://wwww.asimsinanyuksel.com'): 
    print(item)