Esistono algoritmi per dividere o combinare le parole nella loro forma più comune?

5

Esistono algoritmi esistenti che possono esaminare un elenco di parole e dividere o combinare le parole nella loro forma più comune?

Ad esempio, ho un elenco di molti nomi commerciali nel settore sanitario. La parola " healthcare " è spesso scritta " health care ". Esistono anche nomi commerciali che possono essere suddivisi o combinati, ad esempio " Walmart " e " Wal mart ".

Ci sono degli algoritmi che possono guardare la mia lista di parole e identificare che " healthcare " è più spesso scritto come due parole, e che " Wal mart " è più spesso scritto come una singola parola?

Sto cercando i nomi degli algoritmi esistenti (che possono essere utili durante la ricerca sul Web) o i link a white paper o post del blog esistenti.

Preferirei un algoritmo che non dipenda da un dizionario o da un altro elenco esterno di parole o nomi di aziende.

modifiche:

Sfondo:

Ho già un codice moderatamente riuscito in questa attività. Il codice è stato gettato insieme senza molto rigore. Speravo che esistessero alcuni algoritmi consolidati, che sarebbero probabilmente più accademici e completi di quello che ho scoperto. Questa domanda non riguarda il metodo che ho imparato, ma dire "è impossibile" non mi convince.

Chiarimento:

La "forma più comune" di una parola è il modo in cui le parole vengono scritte più spesso. Ad esempio, " Walmart " è apparso molte volte e " Wal mart " è apparso molte volte, ma " Walmart " è apparso più spesso di " Wal mart " e quindi " Walmart " è la "forma più comune" "della parola.

Non mi aspetto che questo algoritmo produca risultati perfetti. Come ogni problema di apprendimento automatico, mi aspetto che i risultati dipenderanno dalla qualità dei dati che fornisco e dalla quantità di dati che dispongo.

    
posta Buttons840 20.03.2014 - 00:01
fonte

6 risposte

8

In generale, penso che tu stia cercando la normalizzazione linguistica e gli algoritmi applicabili alla tua descrizione del problema sono gli algoritmi che risolvono il problema di polisemia e collocazioni in particolare.

The word "healthcare" is often written "health care" ...

La definizione accettata per le collocazioni è una combinazione di parole adiacenti che hanno un significato comune. L'iperonimo di "assistenza sanitaria" e "assistenza sanitaria" è assicurazione sociale per malati e feriti , questo è per coincidenza è anche un hypernym correlato per "medicare" (anche se non sono esattamente gli stessi, ma presumo che tu sia interessato a nomi di attività che potrebbero menzionare tutto quanto sopra).

Il WordNet database lessicale è uno dei più grandi e puoi usare il suo search strutture per esplorare le collocazioni e gli iperogni.

Gli iperimiti, le collocazioni e le relazioni semantiche sono tipicamente aggregati in un database, e non sono convinto che,

... an algorithm that doesn't depend on a dictionary or other external list of words or business names.

è un approccio praticabile. Nel migliore dei casi dovresti essenzialmente ignorare le spalle dei giganti e ricostruire lentamente ciò che è già disponibile nei database lessicali e nei dizionari di collocazione esistenti mentre i tuoi algoritmi accumulano e memorizzano l'interpretazione delle collocazioni che incontri nelle tue attività.

Ecco alcune risorse e link aggiuntivi,

Per individuare i documenti e gli algoritmi di ricerca necessari, suggerisco di utilizzare semplicemente citeseer con collocazioni come termine principale, è piuttosto unico per l'elaborazione del linguaggio naturale. Tuttavia, non sono sicuro che, come ho detto sopra, sarai in grado di trovare un algoritmo online che non si basa su dizionari o corpora di apprendimento preesistenti per il tuo compito.

    
risposta data 26.04.2014 - 05:08
fonte
3

Un modo per risolverlo è utilizzare la Algoritmo di modifica della distanza di Levenshtein .

Fondamentalmente si prende qualsiasi stringa inserita e poi si calcola il valore del LED di ogni parola o frase che inizia con la stessa lettera nel corpus (dizionario). Quello con il valore più basso è la forma "corretta" della parola o frase. È raro che qualcuno scriva male la prima lettera di una parola, quindi questo approccio funziona piuttosto bene se hai un corpus decente su cui lavorare. Ci sono altri algoritmi correlati che potrebbero funzionare leggermente meglio o peggio a seconda di ciò che stai abbinando, ma ho usato LED per ricerche di stringhe fuzzy per molti anni, e sono sempre stato abbastanza impressionato da quanto bene funzioni. Non ho seguito abbastanza i dati di input, quindi potrebbe non funzionare se non disponi di limiti di parole affidabili, anche se potresti essere in grado di modificare un LED un po 'per farlo funzionare anche senza i confini di una buona parola (forse un passaggio che tratti tutti i confini delle parole esistenti come se fossero affidabili, e poi un altro passaggio con una finestra scorrevole di due "parole" alla volta. Se si ottiene un LED inferiore sulla combinazione di quanto si ottiene per la somma di le due parole, quindi usa la combinazione o qualcosa del genere.

