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.