Concept de recherche floue de base de données

13

J'y ai pensé, et j'ai essayé de trouver des solutions sur la façon de rechercher floue une base de données, si par exemple un utilisateur tape une faute d'orthographe. Des problèmes flagrants avec la logique derrière cela? Cela fonctionnera-t-il et at-il déjà été fait?

Notre table que nous souhaitons rechercher:

**tblArticles**
Body - Soundex_Body - CharacterCoded_Body

Nous stockons donc le corps du texte brut pour un affichage physique. Les 2 autres colonnes sont utilisées pour les recherches qui sont précalculées de la manière suivante:

Soundex

Le corps est divisé en mots et traduit dans sa version soundex. IE, le corps résultant pourrait être quelque chose comme:

H252 B54 C23 E33... etc

Donc, quelqu'un pourrait entrer «dinosaure», et le corps de l'article se lit «dinosaure», ces deux valeurs sont évaluées en B26. Nous exécutons ensuite un LIKE sur la valeur soundex du terme de recherche.

Codé par caractère

Étant donné un mappage de caractères qui mappe les caractères aux nombres premiers, IE:

h = 2
e = 3
l = 5
o = 7
p = 11
c = 13

help = 2*3*5*11     =   330
hello = 2*3*5*5*7   =   1050
hell = 2*3*5*5      =   150
hlep = 2*5*3*11     =   330
cello = 13*3*5*5*7  =   6825

Si un utilisateur avait l'intention de taper «bonjour» mais qu'il a changé deux ou plusieurs caractères par exemple «hlelo», il évaluerait le même nombre. Divisez le corps brut en mots, encodez chaque mot et stockez-le dans la base de données en vous donnant un champ qui ressemble à:

330 6825 330 1050... etc

Nous pouvons alors aimer la recherche sur cette valeur pour faire correspondre les erreurs de frappe.

Avantages

  • Typos protégés contre
  • Orthographe incorrecte phonétique protégée contre
  • Plus de langue maternelle anglaise non amicale
  • Fonctionnera dans n'importe quelle langue (où soundex fonctionne)

Commentaires et réflexions? Une sorte de recherche multicouche. Vous pouvez bien sûr pondérer les valeurs de retour pour le rendre encore meilleur (IE une correspondance de corps de texte littéral vaut plus), mais est-ce une bonne solution pour les fautes d'orthographe et les anglophones non natifs effectuant des recherches?

À M
la source
Il serait intéressant de voir comment cela se compare à la recherche de trigrammes.
Rich
J'adorerais avoir quelque chose comme ça pour wordpress ...
Kit Menke
Est-ce que l'utilisation de nombres premiers pour votre fonction de hachage rend impossible toute collision de mots qui n'inclut pas de méthodes identiques? Il semble qu'il devrait être possible d'avoir un mot long avec beaucoup de lettres de faible valeur haché à la même valeur qu'un mot court avec quelques lettres de grande valeur, mais je ne connais pas beaucoup la théorie des nombres donc c'est probablement bien prouvé d'une manière ou d'une autre ...
glenatron
1
@Glen Afaik multiplier des nombres premiers ensemble génère toujours un nombre unique. Les anagrammes entreront en collision, mais je sais à quel point c'est un problème, c'est essentiellement le but de trouver rapidement des anagrammes.
Tom
@Glen: Voir le théorème de factorisation unique pour l'unicité.
Steven Evers

Réponses:

2

Il existe un certain nombre d'autres algorithmes de recherche. Smith-Waterman est l'un des meilleurs pour le texte humain, tandis que BLAST est (jusqu'à présent) le meilleur pour rechercher des séquences d'ADN. Lorsque du texte vous est présenté avec diverses fautes d'orthographe, par exemple au hleplieu de help, vous recherchez la distance de montage minimale .

Pour qu'une bibliothèque implémente un certain nombre de ces fonctions dans CLR dans SQL Server 2005 (et versions ultérieures), consultez le projet de forge source SimMetrics . Article de blog sur SimMetrics .
http://staffwww.dcs.shef.ac.uk/people/S.Chapman/simmetrics.html

Soundex a été développé parce que les principales différences entre les variations régionales de la parole étaient presque exclusivement dans les voyelles - c'est pourquoi il rejette les voyelles. Il n'est pas bon de faire face aux lettres transposées.

Tangurena
la source
2

Apache Solr, prend en charge les synonymes et les corrections d'orthographe - bien qu'il soit toujours un peu rude sur les bords.

Les recherches floues peuvent être implémentées à l'aide de Ngrams,

Porter Stemmer: http://tartarus.org/~martin/PorterStemmer/

et une base de données de langues telle que http://wordnet.princeton.edu/

... mais des projets tels que Xapian et Solr gèrent une grande partie de cela pour vous.

Si vous souhaitez créer votre propre moteur d'analyse / recherche de termes de recherche de mots, je suggère de placer les jetons ou les termes que vous générez dans une base de données existante conçue pour effectuer une recherche de langue.

Ben DeMott
la source
1

J'ai fait quelque chose comme ça il y a un certain temps pour les adresses qui vérifieraient combien de changements il faudrait pour transformer une chaîne en une autre chaîne et renvoyer une valeur numérique entre 0 et 1 pour savoir à quel point les deux correspondaient.

Cela a fonctionné très bien car il retournerait une valeur élevée pour des articles tels que N / North, St / Street, EastMain / MainEast, etc. L'idée est venue de ce lien CodeProject

Rachel
la source
Le code que vous avez écrit pour l'adresse correspond-il à l'open source?
Thismatters
@Thismatters Je n'ai pas accès au code, mais le lien dans ma réponse devrait en fournir la logique. Fondamentalement, vous voulez simplement voir combien de changements il faudrait pour transformer une chaîne en l'autre, et moins il y a de changements, plus ils sont proches
Rachel
0

Si vous faites correspondre des noms, des personnes ou des lieux, une liste de synonymes peut beaucoup mieux fonctionner.

Soundex ne correspondra pas à "Dick == Richard" "Kit == Christopher" ou "Ms. == Mrs."

Martin Beckett
la source