Migliore struttura dati per rappresentare forme verbali inglesi

2

Ho bisogno di trovare una struttura dati per conservare informazioni sui moduli verbali inglesi. Nella maggior parte dei casi un verbo può essere in una delle 4 forme: base, participio presente, participio passato e semplice passato, ad esempio:

  • prendere
  • prendendo
  • presa
  • ha

È apparentemente facile definire 4 tipi per ogni modulo e finire con esso. Tuttavia ci sono alcune eccezioni che rovinano questa semplice idea.

  1. Presenta un singolo modulo di terza persona, che nel nostro esempio sarebbe "accetta".
  2. Il verbo copulare "essere" ha più forme irregolari nel tempo presente: "sono", "è", "sono" e "era" e "erano" al tempo passato
  3. Verbi come "può" che non si flettono nell'attuale modulo di terza persona: "lei può".

Quale struttura dei dati sarebbe efficiente, accurata ma non ambigua per la rappresentazione di tali informazioni (con casi eccezionali) dato che i seguenti requisiti devono essere soddisfatti:

  • per una forma arbitraria rispondi alla domanda su quali coniugazioni il modulo rappresenta
  • per una coniugazione arbitraria e una forma risponde alla domanda se la forma rappresenta o meno la coniugazione data?
posta bonomo 21.07.2013 - 22:12
fonte

4 risposte

2

Devi considerare gli usi a cui verranno messi i tuoi dati. Ad esempio, se si desidera effettuare un'analisi semantica profonda in tempo reale dei testi in inglese o se si sta tentando di eseguire la traduzione automatica di testi linguistici, si vorrà probabilmente avere una voce per ogni forma coniugata che un verbo può contenere nella lingua ( s) di interesse.

Puoi considerare la forma infinita di un verbo come la forma base e la forma base dovrebbe avere collegamenti a tutte le forme varianti, quindi dall'infinito puoi enumerare e accedere a tutti gli usi grammaticali associati al verbo. Allo stesso modo, le forme varianti dovrebbero ricollegarsi alla forma infinita.

Le strutture dati di questo tipo ridurranno al minimo il carico di calcolo necessario per identificare i possibili usi grammaticali di ogni modulo verbale che puoi incontrare nel testo in linguaggio naturale.

    
risposta data 22.07.2013 - 19:09
fonte
1

Una mappa / associazione di serie / enumerazioni?

Ogni chiave è la forma del verbo. Base / infinito può essere un caso speciale, al di fuori della mappa. Ogni valore è un insieme di ciò che rappresenta le coniugazioni.

  • for an arbitrary form answer the question what conjugations the form represents.

Questa è una ricerca della chiave, restituisce l'insieme di coniugazioni.

  • for an arbitrary conjugation and a form answer the question whether the form represents the given conjugation or not?

Questa è la stessa ricerca e una ricerca della coniugazione nel set risultante.

What data structure would be efficient, accurate yet unambiguous [...]

Efficiente nel tempo o nello spazio? A seconda dell'implementazione, una mappa / hash / assoc e la ricerca set possono essere molto efficaci.

Per lo spazio, ci sarà un sovraccarico su ogni voce, e la ridondanza nella memorizzazione di stringhe simili può essere ulteriormente eliminata (qualcosa come corde, forse).

Precisione Sì.

Unambiguous L'ambiguità può sorgere solo quando si introducono dati.

Questa sembra la cosa semplice da fare, ma non sarà altrettanto efficace in altri casi d'uso, come ad esempio: - rispondere a quale forma un verbo assume una particolare coniugazione (è una ricerca su possibilmente tutte le chiavi e gli elementi dell'insieme) - rispondere a tutti i moduli per un particolare momento O persona, ignorando l'altro (t

    
risposta data 03.02.2016 - 23:07
fonte
0

Nel caso in cui ci siano molte eccezioni alle regole di come i tuoi dati possono essere organizzati, dovrai metterli in relazione in modo leggero e superficiale. In questo caso, puoi utilizzare un sistema "tag".

I tuoi oggetti potrebbero memorizzare due cose: il modulo di base (come una stringa), così come una mappa di "tag". Questa mappa avrebbe un valore enum come chiave e una stringa di parole come valore. L'enumerazione elencerebbe tutti i tipi di moduli che sono possibili.

Usando questo metodo, è necessario che il tuo oggetto abbia un modulo base, ma può quindi avere 0 o 1 di ciascuno degli altri tipi di moduli. Se non ha un determinato modulo associato, semplicemente non lo includi, e sarebbe l'equivalente della tua lingua di null .

    
risposta data 21.07.2013 - 22:59
fonte
0

È possibile modellare i moduli di base e quindi aggiungere un numero qualsiasi di eccezioni codificando la coniugazione (un'enumerazione) e il modulo (una stringa).

per es.

typedef struct {
    verb_t *verb;
    char    *base;
    char    *pres_part;
    char    *past_part;
    char    *past_simple;
    EXCEPT  **exception; // NULL-terminated
}

e l'eccezione sarebbe

typedef struct tag_exception {
    conj_t  conjugation;           // Enum: CONJ_3S for third person singular
    char    *form;                 // "is"
}

Quindi dovresti modellare alcune "regole" per gli altri casi. Ad esempio, diciamo che la nostra "regola" è che la terza persona singolare è fatta aggiungendo un -s. Quindi non con un'eccezione per take, 3S significa che è takes . Un verbo come be avrebbe un'eccezione, is .

Per rispondere alla prima domanda, si scansionano i moduli di base, si analizzano le eventuali eccezioni e si generano i moduli di "regola" rimanenti.

Per rispondere alla seconda domanda, in pratica fai lo stesso, tranne che controlli se l'ID del modulo corrisponde.

    
risposta data 21.07.2013 - 23:01
fonte

Leggi altre domande sui tag