zemberek-nlp icon indicating copy to clipboard operation
zemberek-nlp copied to clipboard

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

Open KadirCanTac opened this issue 5 years ago • 6 comments

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.

KadirCanTac avatar Nov 11 '19 11:11 KadirCanTac

Bu bir hataya isaret ediyor muhtemelen. Inceleyecegim uygun zamanda

ahmetaa avatar Nov 11 '19 11:11 ahmetaa

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

KadirCanTac avatar Nov 12 '19 14:11 KadirCanTac

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

ahmetaa avatar Nov 13 '19 06:11 ahmetaa

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

mdakin avatar Nov 13 '19 16:11 mdakin

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

ahmetaa avatar Nov 19 '19 06:11 ahmetaa

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.

mdakin avatar Nov 19 '19 09:11 mdakin