Come creare un'implementazione efficiente di un dizionario di sinonimi?

2

Come faccio a creare un dizionario di sinonimi che sia efficiente in termini di recupero dei sinonimi di una parola?

In sostanza, voglio utilizzare alcuni tipi di archiviazione dei dati per archiviare gruppi di parole e consentire a un utente finale di richiedere qualsiasi parola e ricevere tutte le altre parole del suo gruppo (i suoi sinonimi). Successivamente, voglio essere in grado di aggiungere correzioni ortografiche, suggerimenti e classifica di pertinenza (utilizzando la distanza di modifica, ad esempio).

Inoltre, alcuni gruppi potrebbero contenere la stessa parola, quindi vorrei restituire entrambi i gruppi separatamente.

Qualche idea su come arrivarci? Qualsiasi particolare database, strutture dati, concetti, ecc. Che potrebbero aiutare?

    
posta confused00 29.06.2016 - 22:32
fonte

2 risposte

1

La tua idea di gruppo sembra buona a prima vista, ma in realtà è un eccesso di complessità. Immagina di essere in un DB relazionale, di avere gruppi e parole in una relazione N / N. Ciò significa che per recuperare un sinonimo è necessario recuperare i collegamenti dei suoi gruppi, quindi estrarre i gruppi collegati, quindi estrarre tutti i collegamenti dei gruppi da tutti i gruppi, quindi ottenere l'elenco di parole, per una dozzina di record finali. A meno che avere gruppi separati sia una caratteristica necessaria, preferirei mantenere le cose semplici: parole e collegamenti.

Alcuni database sono migliori di altri a rappresentarlo. Dato che hai un ampio set di dati con molte relazioni ma non molta struttura, è probabilmente consigliabile cercare un database NoSQL che supporti elenchi di qualche tipo - che ti consentirebbe di recuperare i sinonimi più velocemente perché eviterai un join doloroso su un enorme tabella di link (scelta di implementazione raggruppata o meno).

Per il resto, non vedo alcun consiglio che non sia basato sull'opinione, quindi dipende da te dal momento che non vedo alcun motivo particolare per seguire un particolare schema o tecnologia.

    
risposta data 29.06.2016 - 23:52
fonte
0

Prime idee

La struttura di base è una semplice tabella di ricerca {word, synonym} . Fino a te decidere se si tratta di una relazione bidirezionale (meno dati nel tuo dizionario) o meno (più accurata).

Tuttavia, questo spesso non è sufficiente, poiché i sinonimi adatti dipendono dal contesto: un sinonimo di "particella" potrebbe essere "polvere" in un linguaggio comune, ma "elettrone" o "protone" in un contesto scientifico. Quindi la struttura di base potrebbe essere migliorata a {word, synonym, context-key-word}

Il problema qui è che dovresti inserire dei sinonimi per ogni possibile forma di una parola (ad esempio {"particle", "dust"},{"particles","dust"},{"particle","electron"},{"particles","electrons"} )

Proprietà linguistiche di una parola

prendi un verbo come {"buy", "purchase"}. Un verbo può avere diverse forme (acquisto, acquisto, acquisto): così gestirai separatamente il sinonimo per ogni modulo o li raggrupperai? Lo stesso per sostantivi e aggettivi (singolare, plurale). Solo le preposizioni e gli avverbi hanno una singola forma.

Quindi potresti optare per una doppia struttura, con da un lato le diverse parole, raggruppate secondo una forma primaria e le sue variazioni grammaticali, e dall'altra i sinonimi per la forma primaria.

Dizionario di tutti i token di lingua:

{ infinitive_verb, past_simple, past participle }
{ singular_noun, plural_noun} 
{ singular_adjective, plural_adjective }
{ preposition } 
{ adverb } 

Sinonimi:

{ type_of_token, primary_form, primary_form_of_synonym, context } 

Quindi nel contesto "scienza", i sinonimi di "elettroni" dovrebbero prima passare attraverso il dizionario dei token di lingua e trovare il nome {"electron","electrons"} di corrispondenza per il plurale. Quindi cerca il sinonimo e trova {"electron","particle","science"} e {"electron","dust","-"} e sceglie il primo. Ma dato che è un plurale, cercherebbe di {"particle", "particles"} e creerà "particelle".

Fino a te per vedere se l'analisi contestuale potrebbe essere un vantaggio, o se ti piacerebbe mostrare tutti i sinonimi e solo menzionare il contesto speciale speciale se ce ne sono alcuni.

E devi gestire l'ambiguità: potresti trovare nomi e verbi con lo stesso modulo, per esempio.

Il database

Potresti usare molto bene un DB relazionale tradizionale. Il dizionario può essere memorizzato in più tabelle (ciascuna con la struttura appropriata) e i sinonimi in un'unica tabella. Vantaggio: è possibile cercare su qualsiasi colonna in modo molto efficiente.

Un altro approccio potrebbe utilizzare una base NoSQL . Se fosse utilizzato un DB di documenti, è possibile memorizzare i dati quasi come descritto sopra. Se si opta per un archivio di valori chiave, è necessario suddividere la parte del dizionario in coppie. In definitiva, memorizzando più dati. La forma più semplice da gestire sarebbe certamente un DB grafico, in cui è possibile navigare tra le relazioni tra le parole

Altri pensieri

Se guardi i verbi, la maggior parte dei verbi ha un radicale, al quale potresti aggiungere "ing" o "ed" per trovare le altre forme. Solo poche centinaia di persone hanno bisogno delle forme alternative complete in quanto non sono prevedibili (dal punto di vista del database).

Ovviamente potresti approfittare di tali regole per ridurre considerevolmente la dimensione del tuo database. Ma renderebbe anche il processo di ricerca più complesso come si farebbe per preprocessare le parole (ad esempio "parcheggio") per vedere se corrispondono ad alcune regole (es. "-Ing") e in quale parte del dizionario si dovrebbe guardare (ad es. verbo regolare "park"? e sostantivo "parking").

    
risposta data 30.06.2016 - 00:44
fonte