Extraire la chaîne canonique d'une liste de chaînes bruyantes


10

J'ai des milliers de listes de chaînes et chaque liste contient environ 10 chaînes. La plupart des chaînes d'une liste donnée sont très similaires, bien que certaines chaînes soient (rarement) complètement sans rapport avec les autres et que certaines chaînes contiennent des mots non pertinents. Ils peuvent être considérés comme des variations bruyantes d'une chaîne canonique. Je recherche un algorithme ou une bibliothèque qui convertira chaque liste en cette chaîne canonique.

Voici une telle liste.

  • Star Wars: Episode IV Un nouvel espoir | StarWars.com
  • Star Wars Episode IV - Un nouvel espoir (1977)
  • Star Wars: Episode IV - Un nouvel espoir - Tomates pourries
  • Regarder Star Wars: Episode IV - Un nouvel espoir en ligne gratuit
  • Star Wars (1977) - Les plus grands films
  • [REC] 4 affiches promettent la mort d'un moteur hors-bord - SciFiNow

Pour cette liste, toute chaîne correspondant à l'expression régulière ^Star Wars:? Episode IV (- )?A New Hope$serait acceptable.

J'ai regardé le cours d'Andrew Ng sur l'apprentissage automatique sur Coursera, mais je n'ai pas pu trouver un problème similaire.


2
PS Je pense que le terme que vous recherchez est "canonique"
Sean Owen

La chaîne "la plus probable" / "la plus consensuelle" que vous cherchez pour identifier une expression régulière? Ou l'une des chaînes de la liste?
MrMeritology

@MrMeritology Je ne cherche pas d'expression régulière. J'ai montré une expression régulière dans ma question juste pour illustrer à quel point je suis flexible dans le type de chaînes que je considérerais comme correctes.
lacton

D'ACCORD. Ensuite, la réponse que j'ai donnée ci-dessous devrait vous convenir.
MrMeritology

Serait-ce sous NER (reconnaissance d'entité nommée)?
hippietrail du

Réponses:


4

En tant que solution naïve, je suggère de sélectionner d'abord les chaînes qui contiennent les jetons les plus fréquents dans la liste. De cette façon, vous pouvez vous débarrasser de la chaîne non pertinente.

Dans la deuxième phrase, je ferais un vote majoritaire. En supposant les 3 phrases:

  • Star Wars: Episode IV Un nouvel espoir | StarWars.com
  • Star Wars Episode IV - Un nouvel espoir (1977)
  • Star Wars: Episode IV - Un nouvel espoir - Tomates pourries

Je passerais en revue les jetons un par un. Nous commençons par "Star". Il gagne car toute la chaîne commence par lui. "Wars" gagnera également. Le suivant est ":". Il gagnera également.

Tous les jetons seront votés à la majorité jusqu'à "Hope". Le prochain jeton après "Hope" sera soit "|", soit "(" ou "-". Aucun des gagnants ne gagnera au vote majoritaire donc je m'arrêterai ici!

Une autre solution serait probablement d'utiliser la sous-séquence commune la plus longue .

Comme je l'ai dit, je n'y ai pas beaucoup réfléchi. Il pourrait donc y avoir de bien meilleures solutions à votre problème :-)


3

Calculez d'abord la distance d'édition entre toutes les paires de chaînes. Voir http://en.wikipedia.org/wiki/Edit_distance et http://web.stanford.edu/class/cs124/lec/med.pdf . Ensuite, excluez toutes les chaînes aberrantes en fonction d'un certain seuil de distance.

Avec les chaînes restantes, vous pouvez utiliser la matrice de distance pour identifier la chaîne la plus centrale. Selon la méthode que vous utilisez, vous pouvez obtenir des résultats ambigus pour certaines données. Aucune méthode n'est parfaite pour toutes les possibilités. Pour vos besoins, vous n'avez besoin que de quelques règles heuristiques pour résoudre les ambiguïtés - c'est-à-dire choisir deux candidats ou plus.

Peut-être que vous ne voulez pas choisir "le plus central" dans votre liste de chaînes, mais que vous souhaitez générer une expression régulière qui capture le modèle commun à toutes les chaînes non aberrantes. Une façon de procéder consiste à synthétiser une chaîne équidistante de toutes les chaînes non aberrantes. Vous pouvez déterminer la distance d'édition requise à partir de la matrice, puis vous généreriez de manière aléatoire régulière en utilisant ces distances comme contraintes. Ensuite, vous testez les expressions régulières candidates et acceptez la première qui correspond aux contraintes et accepte également toutes les chaînes de votre liste non aberrante. (Commencez à créer des expressions régulières à partir des listes de sous-chaînes communes les plus longues, car il s'agit de caractères non génériques.)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.