분음 부호 / 악센트없이 텍스트에서 아랍어 단어를 검색하는 방법은 무엇입니까?


11

다른 언어와 마찬가지로 아랍어에는 발음을 향상시키기 위해 발음 구별 부호가 있습니다. 한 단어에 몇 개의 분음 부호를 작성해야하는지에 대한 규칙은 없습니다. 어떤 사람들은 발음을 명확하게하기에 충분할 정도로 최소한의 것을 선호하는 반면, 어떤 사람들은 그것을 불필요하게 또는 미적 서예 목적으로 사용합니다. 따라서, 하나의 단어와 관련된 분음 부호의 수는 몇 개로 다양합니다. 내가 할 때 isearch-forward/backward누르면 C-s/r, 문제는 내가 분음 부호없이 검색 미니 버퍼에 입력 할 때 그것이 분음 부호가 있다면, 텍스트에 같은 단어를 일치 지금까지 만족스럽지 못한 잠재적 분음 부호와이 단어를 찾는 작업을하지 않습니다 발생한다.

분음 부호를 인식하지 못하도록 검색 / 정규 검색을 수행하는 방법이 있습니까? 나는 다중 파일 라텍스 프로젝트에서 단어를 찾기 위해 투구 발사체에서 자주 사용하는 포함 regexp C-M-s/rgrep검색 으로 확장 할 수있는 대답이 있기를 바랍니다 .

업데이트
모든 검색 기능에서 Emacs가 필요에 따라 접두사로 끌 수있는 기본 동작으로 단계를 일치시키기 전에 텍스트에서 악센트 / 분음 부호 / 이름을 지정하여 제거 단계를 수행하는 것이 좋습니다. 어떤 언어를 사용하든 일반적으로 무언가를 검색 할 때 평범한 텍스트 집안일을 달성해야 할 경우가 거의없는 일부 발음 구별 부호 나 악센트 때문에이 편집에서 최고의 편집자 (Emacs)가 실패 할 것으로 예상하지 않습니다.


1
ucs-normalize-*기능을 살펴보십시오 lisp/international/ucs-normalize.el. 대 / 소문자 구분과 같이 사전 정의 된 검색 폴더는 없지만 검색하기 전에 영역을 정규화 할 수 있습니다. 좋은 구현은 아마도 상당히 복잡한 작업 일 것입니다.
Ted Zlatanov


@Name, Arabic는 문자 (26)와 악센트 / 분음 부호의 조합 가능성이 훨씬 높으므로 아랍어가 아닙니다. 언어 별 라이브러리를 대체 할 수없는 것 같습니다. 나는 이것이 몇 년 전 Emacs가 아닌 Microsoft Word에서 이미 구현되었다고 믿을 수 없습니다.
박사 학위

1
아랍어에는 약 80 개의 분음 부호와 26 개의 문자가 있으므로 모든 조합을 만드는 것은 어려운 작업입니다. 무엇처럼의 발음 구별 부호의 텍스트, 제거 할 수있는 방법이 있어야합니다 php: 구현 stackoverflow.com/a/25563250/1288722 도 구현 - Javascript: stackoverflow.com/a/7193622/1288722을
박사

생각 : 그 PHP 정리 기능을 통해 문자열을 실행 한 다음 비슷한 결과를 전달할 수 helm-swoop없습니까?
Sean Allred

답변:


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

따라서 버퍼에 "الْحَمْدُ لِلَّهِ رَبِّ الْعَالَمِينَ"가 포함되어 있고 평가 (arabic-search-without-diacritics "الحمد لله رب العالمين")하면 텍스트를 찾습니다. 또한 대화식으로 작동합니다 M-x arabic-search-without-diacritics.

대체 접근법 :

Mn정규 표현식과 일치하는 정규화 된 문자열에서 분음 부호 및 기타 비 간격 표시 ( 속성)를 제거 하는 방법을 보여주는 전체 코드 예제는 다음과 같습니다 . 주어진 예제와 함께 작동하며 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이동하고 뒤로 이동합니다.
박사 학위

2
이맥스 (STABLE)에 대한 토론 : thread.gmane.org/gmane.emacs.devel/182483
테드 Zlatanov
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.