L'appariement approximatif de chaînes algorithmes

ici au travail, nous avons souvent besoin de trouver une chaîne de la liste des chaînes qui est la plus proche d'une autre chaîne de saisie. Actuellement, nous utilisons L'algorithme de Needleman-Wunsch. L'algorithme renvoie souvent beaucoup de faux positifs (si nous définissons le score minimum trop bas), parfois il ne trouve pas de correspondance quand il devrait (quand le score minimum est trop élevé) et, la plupart du temps, nous devons vérifier les résultats à la main. Nous avons pensé que nous devrions essayer d'autres alternatives.

avez-vous de l'expérience avec les algorithmes? Savez-vous comment les algorithmes se comparent?

j'apprécierais vraiment un conseil.

PS: nous codons en C#, mais vous ne devriez pas vous en soucier - je pose des questions sur les algorithmes en général.


Oh, je suis désolé j'ai oublié de le mentionner.

non, on ne l'utilise pas pour faire correspondre les données. Nous avons une liste de les chaînes que nous recherchons - nous l'appelons search-list. Ensuite, nous devons traiter des textes provenant de différentes sources (comme les flux RSS, les sites web, les forums, etc.).)- nous extrayons des parties de ces textes (il y a des ensembles entiers de règles pour cela, mais ce n'est pas pertinent) et nous devons les comparer à la liste de recherche. Si la chaîne correspond à l'une des chaînes de recherche-liste - nous besoin de faire un traitement approfondi de la chose (qui est également hors de propos).

Nous ne pouvons pas effectuer le comparaison normale, parce que les chaînes extraites des sources extérieures, la plupart du temps, incluent quelques mots supplémentaires, etc.

de toute façon, ce n'est pas pour la détection en double.

45
demandé sur Tim Post 2008-09-08 11:21:20

7 réponses

OK, Needleman-Wunsch(NW) est un classique de bout en bout ("global") aligneur de la littérature bio-informatique. Il était depuis longtemps disponible en tant que "align" et "align0" dans le paquet FASTA. La différence était que la version" 0 " n'était pas aussi biaisée pour éviter les dérapages, ce qui permettait souvent de favoriser des matches internes de grande qualité plus facilement. Smith-Waterman, je pense que vous êtes au courant, est un aligneur local et est la base originale de L'explosion. FASTA avait son propre aligneur local ainsi que qui était légèrement différente. Toutes ces méthodes sont essentiellement heuristiques pour estimer la distance Levenshtein pertinente à une métrique de notation pour des paires de caractères individuelles (en bioinformatique, souvent donnée par Dayhoff/"PAM", Henikoff&Henikoff, ou d'autres matrices et généralement remplacée par quelque chose de plus simple et plus raisonnablement reflétant des remplacements dans la morphologie des mots linguistiques lorsqu'elle est appliquée à la langue naturelle).

ne nous faisons pas d'illusions sur les étiquettes: Levenshtein distance, comme référencé dans la pratique au moins, est essentiellement éditer la distance et vous devez l'estimer parce qu'il n'est pas possible de le calculer généralement, et il est coûteux de calculer exactement, même dans des cas spéciaux intéressants: l'eau devient profonde rapide là, et donc nous avons des méthodes heuristiques de longue et bonne réputation.

maintenant en ce qui concerne votre propre problème: il y a plusieurs années, j'ai dû vérifier l'exactitude de l'ADN Court lit contre séquence de référence connue pour être correcte et j'ai trouvé avec quelque chose que j'ai appelé "ancré alignements".

l'idée est de prendre votre jeu de chaînes de référence et de le" digérer " en trouvant tous les endroits où une chaîne de caractères N donnée se produit. Choisissez N pour que la table que vous construisez ne soit pas trop grande mais aussi pour que les substrats de longueur N ne soient pas trop communs. Pour les petits alphabets comme les bases D'ADN, il est possible de trouver un hachage parfait sur les chaînes de n caractères et faire une table et enchaîner les matches dans une liste liée à partir de chaque bin. Le les entrées de liste doivent identifier la séquence et la position de départ de la sous-chaîne qui correspond à la bin dans la liste de laquelle elles apparaissent. Ce sont des "ancres" dans la liste des chaînes à rechercher auxquelles un alignement NW est susceptible d'être utile.

lors du traitement d'une chaîne de requête, vous prenez les N caractères commençant à un certain offset K dans la chaîne de requête, les hachez, cherchez leur bin, et si la liste pour cette bin est non empty alors vous allez à travers tous les enregistrements de liste et effectuer des alignements entre la chaîne de requête et la chaîne de recherche référencée dans l'enregistrement. En faisant ces alignements, vous alignez la chaîne de requête et la chaîne de recherche à l'ancre et extraire un substrat de la chaîne de recherche qui est la même longueur que la chaîne de requête et qui contient que l'ancre au même décalage, K.

si vous choisissez une longueur d'ancrage N suffisamment longue, et un ensemble raisonnable de valeurs d'offset K (elles peuvent être étendues à travers la chaîne de requête OU être limité aux faibles compensations) vous devriez obtenir un sous-ensemble d'alignements possibles et obtiendrez souvent des gagnants plus clairs. Typiquement, vous voudrez utiliser le moins d'align0-comme l'aligneur NW.

cette méthode essaie de boost NW un peu en limitant son entrée et cela a un gain de performance parce que vous faites moins d'alignements et ils sont plus souvent entre des séquences similaires. Une autre bonne chose à faire avec votre aligneur NW est de lui permettre d'abandonner après une certaine quantité ou longueur de le gapping permet de réduire les coûts, surtout si vous savez que vous n'allez pas voir OU être intéressé par des matches de qualité moyenne.

enfin, cette méthode a été utilisée sur un système avec de petits alphabets, avec K limité à la centaine de premières positions dans la chaîne de requête et avec des chaînes de recherche beaucoup plus grandes que les requêtes (les lectures ADN étaient environ 1000 bases et les chaînes de recherche étaient de l'ordre de 10000, donc je cherchais des sous-chaînes approximatives justifiées par un l'estimation de la distance d'édition en particulier). L'adaptation de cette méthodologie au langage naturel exigera une réflexion approfondie: vous perdez sur la taille de l'alphabet mais vous gagnez si vos chaînes de requête et de recherche sont de longueur similaire.

dans les deux cas, permettre l'utilisation simultanée de plus d'une ancre provenant de différentes extrémités de la chaîne de requête pourrait être utile pour filtrer davantage les données transmises à NW. Si vous faites cela, soyez prêt à éventuellement envoyer des chaînes se chevauchant chacune contenant un des deux ancrages à l'aligneur et puis réconcilier les alignements... ou éventuellement modifier NW pour mettre l'accent sur le maintien de vos ancrages presque intacts lors d'un alignement en utilisant la modification de pénalité lors de l'exécution de l'algorithme.

j'Espère que cela est utile ou au moins intéressant.

32
répondu Thomas Kammeyer 2008-09-09 17:32:11

en relation avec la distance de Levenstein: vous pourriez vouloir la normaliser en divisant le résultat par la longueur de la plus longue chaîne, de sorte que vous obtenez toujours un nombre entre 0 et 1 et de sorte que vous pouvez comparer la distance de la paire de chaînes d'une manière significative (l'expression L(A, B) > L(A, C) - par exemple - est sans signification à moins que vous normalisiez la distance).

6
répondu Grey Panther 2008-09-08 07:46:37

des algorithmes à regarder sont agrep ( entrée de Wikipedia sur agrep ), FASTA et BLAST biologique correspondant à la séquence d'algorithmes. Ce sont des cas spéciaux de correspondance approximative de chaîne de caractères , également dans le Stony Brook algorithm repositry . Si vous pouvez spécifier les façons dont les chaînes diffèrent les unes des autres, vous pouvez probablement vous concentrer sur un algorithme adapté. Pour par exemple, aspell utilise une variante de la distance" soundslike "(Soundex-métaphone) en combinaison avec une distance" keyboard " pour accommoder les mauvaises orthographes et les mauvaises.

5
répondu Yuval F 2008-09-10 09:58:03

nous utilisons la méthode Levenshtein distance pour vérifier la présence de clients dupliqués dans notre base de données. Il fonctionne très bien.

4
répondu Biri 2008-09-08 07:29:47
1
répondu alex 2013-02-23 23:56:14

afin de minimiser les discordances dues à de légères variations ou fautes d'orthographe, j'ai utilisé L'algorithme Métaphone, puis la distance Levenshtein (graduée à 0-100 en pourcentage de correspondance) sur les encodages Métaphone pour une mesure de proximité. Cela semble avoir assez bien fonctionné.

1
répondu R. Shilling 2013-06-07 20:41:50

pour développer la réponse de Cd-MaN, On dirait que vous faites face à un problème de normalisation. Il n'est pas évident comment gérer les scores entre les alignements avec des longueurs variables.

étant donné ce qui vous intéresse, vous pouvez vouloir obtenir des valeurs p pour votre alignement. Si vous utilisez Needleman-Wunsch, vous pouvez obtenir ces valeurs de p en utilisant Karlin-Altschul statistiques http://www.ncbi.nlm.nih.gov/BLAST/tutorial/Altschul-1.html

BLAST peut alignement local et les évaluer à l'aide de ces statistiques. Si vous êtes préoccupé par la vitesse, ce serait un bon outil à utiliser.

une autre option est D'utiliser HMMER. HMMER utilise des modèles de Markov cachés pour aligner les séquences. Personnellement, je pense que c'est une approche plus puissante, puisqu'elle fournit des informations de position. http://hmmer.janelia.org /

0
répondu mortonjt 2014-03-20 02:50:47