Estrai la stringa canonica da un elenco di stringhe rumorose


10

Ho migliaia di elenchi di stringhe e ogni elenco ha circa 10 stringhe. La maggior parte delle stringhe in un determinato elenco sono molto simili, anche se alcune stringhe (raramente) sono completamente estranee alle altre e alcune stringhe contengono parole irrilevanti. Possono essere considerate variazioni rumorose di una stringa canonica. Sto cercando un algoritmo o una libreria che convertirà ogni elenco in questa stringa canonica.

Ecco una di queste liste.

  • Star Wars: Episodio IV Una nuova speranza | StarWars.com
  • Star Wars Episodio IV - A New Hope (1977)
  • Star Wars: Episodio IV - Una nuova speranza - Rotten Tomatoes
  • Guarda Star Wars: Episode IV - A New Hope Online Gratis
  • Star Wars (1977) - Greatest Films
  • [REC] 4 poster promettono la morte per motore fuoribordo - SciFiNow

Per questo elenco, qualsiasi stringa corrispondente all'espressione regolare ^Star Wars:? Episode IV (- )?A New Hope$sarebbe accettabile.

Ho seguito il corso di Andrew Ng sull'apprendimento automatico su Coursera, ma non sono riuscito a trovare un problema simile.


2
PS Penso che il termine che stai cercando sia "canonico"
Sean Owen il

La stringa "più probabile" / "più consensuale" che stai cercando di identificare una espressione regolare? O una delle stringhe nell'elenco?
MrMeritology il

@MrMeritology Non sto cercando un'espressione regolare. Ho mostrato un'espressione regolare nella mia domanda solo per illustrare quanto sono flessibile nel tipo di stringhe che considererei corrette.
lattone,

OK. Quindi la risposta che ho dato di seguito dovrebbe funzionare per te.
MrMeritology il

Questo rientrerebbe nel NER (denominato riconoscimento entità)?
hippietrail,

Risposte:


4

Come soluzione ingenua, suggerirei innanzitutto di selezionare le stringhe che contengono i token più frequenti all'interno dell'elenco. In questo modo è possibile eliminare la stringa irrilevante.

Nella seconda frase voterei a maggioranza. Supponendo le 3 frasi:

  • Star Wars: Episodio IV Una nuova speranza | StarWars.com
  • Star Wars Episodio IV - A New Hope (1977)
  • Star Wars: Episodio IV - Una nuova speranza - Rotten Tomatoes

Vorrei passare attraverso i token uno per uno. Iniziamo con "Star". Vince poiché tutta la stringa inizia con essa. Anche "Wars" vincerà. Il prossimo è ":". Vincerà anche.

Tutti i token continueranno a votare a maggioranza fino a "Speranza". Il prossimo token dopo "Speranza" sarà "|" o "(" o "-". Nessuno dei due vincerà con il voto a maggioranza, quindi mi fermerò qui!

Un'altra soluzione sarebbe probabilmente quella di utilizzare la sottosequenza comune più lunga .

Come ho già detto, non ci ho pensato molto. Quindi potrebbero esserci soluzioni molto migliori al tuo problema :-)


3

Calcola innanzitutto la distanza di modifica tra tutte le coppie di stringhe. Vedi http://en.wikipedia.org/wiki/Edit_distance e http://web.stanford.edu/class/cs124/lec/med.pdf . Quindi escludere eventuali stringhe anomale in base a una certa soglia di distanza.

Con le stringhe rimanenti, è possibile utilizzare la matrice della distanza per identificare la stringa più centrale. A seconda del metodo utilizzato, è possibile ottenere risultati ambigui per alcuni dati. Nessun metodo è perfetto per tutte le possibilità. Per i tuoi scopi, tutto ciò di cui hai bisogno sono alcune regole euristiche per risolvere le ambiguità, ovvero scegliere due o più candidati.

Forse non vuoi scegliere "più centrale" dal tuo elenco di stringhe, ma invece vuoi generare un'espressione regolare che catturi lo schema comune a tutte le stringhe non anomale. Un modo per farlo è quello di sintetizzare una stringa equidistante da tutte le stringhe non anomale. È possibile calcolare la distanza di modifica richiesta dalla matrice e quindi generare casualmente regolari utilizzando tali distanze come vincoli. Quindi verifichi le espressioni regolari candidate e accetti la prima che si adatta ai vincoli e accetta anche tutte le stringhe nell'elenco non anomalo. (Inizia a creare espressioni regolari dagli elenchi di sottostringhe comuni più lunghi, poiché si tratta di caratteri non jolly.)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.