Determinare quanto è simile una determinata stringa a una raccolta di stringhe


10

Non sono sicuro che questa domanda appartenga qui e mi scuso in caso contrario. Quello che sto cercando di fare è sviluppare un modo programmatico in cui posso determinare probabilisticamente se una determinata stringa "appartiene" in un sacco di stringhe. Ad esempio, se ho una borsa con 10.000 nomi di città statunitensi e poi ho la stringa "Filadelfia", vorrei una misura quantitativa della probabilità che "Filadelfia" sia un nome di città statunitense basato sui nomi di città statunitensi che già conosco. Mentre so che non sarò in grado di separare i nomi di città reali da nomi di città false in questo contesto, almeno mi aspetterei di avere stringhe come "123.75" e "La volpe rossa veloce saltò sui pigri cani marroni" esclusi dato qualche soglia.

Per iniziare, ho esaminato Levenshtein Distance e ho esaminato un po 'come sono stati applicati problemi almeno in qualche modo simili a quello che sto cercando di risolvere. Un'applicazione interessante che ho trovato è stata la rilevazione del plagio, con un articolo che descrive come la distanza di Levenshtein è stata utilizzata con un algoritmo di Smith-Waterman modificato per classificare i documenti in base alla probabilità che fossero una versione plagarizzata di un determinato documento di base. La mia domanda è se qualcuno potrebbe indicarmi la giusta direzione con altri algoritmi o metodologie consolidati che potrebbero aiutarmi. Ho la sensazione che questo possa essere un problema che qualcuno in passato ha tentato di risolvere, ma finora il mio Google-fu mi ha fallito.


Se hai esempi positivi e negativi disponibili, puoi provare a formare un classificatore. Per quanto riguarda le funzionalità, per iniziare proverei ad estrarre alcune semplici statistiche come quelle suggerite da Yuval Filmus.
Nick,


I nomi delle città sembrano essere un cattivo esempio; sono ovunque, soprattutto negli Stati Uniti. Qui, la ricerca della tabella sembra essere il modo più efficace. Il tuo problema è più generale?
Raffaello

Risposte:


5

Alcune statistiche migliori a cui pensare sono la lunghezza delle parole e l' analisi -gram. Per la lunghezza delle parole, puoi raccogliere statistiche sulla distribuzione della lunghezza delle parole dei nomi delle città e confrontarle con la lunghezza di ciò che ottieni. L'analisi -gram esamina la distribuzione di sequenze di lettere nel testo di esempio (ad esempio ). Entrambi gli approcci possono essere combinati.nnnn=2

Data l'euristica, è possibile utilizzare la probabilità per ottenere un punteggio che (si spera) sarebbe più alto per i dati del campione rispetto ad altri testi. Per determinare una soglia ragionevole, è possibile eseguire la convalida incrociata. Scegli una serie di frasi di esempio che non sono nomi di città. Dividi i nomi delle città in due parti, una grande (diciamo 80%) e una piccola (diciamo 20%). Allena il tuo modello sulla parte grande (ovvero raccogli le statistiche sulla parte grande), quindi valuta il modello sulla parte piccola e sul campione di frasi sbagliate. Determina se esiste una soglia ragionevole che supera la maggior parte dei nomi di città, ma solo una piccola quantità di frasi sbagliate.


Grazie. Avevo iniziato a cercare n-gram ma non sapevo se fossi totalmente fuori base, quindi sono contento che tu l'abbia menzionato. Anche la lunghezza delle parole sembra interessante e qualcosa a cui non avevo pensato.
Andrew,

Potresti voler aggiungere la frequenza dei caratteri a questo. In particolare, ciò dovrebbe sbarazzarsi di tutte le cose numerose. Un vantaggio è che tali frequenze sono vettori di numeri che possono essere addestrati / riconosciuti in una serie di modelli statistici.
Raffaello

1
@Raphael, la frequenza dei caratteri è la stessa dell'analisi -gram, e in generale l' analisi -gram è più fine dell'analisi -gram. n + 1 n1n+1n
Yuval Filmus,
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.