Riconoscimento di parole in una stringa senza spazi o segni di punteggiatura

0

Ho un piccolo progetto C # che legge un file e mi dà un risultato: una stringa che non contiene spazi né alcun tipo di segni di punteggiatura. Può anche contenere alcuni errori ortografici.

Ex. Output:
THEQUICKBROWNFOXJUMPSOVERTHELAZYDOG

Mi chiedo se c'è un modo per analizzare questa stringa usando text mining / data mining e / o espressioni regolari per identificare le parole (preferibilmente nounds, verbi e così via.) nella stringa?

Voglio leggere un mucchio di file che mi danno diversi output e metterli in ordine statistico da quello con le parole più trovate a quello che contiene solo una stringa di mumbo jumbo.

Inoltre, se la stringa contiene errori ortografici come:
THEQUICGBROWNFOSJUMPSOVERTHHLAZYDOG
So che l'espressione regolare può calcolare "distanti" da una parola errata e trovare quella più corrispondente (utilizzando un corpus e una probabilità) ma potrebbe rivelarsi più difficile in quanto la stringa non ha spazi o segni di punteggiatura. Qualche idea su come posso risolvere questo?

    
posta RKrogh 16.04.2014 - 11:03
fonte

2 risposte

0

Grazie a amon sono riuscito a far funzionare l'algoritmo!

Usando questo qui codice un Trie è stato implementato e riempito con il dizionario inglese (in 23600 parole).

Iniziando a leggere da ogni indice nella stringa, alimentandolo con il char successivo e poi il successivo finché il trie non trova più nessuna soluzione possibile (parola errata o fine di una reale più l'inizio della successiva), giudicare questo risultato e aumentare l'indice di 1 parole può essere trovato e analizzato.
V
THEQUICKBROWNFOX ... Trova THE

_V
THEQUICKBROWNFOX ... Trova HE

__V
THEQUICKBROWNFOX ... trova l'EQ
e così via.
In questa sequenza è possibile controllare modificare la distanza di modifica tra le parole e trovare errori di ortografia. Tuttavia, a causa della mancanza di tempo, questo non è mai stato completamente implementato nel mio progetto.
Il mio progetto ha un approccio più avanzato a questo poiché è uno strumento di statistica per eseguire iterazioni in sette parti su un determinato set di testi, quindi sentitevi liberi di chiedere se avete domande più specifiche e risponderò al meglio delle mie capacità.
Grazie per tutto l'aiuto in questo!

    
risposta data 06.05.2014 - 12:56
fonte
3

Ecco l'approccio generale:

  1. Leggi un file di dizionario e organizza tutte le parole in una trie struttura dati. Molti sistemi Unix hanno tali file nella directory /usr/share/dict/ .

  2. Trova possibili corrispondenze di un prefisso del tuo input nel trie. Questo di solito produce più corrispondenze, ad esempio theologyisabout inizia con theology e the .

  3. Se rimuoviamo i prefissi corrispondenti, otteniamo una serie di possibili continuazioni, su cui ripetiamo il passaggio 2.

Finiremo quindi con un vasto albero di possibili interpretazioni.

Ci sono due problemi con questo:

  • ci sarà una quantità esponenziale di interpretazioni
  • potremmo perdere le interpretazioni a causa di una parola sconosciuta o di qualche forma grammaticale sconosciuta

Siamo in grado di risolvere entrambi questi problemi grazie alla corrispondenza fuzzy. Quando cerchiamo prefissi nel trie, permettiamo che le lettere siano mancanti, inserite o modificate. Tuttavia, ciascuna di queste aberrazioni aumenta la distanza di Levenshtein. Se un'interpretazione ha una distanza di Levenshtein troppo alta, possiamo potare quella interpretazione e concentrarci su altri rami. Puoi anche tenere i rami in una coda di priorità e investigare sempre i rami con la distanza di modifica corrente più bassa, che è più probabile che sia un'interpretazione ragionevole - non diversamente da Algoritmo di ricerca del percorso di Dijkstra .

Si noti che sequenze multiple di prefissi con diverse distanze di modifica potrebbero portare alla stessa stringa rimanente. Puoi quindi mantenere i tuoi progressi in una struttura dati che consente di condividere parti. Questa memorizzazione nella cache sarà probabilmente utile per le prestazioni. Se in effetti cerchi di implementare una variante dell'algoritmo di Dijkstra, una coda nota corrisponderebbe a un nodo visitato nel grafico.

La parte difficile è come eseguire effettivamente la corrispondenza fuzzy. Per esempio. puoi decidere su una densità di modifica massima di x modifiche per carattere ( 0 < = x < = 1 ), e interrompere un'interpretazione se è garantito che questa interpretazione avrà una densità più alta. Per una determinata stringa con lunghezza l possiamo quindi determinare un budget di modifica b = x · l . Questo budget è meno importante quando si abbinano i prefissi nel trie, ma questo trie è utile solo se ci sono meno modifiche rispetto ai caratteri nel prefisso. Un budget di modifica come b = floor (c / 2) con un prefisso di lunghezza c potrebbe essere ragionevole. Quante modifiche permetti non è solo una metrica per quanto i testi confusi permettano al tuo sistema di "capire", ma anche un'impostazione prestazionale: budget più piccoli vengono eseguiti più velocemente, poiché è necessario esaminare meno alternative.

    
risposta data 16.04.2014 - 11:58
fonte

Leggi altre domande sui tag