पाठ में अरबी शब्द कैसे खोजा जाए बिना उसकी डायक्टिक्स / उच्चारण के?


11

अरबी में कुछ अन्य भाषाओं के साथ उच्चारण को बढ़ाने के लिए डायक्टिरिक्स कहा जाता है। एक शब्द के लिए कितने विकृति को लिखा जाना चाहिए, इस पर कोई सम्मेलन नहीं है। कुछ लोग उच्चारण को नापसंद करने के लिए न्यूनतम (जो मुझे पसंद करते हैं) का उपयोग करते हैं, जबकि कुछ उन्हें अति सुंदर या सिर्फ सौंदर्य संबंधी सुलेख प्रयोजनों के लिए उपयोग करते हैं। इस प्रकार, एक शब्द के साथ कितने और कितने विकृति विज्ञान जुड़े हुए हैं, इस पर व्यापक भिन्नता है। जब मैं isearch-forward/backwardदबाकर करता हूं C-s/r, तो समस्या तब उत्पन्न होती है जब मैं इसे खोज में मिनी-बफर में टाइप करता हूं बिना डायक्टिक्स के यह पाठ में एक ही शब्द से मेल नहीं खाएगा यदि यह डायक्रिटिक्स था, तो इस शब्द की तलाश के कार्य को अपने संभावित डायक्रिटिक्स के साथ कभी असंतोषजनक बना दिया।

वहाँ खोज / regexp खोज करने के लिए नादविद्या से अनजान एक रास्ता है? मुझे आशा है कि एक उत्तर होगा जिसे शामिल करने regexp C-M-s/rऔर grepखोज करने के लिए बढ़ाया जा सकता है कि मैं एक बहु-फाइल लेटेक्स परियोजनाओं में एक शब्द की तलाश में हेल-प्रोजेक्टाइल में अक्सर उपयोग करता हूं।

अपडेट
यह देखना अच्छा होगा कि अपने सभी खोज कार्यों में Emacs पाठ पर अलग-अलग तरीके से स्टेपिंग कर रहे हैं (एक्सेंट / डायक्रिटिक्स / आप इसे नाम देते हैं) एक डिफ़ॉल्ट व्यवहार के रूप में स्टेप से मेल खाने से पहले, जो कि मांग में एक उपसर्ग द्वारा बंद किया जा सकता है। कोई भी भाषा हाथ में नहीं है। आमतौर पर, जब मैं किसी चीज की तलाश करता हूं तो मुझे सबसे अच्छे संपादक (Emacs) से इस गलतफहमी में फेल होने की उम्मीद नहीं होती है, क्योंकि केवल कुछ डायक्टिक्स या उच्चारण ऐसे होते हैं, जो शायद ही कभी सांसारिक पाठ को पूरा करने के लिए आवश्यक होते हैं।


1
में ucs-normalize-*कार्यों को देखो lisp/international/ucs-normalize.el। उन लोगों के लिए कोई पूर्व-परिभाषित खोज तह नहीं है, जैसे मामला तह के साथ है, लेकिन आप इसे खोजने से पहले कम से कम एक क्षेत्र को सामान्य कर सकते हैं। एक अच्छा कार्यान्वयन संभवतः एक काफी जटिल कार्य है।
टेड ज़्लाटनोव

क्या superuser.com/a/675172/233868 मदद कर सकता है ?
नाम

@ नाम से, अरबी में अक्षरों (26) के उच्चारण / डायक्टिक्स के संयोजन की बहुत अधिक संभावनाएं हैं, इसलिए यह अरबी के लिए नहीं है। ऐसा लगता है कि भाषा-विशिष्ट पुस्तकालयों का कोई विकल्प नहीं है। मुझे विश्वास नहीं हो रहा है कि यह पहले से ही Microsoft Word में लागू किया गया है और उन सभी वर्षों में Emacs में नहीं।
डॉक्टरेट

1
अरबी में लगभग 80 विकृति विज्ञान और 26 पत्र हैं, सभी संयोजन बनाना एक कठिन काम है। इसके विकृति विज्ञान के पाठ को हटाने का कोई तरीका होना चाहिए, जैसे कि क्या phpलागू किया गया है: stackoverflow.com/a/25563250/1288722 - इस पर भी लागू किया गया Javascript: stackoverflow.com/a/7193622/1288722
डॉक्टरेट

विचार: क्या उस php क्लींजिंग फ़ंक्शन के माध्यम से स्ट्रिंग को चलाना संभव नहीं है और फिर परिणाम को कुछ इसी तरह पास करना है helm-swoop?
सीन एलाड

जवाबों:


5

इस उत्तर में वर्णों की सूची के आधार पर (और फिर विस्तारित) के आधार पर यहाँ एक कठिन शुरुआत है । (इसे समुदाय विकि के रूप में चिह्नित करना - कृपया इसे संपादित करें और इसमें सुधार करें!)

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

तो अगर एक बफर में "الْحَم aدِ لّلَِهَ رَبِّ الَعَالَمَينَ" होता है, और मैं मूल्यांकन करता हूं (arabic-search-without-diacritics "الحمد لله رب العالمين"), तो यह पाठ को खोजता है। यह अंतःक्रियात्मक रूप से भी काम करता है, जैसा कि M-x arabic-search-without-diacritics

वैकल्पिक दृष्टिकोण:

यहां एक पूर्ण कोड उदाहरण दिया गया है जो दर्शाता है कि Mnregexp मैचों में सामान्यीकृत स्ट्रिंग्स से diacritical और अन्य नॉनस्पेसिंग मार्क्स ( संपत्ति) को कैसे हटाया जा सकता है। यह दिए गए उदाहरणों के साथ काम करता है और IMO सही दृष्टिकोण है।

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

मैंने आपकी अच्छी सूची में अरबी में आमतौर पर उपयोग किए जाने वाले दो और विकृति विज्ञान को जोड़ा। यह पूरी तरह से क्रमबद्ध सूची है 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1648- अद्यतन करने के लिए शुल्क मुक्त।
डॉक्टरेट

पहला फ़ंक्शन arabic-search-without-diacriticsअच्छी तरह से काम करता है लेकिन कुछ शब्दों के साथ टूट जाता है, मुझे नहीं पता कि यह क्यों पसंद है الأَ। अन्य चेतावनी, जब मैं मिनी-बफर में अपना स्ट्रिंग दर्ज करता हूं, तो हमेशा अरबी में सेट-इनपुट-विधि होती है, जबकि isearch-forward/backwardफ़ंक्शन में यह वहां रहता है।
डॉक्टरेट

kill-marksसभी प्रकार की खोज के लिए परेशानी मुक्त पाठ प्रदान करने के लिए बेहतर तरीका है। मेरे लिए स्पष्ट नहीं है कि इसे पूरे बफर पर और फिर मल्टीफ़ाइल्स पर कैसे लागू किया जाए?
डॉक्टरेट

1
धन्यवाद! क्या यह संभव है कि isearch-forward/backwardसभी घटनाओं और वर्तमान को अलग तरह से उजागर किया जाए और आह्वान करने से sयह आगे बढ़ेगा और rपिछड़ जाएगा?
डॉक्टरेट

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.