In ogni caso, è un puzzle interessante. Sospetto che qualunque cosa tu abbia inventato userà probabilmente qualche variante di LED.

    
risposta data 27.04.2014 - 06:11
fonte
2

Una rapida ricerca di "parole composte comuni" ha rivelato alcuni siti come questo:

link

Il problema qui è che non tutte le parole composte ("notall"?) sono legali. Quindi, almeno, un controllo di validazione richiederebbe una ricerca di ciascuno dei pezzi contro un dizionario (facile), una ricerca della parola composta contro un dizionario (facile), e una ricerca contro il tuo elenco di parole composte convalidate (facile). Il pezzo mancante è una mappatura confermata tra le parole composte legali e le sue parti.

Per dividere:

  • cerca il lavoro nell'elenco delle parole composte, quindi esegui l'iterazione su ogni possibile suddivisione & cerca ogni pezzo in un dizionario: ("n otall", "no otall", "not all", ...) per determinare la divisione.

Per partecipare:

  • solo concantenare & quindi cerca un dizionario & nell'elenco delle parole giuridiche.

A lungo termine, potresti finire per usare una sorta di catena di Markov & Probabilità bayesiana per determinare la probabilità di una suddivisione appropriata, e lentamente nel tempo aggiungere all'elenco "comune" di parole con quelle che consideri legali.

O più semplicemente, ogni volta che vedi una parola che si divide in modo pulito in due parole nel dizionario, aggiungi una voce di mappatura tra la parola e quei pezzi. Ci sarà spesso più di una parola. Dopodiché, ogni volta che vedi di nuovo quella parola composta, dai a ciascuna delle sue mappature un voto "si". Ogni volta che vedi i pezzi separatamente, aggiungi un voto "no" a quella mappatura. Nel corso del tempo, creerai un elenco di mappature con un senso di probabilità che appaia in uso.

Non so quanto sarà grande quella lista; in inglese, dubito che diventerebbe davvero così grande. E dovresti solo creare una mappatura da composto a divisione legale una volta.

...

Se disponevi di una mappatura tra composto e divisione e valori portati per "conteggio composto" e "conteggio parziale" per ogni elemento di mappatura, allora la probabilità che l'uso composto sia prevalente è solo compound_usage / sum(compound_usage + split_usage) . Si potrebbe sfruttare questo modo probabilistico generando un casuale uniforme, e se inferiore a tale probabilità, stampare il composto, altrimenti stampare la versione divisa. Oppure puoi semplicemente impostare una soglia (ad esempio 80%) e utilizzare un livellamento bayesiano per tenere conto degli elementi a bassa frequenza.

In fin dei conti, non c'è nulla nel linguaggio che determina se un composto è "corretto" - è convenzione e uso. Probabilmente varia anche a livello regionale. Quindi in un modo o nell'altro dovrai usare una sorta di processo di stima del campionamento / probabilità per costruire un dizionario di parole composte.

(In realtà sembra un progetto divertente, potrei giocarci.)

...

Poiché la creazione della mappatura sarebbe un compito unico per ogni parola composta, un'altra alternativa sarebbe quella di coltivare la verifica dei composti & si divide in Mechanical Turk: link In definitiva, potrebbe essere più facile che provare ad allenare e mettere a punto un algoritmo ML più elaborato che deve solo essere eseguito una volta per ogni combinazione possibile.

    
risposta data 26.04.2014 - 01:02
fonte
0

Non che io sia un esperto, ma potresti usare un corpora come google e usare solo le statistiche delle parole che si trovano in Internet.

Ad esempio, se ci sono 100K occorrenze di Wallmart nel WWW e solo 10K "wall mart", sapresti che probabilmente è meglio usare il primo.

    
risposta data 26.04.2014 - 19:17
fonte
0

Ciò che David Everlöf ha detto nel commento in realtà non è un cattivo suggerimento. Più in generale, se la tua applicazione ha accesso a Internet, potrebbe essere una buona idea vedere se puoi farlo consultare le risorse online.

Per restare con google, non è difficile inviare una richiesta http che esegua una ricerca su google sulla parola che stai esaminando. Quindi estrai la parte del suggerimento ("intendevi: Wallmart?") Dal documento html che viene restituito (se esistente) e correggi la tua parola sulla base di quel suggerimento.

    
risposta data 26.04.2014 - 19:48
fonte
0

Puoi sempre dire se due parole sono schiacciate insieme perché ci saranno due consonanti l'una accanto all'altra che non fanno parte di una diapositiva e non sono la stessa cosa. Le diapositive sono combinazioni di consonanti come st, dr e th. Se ci sono tre consonanti o più, sai che sono due parole combinate. Le due parole possono essere divise tra la diapositiva e la consonante o le due diapositive se vi sono quattro consonanti. Se ci sono due consonanti, è una diapositiva, due delle stesse lettere, come ll, o parole combinate. Dividerlo in due parole sarebbe quindi banale.

    
risposta data 28.04.2014 - 06:48
fonte

Leggi altre domande sui tag