ahmetaa / zemberek-nlp

NLP tools for Turkish.
Other
1.14k stars 208 forks source link

Normalizer'daki farklılık (0.16.0 'dan 0.17.1'e geçiş testlerinde) #233

Open KadirCanTac opened 4 years ago

KadirCanTac commented 4 years ago

Merhaba, Öncelikle çalışmalarınızdan dolayı sizi takdir eder ve başarılarınızın devamını dilerim. Zemberek-full.jar dosyasını 0.16.0 'dan 0.17.1'e geçiş testlerini yapmaktayım. "alndığından" kelimesinin normalizer işlemin tabi tuttuğumda;

0.16.0 versiyonunda; "alndığından" => "aldığından"

0.17.1 versiyonunda; "alndığından" => "alndiğından"

şeklinde çıktı vermektedir. Bu işlemden sonra kök bulmak için lemma methodu kullanıldığında sonuçlar çok daha farklı oluyor tabi; "aldığından" => al "alndiğından" => alndiğından

(müşteriden bilgiler alındığından... şeklinde devam eden bir cümle fakat alındığından kelimesinin 3. harfı olan "ı" eksik yazılmış)

Normalization bloğunda yapılan kodsal değişikliklerinizi yeniden değerlendirme imkanınız olabilir mi ? iyi çalışmalar.

ahmetaa commented 4 years ago

Bu bir hataya isaret ediyor muhtemelen. Inceleyecegim uygun zamanda

KadirCanTac commented 4 years ago

ilginiz için teşekkür ederim. iyi çalışmalar.

ahmetaa commented 4 years ago

Bu problem TurkishSentenceNormalizer icerisindeki probablyRequiresDeasciifier metodundan kaynaklaniyor. Orada bir heuristic ile bir cumlenin deasciifiere ihtiyaci olup olmadigina bakiliyor. Ancak oradaki yaklasim kisa cumlelerde hatali bir karar verebiliyor. Deasciifier algoritmasi da yeterince iyi olmadigi icin ozellikle hatali kelimelerde yanlis sonuc cikarabiliyor.

Asagidaki metod uzerinde biraz iyilestirme yaparak bu tur durumlar duzeltilebilir dusuncesindeyim. Belki karar icin <0.05 gibi bir sey denilebilir.

  /**
   * Makes a guess if input sentence requires deasciifier.
   */
  static boolean probablyRequiresDeasciifier(String sentence) {
    int turkishSpecCount = 0;
    for (int i = 0; i < sentence.length(); i++) {
      char c = sentence.charAt(i);
      if (c == 'ı' || c == 'I') {
        continue;
      }
      if (TurkishAlphabet.INSTANCE.isTurkishSpecific(c)) {
        turkishSpecCount++;
      }
    }
    double ratio = turkishSpecCount * 1d / sentence.length();
    return ratio < 0.1;
  }
mdakin commented 4 years ago

deasciifier ciktisini morfolojik olarak analiz edip eger hataliysa iptal etmek makul bir yaklasim mi?

ahmetaa commented 4 years ago

@mdakin bana makul geldi bu. ozel isimlerde ve hatali yazilmis kelimelerde bazi sorunlar olusturabilir gerci.

mdakin commented 4 years ago

Genel olarak daha iyi sonuc verecegini dusunuyorum. Hatali yazilmis kelimeyi hatali yazmis baska bir kelimeye donusturmusse zaten buyuk bir kayip olmaz, sadece onceki haline geri donmus olur.