Trouvez la section de chaîne qui contient une autre chaîne, avec des mots possibles intermédiaires

StackOverflow https://stackoverflow.com/questions/4155729

  •  08-10-2019
  •  | 
  •  

Question

Pour le dernier projet du semestre, l'objectif est d'effectuer des recherches d'une expression particulière sur une chaîne lyrique dans un objet morceau, puis classer les résultats en fonction de la durée du match substring. Les paroles ont été lues à partir d'un fichier et correspondent aux sauts de ligne dans ce fichier.

Par exemple, la recherche de « Elle vous aime » reviendriez ces derniers dans les matchs de l'échantillon:

Les Beatles: "... Elle vous aime , ouais, ouais, ouais ..." Classement = 13 caractères
Bonnie Raitt: "... Elle juste vous aime ..." Classement = 18 caractères
Elvis Presley: "... Vous demandez si Elle aime me \ r \ Nwell, ne sais pas ..." Classement = 23 caractères

Comme vous pouvez le voir le dernier exemple, les matches peuvent couvrir plusieurs lignes.

J'ai toutes les chansons dans un TreeMap<String, TreeSet<Song>>, donc je reçois toutes les chansons qui correspondent au premier mot dans la requête. La difficulté que je vais avoir est à la recherche de la chaîne pour les matches, car une expression régulière ne fonctionnera pas dans cette situation.

Lorsque l'objet Song construit, je jeté les paroles dans un ensemble pour effectuer des recherches pour un seul mot, et pour ce faire je String.split("[^a-zA-Z}") pour séparer les mots individuels et éliminer les signes de ponctuation. Donc, je veux lancer ma recherche sur ce tableau. Le processus que je utilise va comme:

break up the query into a String array
  for each Song in the set
    if (song.lyrics.contains(query)
      great, break loop to next song

    otherwise
      int queryCounter=0;
      find first index point in String array that matches query[queryCounter]
        using that as the start point, iterate through the String array for matches

Lorsque l'itération est terminée, un objet Rank est créé pour contenir la chanson, la phrase recherche, points de départ de point et de fin de la section de tableau qui correspond. Dans l'objet Rank est une méthode pour compter le nombre de caractères et de compenser les espaces pour calculer le rang. Il est ensuite inséré dans un PriorityQueue, où les matchs de top dix seront tirés du matchSet d'origine.

Le problème est que cela ne l'empêche pas de faux positifs, et les rangs de match peut obtenir biaisé. Par exemple, Aerosmith Beyond Belle contient « ... elle me aime, elle ne vous aime pas ... » Avec mon processus, je correspondre » ... Elle aime moi qu'elle aime pas ... ", donc au lieu d'un rang de 13 ans, je vais obtenir un rang de 27 ans.

Quels changements sont nécessaires pour moi d'éliminer les faux positifs et les classements incorrects?

Était-ce utile?

La solution

Je voudrais ajouter à ce que jjinguy dit:

  

En fait, dans le « autrement » bloc, après avoir trouvé le premier index qui correspond au début, vous devez également rechercher d'éventuels autres points de départ et réinitialiser votre départ si vous trouvez un autre

je garderais une liste de toutes les correspondances possibles dans une chanson, et enfin utiliser celui qui a le meilleur classement. remise à zéro tout simplement le point de départ pourrait ne pas prendre le match avec le meilleur classement.

Peut-être est pas la meilleure façon, mais le souci est toujours là.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top