2016-05-26 17 views
5

Dikkat!Lehçe veya güçlü bir fleksiyonla, örneğin bir vaka sistemi ile (örneğin Alman gibi) başka bir doğal dil öğrenmek çok yardımcı olacaktır, bu soruya cevap vermek için. Özellikle, Polonya declension sistemi gibi diğer Slav dillerinin sistemlerine çok benzer: vb, Çekçe, Rusça SırpçaLehçe/Slav dilleri isimlerinin çözülmesi için bir algoritma

bu Lehçe, bitmemiş, declinator göz at: Diğer kadar uzatmak planlıyorum declinators.com diller, yani Rusça ve Latince, ama şimdilik Polonyalı ile mücadele ediyorum.

Yüzlerce isim için büyük bir sapma veri tabanına sahip olmanın yanı sıra, var olmayan azalan isimleri destekliyorum. Şimdiye kadar ortaya koyduğum en iyi çözüm, isimlerin sonlarını kontrol etmektir, böylece isimler buna göre reddedilebilir.

Kodumda bu calculateDeclination yöntemine geliyor. Eğer isim veritabanında değilse, buna derim. Yöntemin bağırsakları şuna benzer: vb

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); 

Bunlar, bu yöntem vardır else if hükümlerin onlarca ilk üç içindir. Polonyalı kelimeleri reddetmek için başka, daha şık bir algoritma var, Yani burada

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"; 
    } 
} 

soru şudur:

örnek bir declinator bir kod şöyle? Başka maddeleri var mı? Her bir isim türü için çok fazla deknoz yazmalı mıyım?

Bu sorun bana ne kadar basit ve inanılmaz sayıda Polonyaca çekişme kuralları olduğunu gösterdi. Algoritmamı sıkıcı ve monoton hale getirdi. Umarım, biriniz bana ilginç ve özlü bir şekilde yardımcı olabilir!

Şerefe kendim bir yerli Polonyalı konuşmacı olmasına rağmen

+1

Tablo tabanlı yazılım bu tür bir şey için iyi çalışır. – user3386109

+1

Yakında Rusça için bir tane yayınlayacağım =) https://github.com/georgy7/russian_nouns/blob/gh-pages/js/RussianNouns.coffee Bir kelimenin tekil hali için neredeyse tamamlandı. –

cevap

1

, cevabım programınızda desenleri kod ilgilendirmeyen olacaktır. Diğerleri işaret ettiği gibi, tablolar gitmek için yoldur. Ancak, Komut şablonunu kullanarak uzun if/else bloklarını yeniden oluşturmayı deneyebilirsiniz. Bir diyagram için bkz. this page.