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?
Réponses:
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
hlep
lieu dehelp
, 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.
la source
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.
la source
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
la source
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."
la source