Arapça kelimeleri aksanları / aksanları olmadan nasıl arayabilirim?


11

Arapça'da diğer bazı dillerde olduğu gibi, telaffuzu geliştirmek için aksan adı verilir. Tek bir kelime için kaç tane aksan yazılması gerektiğine dair bir sözleşme yoktur. Bazıları en azı (hangisini tercih ettiğimi) telaffuzu netleştirmek için yeterince kullanır, bazıları ise gereksiz ya da sadece estetik kaligrafik amaçlar için kullanır. Böylece, tek bir sözcükle neyin ve kaç aksanın ilişkilendirildiği konusunda geniş bir varyasyon vardır. Ben isearch-forward/backwardbasarak C-s/r, sorun diakritik olmadan arama mini-tampon içine yazdığımda ortaya çıkar, eğer diyakritik olsaydı, metinde aynı kelime ile eşleşmez, bu kelime potansiyel diakritik ile hiç tatmin edici yapma görevi yapar.

Arama / regexp aramasını aksanlardan habersiz yapmanın bir yolu var mı? Umarım , çok dosyalı lateks projelerinde bir kelime aramak için dümen mermisinde sıkça kullandığım regexp C-M-s/rve greparama yapabileceğim bir cevap olacaktır .

Güncelleme
Emacs'ın, tüm arama işlevlerindeki, istendiğinde bir önekle kapatılabilecek varsayılan bir davranış olarak adımı eşleştirmeden önce metindeki sıyırma adımını (aksanlardan / aksanlardan / isminden) gerçekleştirdiğini görmek güzel olurdu. hangi dilde olursa olsun. Tipik olarak, en iyi editörden (Emacs) bu işte başarısız olmasını beklemediğimde, sıradan metin işlerini gerçekleştirmek için nadiren gerekli olan bazı aksan veya aksanlardan dolayı.


1
İçindeki ucs-normalize-*işlevlere bakın lisp/international/ucs-normalize.el. Vaka katlama gibi, bunlar için önceden tanımlanmış bir arama katlaması yoktur, ancak en azından bir bölgeyi aramadan önce normalleştirebilirsiniz. İyi bir uygulama muhtemelen oldukça karmaşık bir iştir.
Ted Zlatanov


@Adı, Arapça'nın aksanlarla / aksanlarla harf kombinasyonları (26) çok daha fazla olasılığı var, bu yüzden Arapça için değil. Görünüşe göre dile özgü kütüphanelerin yerini tutamaz. Bunun yıllar önce Emacs'da değil, Microsoft Word'de uygulandığına inanamıyorum.
doktora

1
Arapça yaklaşık 80 aksan ve 26 harfe sahiptir, tüm kombinasyonları yapmak göz korkutucu bir iştir. Aksanlarının metnini, phpuygulandığı gibi şeritlemenin bir yolu olmalı : stackoverflow.com/a/25563250/1288722 - ayrıca şu şekilde de uygulanmıştır Javascript: stackoverflow.com/a/7193622/1288722
doktora

Düşünce: Bu php temizleme fonksiyonu ile dize çalıştırmak ve daha sonra benzer bir şey sonucu geçmek mümkün değil helm-swoopmi?
Sean Allred

Yanıtlar:


5

İşte bu cevaptaki (ve sonra uzatılan) karakterleri birleştirme listesine dayanan kaba bir başlangıç . (Bunu topluluk wiki'si olarak işaretleme - lütfen bunu düzenleyin ve geliştirin!)

(defconst arabic-diacritics '(#x064b #x064c #x064d #x064e #x064f #x0650 #x0651 #x0652 #x0653 #x0654 #x0655 #x0670)
  "Unicode codepoints for Arabic combining characters.")
(defconst arabic-diacritics-regexp (regexp-opt (mapcar #'string arabic-diacritics)))

(defconst arabic-equivalents
  '(
    ;; "alef" is equivalent to "alef with hamza above" etc
    (#x0627 #x0623 #x0625 #x0622)))

;; (require 'cl-lib)    
;; (defun arabic-strip-diacritics (string)
;;   (cl-reduce (lambda (s c) (remove c s)) arabic-diacritics :initial-value string))

(defun arabic-search-without-diacritics (string)
  (interactive (list (read-string "Search for: " nil nil nil t)))
  (let ((regexp
         (apply #'concat
                (mapcar (lambda (c)
                          (let ((equivalents (assq c arabic-equivalents)))
                            (concat
                             (if equivalents
                                 (regexp-opt (mapcar #'string equivalents))
                               (regexp-quote (string c)))
                             arabic-diacritics-regexp "*")))
                        string))))
    (search-forward-regexp regexp)))

Yani bir arabellek "الْحَمْدُ لِلَّهِ رَبِّ الْعَالَمِينَ" içeriyorsa ve değerlendiririm (arabic-search-without-diacritics "الحمد لله رب العالمين"), metni bulur. Ayrıca, etkileşimli olarak çalışır M-x arabic-search-without-diacritics.

Alternatif yaklaşım:

Aşağıda Mn, normal ifade dizelerinde normalleştirilmiş dizelerden aksan ve diğer boşluk olmayan işaretlerin ( özellik) nasıl kaldırılabileceğini gösteren tam kod örneği verilmiştir . Verilen örneklerle çalışır ve IMO doğru yaklaşımdır.

(defun kill-marks (string)
  (concat (loop for c across string
                when (not (eq 'Mn (get-char-code-property c 'general-category)))
                collect c)))

(let* ((original1 "your Arabic string here")
      (normalized1 (ucs-normalize-NFKD-string original1))
      (original2 "your other Arabic string here")
      (normalized2 (ucs-normalize-NFKD-string original2)))
  (equal
   (replace-regexp-in-string "." 'kill-marks normalized1)
   (replace-regexp-in-string "." 'kill-marks normalized2)))

Güzel listenize Arapça'da yaygın olarak kullanılan iki aksan daha ekledim. Bu tam sıralanmış listedir 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1648- güncellemek için ücretsizdir.
doktora

İlk fonksiyon arabic-search-without-diacriticsiyi çalışıyor ancak bazı kelimelerle kopuyor, neden böyle olduğunu bilmiyorum الأَ. Diğer uyarı, ben her zaman mini-buffer dizesinde girdiğimde arapça ayarlamak-giriş yöntemi ayarlamak zorunda, isearch-forward/backwardfonksiyonda orada kalır.
doktora

kill-marksher türlü aramaya sorunsuz metinler sunmak için daha iyi bir yaklaşımdır. Benim için belirsiz olan şey, bir tamponda ve sonra çoklu dosyalarda nasıl uygulanacağıdır?
doktora

1
Teşekkürler! isearch-forward/backwardtüm olayları ve mevcut olanı farklı şekilde vurgulamak mümkün mü sve çağırarak ileri ve rgeri hareket edecek mi?
doktora

2
Emacs-devel üzerine tartışma: thread.gmane.org/gmane.emacs.devel/182483
Ted Zlatanov
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.