2010-05-27 10 views
3

J'essaie d'écrire un algorithme de recherche de texte libre pour trouver des messages spécifiques sur un mur (un type de mur similaire à celui utilisé par Facebook). Un utilisateur est supposé être capable d'écrire des mots dans un champ de recherche et d'obtenir des résultats positifs sur les messages qui contiennent les mots; avec le meilleur match en haut puis les autres posts en ordre décroissant en fonction du score du match. J'utilise la distance d'édition (Levenshtein) "e (x, y) = e" pour calculer le score de chaque publication par rapport au mot de requête "x" et au mot "y" après: (x, y) = 2^(2 - e) (1 - min (e, | x |)/| x |), où "| x |" est le nombre de lettres dans le mot de requête.Rédaction d'un algorithme de post-recherche

Chaque mot dans un article contribue au score total pour ce poste spécifique. Cette approche semble bien fonctionner lorsque les messages ont à peu près la même taille, mais parfois certains grands messages réussissent à accumuler des points uniquement en ayant beaucoup de mots en eux alors qu'en pratique, ils ne sont pas pertinents pour la requête. Est-ce que j'aborde ce problème de la mauvaise façon ou est-ce qu'il y a un moyen de normaliser le score auquel je n'ai pas pensé?

Répondre

1

Oui. Il existe de nombreuses méthodes de normalisation que vous pourriez utiliser. C'est un domaine bien documenté!

Jetez un oeil à the vector space model. TDF/IDF pourrait être pertinent pour ce que vous faites. Ce n'est pas strictement lié à la méthode que vous utilisez mais cela pourrait vous donner des pistes de normalisation. Notez également que la comparaison de chaque message sera O (N) et pourrait devenir très lent. Au lieu de chaîne-distance, vous pouvez avoir de meilleurs résultats avec stemmming. Vous pouvez ensuite mettre cela dans un index VSM inversé.

De nombreuses bases de données (y compris MySQL et Postgres) ont une recherche en texte intégral. C'est probablement plus pratique que de le faire vous-même.

+0

Merci, tf-idf semble prometteur. J'ai juste besoin de l'appliquer à mon problème puisque la requête de recherche que j'utilise peut se composer de plusieurs mots où leurs occurrences devraient être plus importantes si elles existent dans la même publication. Le nombre de messages dans le mur est assez modeste (10000 messages max), mais comme j'ai besoin de comparer chaque mot de recherche avec tous les mots de tous les messages, j'obtiens O (N^3) ... Peut-être est-il plus simple recherche de texte intégral incorporée dans la base de données MS SQL 2008 à la place. La raison pour laquelle j'ai commencé à l'étudier était parce que je voulais une recherche par mots flous, mais peut-être que la base de données peut gérer cela? – MdaG

+0

Je ne connais pas MSSQL mais celui de Postgres est très bon et très personnalisable. J'ai essayé de faire quelque chose de similaire à vous (chaîne fuzzy correspondant à des documents, mais pas de texte). La solution actuelle consiste à diviser l'algorithme de correspondance floue au centre et à placer une recherche d'espace vectoriel au centre. Ça semble fonctionner pour moi! folktunefinder.com – Joe

Questions connexes