2016-05-26 9 views
5

Attenzione !! Aiuterà molto a conoscere polacco o qualsiasi altro linguaggio naturale con una forte flessione, preferibilmente con un sistema di casi (come il tedesco per esempio), per rispondere a questa domanda. In particolare, il sistema di declinazione polacco è molto simile ai sistemi di altre lingue slave, come: russo, ceco, serbo eccUn algoritmo per la declinazione di nomi di lingue polacche/slave

Date un'occhiata a questo polacca, non finito, declinator: declinators.com sto progettando di estenderlo ad altri lingue, vale a dire il russo e il latino, ma per ora sto lottando con il polacco.

Oltre ad avere un ampio database di declinazioni per centinaia di nomi, sostengo nomi declinanti che non esistono. La soluzione migliore che ho trovato finora è semplicemente controllare le desinenze dei nomi in modo che possano essere declinati di conseguenza.

Nel mio codice si tratta di questo metodo calculateDeclination. Lo chiamo se il nome non è nel database. Le interiora del metodo simile a questa:

if (areLast2Letters(word, "il")) 
     declinator = new KamilDeclinator(word); 
else if (areLast2Letters(word, "sk")) 
     declinator = new DyskDeclinator(word); 
else if (isLastLetter(word, 'm')) 
     declinator = new RealizmDeclinator(word); 

ecc Questi sono solo i primi tre delle decine di else if clausole questo metodo ha.

Un codice di un declinator esemplare si presenta in questo modo:

import static declining.utils.StringUtils.*; 

public class RealizmDeclinator extends realizm_XuXowiX_XemXieXieDeclinator{ 

    public RealizmDeclinator(String noun) { 
     super(noun); 
    } 

    @Override 
    protected String calculateStem() { 
     return word; 
    } 

    @Override 
    public String calculateLocative() { 
     return swap2ndFromEnd(stem, "ź") + "ie"; 
    } 

    @Override 
    public String calculateVocative() { 
     return swap2ndFromEnd(stem, "ź") + "ie"; 
    } 
} 

Così qui è la domanda, c'è qualche altro, l'algoritmo più elegante per declinare parole polacchi? Deve avere così tante altre clausole? Devo scrivere così tanti declinatori per ogni tipo di nome?

Questo problema mi ha mostrato quanto siano semplici e incredibilmente numerose le regole di declino polacchi. Ha reso il mio algoritmo noioso e monotono. Spero che uno di voi possa aiutarmi a renderlo interessante e conciso!

Acclamazioni

+1

Il software basato su tabella funziona bene per questo genere di cose. – user3386109

+1

Ne rilascerò uno per il russo a breve =) https://github.com/georgy7/russian_nouns/blob/gh-pages/js/RussianNouns.coffee È quasi completo per la forma singolare di una parola. –

risposta

1

Mio malgrado essere un madrelingua polacca, la mia risposta sarà riguardare codificare modelli nel vostro programma. Come altri hanno sottolineato, i tavoli sono la strada da percorrere. Tuttavia, puoi provare a ritrattare i blocchi lunghi if/else utilizzando il modello Comando. Vedi this page per un diagramma.

Problemi correlati