Làm thế nào để tìm kiếm một từ tiếng Ả Rập trong văn bản mà không có dấu phụ / dấu của nó?


11

Trong tiếng Ả Rập cũng như với một số ngôn ngữ khác, có những gì được gọi là dấu phụ để tăng cường phát âm. Không có quy ước về số lượng dấu phụ nên được viết cho một từ. Một số sử dụng mức tối thiểu (mà tôi thích) chỉ đủ để phân biệt phát âm, trong khi một số sử dụng chúng một cách thừa thãi hoặc chỉ cho mục đích thư pháp thẩm mỹ. Do đó, có một sự khác biệt lớn về những gì và bao nhiêu dấu phụ được liên kết với một từ. Khi tôi thực hiện isearch-forward/backwardbằng cách nhấn C-s/r, vấn đề phát sinh khi tôi gõ nó vào bộ đệm tìm kiếm nhỏ mà không có dấu phụ, nó sẽ không khớp với cùng một từ trong văn bản nếu nó có dấu phụ, khiến nhiệm vụ tìm từ này với dấu phụ tiềm năng của nó không đạt yêu cầu.

Có cách nào để làm cho tìm kiếm / tìm kiếm regrec không biết về dấu phụ? Tôi hy vọng sẽ có một câu trả lời có thể được mở rộng để bao gồm regexp C-M-s/rgreptìm kiếm mà tôi sử dụng khá thường xuyên trong helm-projectile để tìm kiếm một từ trong các dự án latex nhiều tệp.

Cập nhật
Thật tuyệt khi thấy Emacs trong tất cả các chức năng tìm kiếm của nó thực hiện bước tước trên văn bản (từ dấu / diacritics / bạn đặt tên cho nó) trước khi khớp với bước như một hành vi mặc định có thể bị tắt bởi tiền tố theo yêu cầu không có vấn đề gì trong ngôn ngữ Thông thường, khi tôi tìm kiếm thứ gì đó tôi không mong đợi từ trình soạn thảo tốt nhất (Emacs) sẽ thất bại trong việc vặt vãnh này chỉ vì một số dấu phụ hoặc dấu mà hiếm khi cần để thực hiện các công việc văn bản trần tục.


1
Nhìn vào các ucs-normalize-*chức năng trong lisp/international/ucs-normalize.el. Không có gấp tìm kiếm được xác định trước cho những người, như có trường hợp gấp, nhưng ít nhất bạn có thể bình thường hóa một khu vực trước khi tìm kiếm nó. Một thực hiện tốt có lẽ là một nhiệm vụ khá phức tạp.
Ted Zlatanov 5/2/2015

Superuser.com/a/675172/233868 có thể giúp gì không?
Tên

@ Tên, tiếng Ả Rập có nhiều khả năng kết hợp các chữ cái (26) với dấu / dấu phụ, vì vậy nó không dành cho tiếng Ả Rập. Dường như không có sự thay thế cho các thư viện dành riêng cho ngôn ngữ. Tôi không thể tin rằng điều này đã được triển khai trong Microsoft Word và không phải trong Emacs trong những năm trước.
tiến sĩ

1
Tiếng Ả Rập có khoảng 80 dấu phụ và 26 chữ cái, làm cho tất cả các kết hợp là một nhiệm vụ khó khăn. Phải có một số cách để loại bỏ văn bản của dấu phụ của nó, giống như những gì đã phptriển khai: stackoverflow.com/a/25563250/1288722 - cũng được thực hiện trong Javascript: stackoverflow.com/a/7193622/1288722
tiến sĩ

Thiết nghĩ: không thể chạy chuỗi thông qua chức năng dọn dẹp php đó và sau đó chuyển kết quả đến một cái gì đó tương tự helm-swoop?
Sean Allred

Câu trả lời:


5

Đây là một khởi đầu khó khăn, dựa trên danh sách các ký tự kết hợp trong câu trả lời này (và sau đó được mở rộng). (Đánh dấu đây là wiki cộng đồng - vui lòng chỉnh sửa và cải thiện điều này!)

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

Vì vậy, nếu một bộ đệm có chứa "Tiếng Việt", và tôi đánh giá (arabic-search-without-diacritics "الحمد لله رب العالمين"), nó sẽ tìm thấy văn bản. Nó cũng hoạt động tương tác, như M-x arabic-search-without-diacritics.

Cách tiếp cận khác:

Dưới đây là một ví dụ mã đầy đủ chứng minh làm thế nào các dấu phụ (thuộc Mntính) không dấu cách khác có thể được loại bỏ khỏi các chuỗi được chuẩn hóa trong các kết hợp regrec. Nó hoạt động với các ví dụ đã cho và IMO là phương pháp phù hợp.

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

Tôi đã thêm hai dấu phụ thường được sử dụng trong tiếng Ả Rập vào danh sách đẹp của bạn. Đây là danh sách được sắp xếp đầy đủ 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1648- miễn phí cập nhật.
tiến sĩ

Hàm đầu tiên hoạt arabic-search-without-diacriticsđộng tốt nhưng ngắt với một số từ, tôi không biết tại sao lại thích hàm này الأَ. Nhắc nhở khác, tôi luôn phải đặt phương thức nhập liệu thành tiếng Ả Rập khi tôi nhập chuỗi của mình vào bộ đệm mini, trong khi isearch-forward/backwardchức năng thì nó vẫn ở đó.
tiến sĩ

kill-markslà cách tiếp cận tốt hơn để cung cấp văn bản không rắc rối sẵn sàng cho tất cả các loại tìm kiếm. Điều không rõ ràng với tôi là làm thế nào để thực hiện điều đó trên toàn bộ bộ đệm và sau đó trên nhiều tệp?
tiến sĩ

1
Cảm ơn! Có thể làm cho nó giống như isearch-forward/backwardlàm nổi bật tất cả các lần xuất hiện và hiện tại khác đi và bằng cách gọi ssẽ tiến lên và rdi chuyển lùi?
tiến sĩ

2
Thảo luận về emacs-devel: thread.gmane.org/gmane.emacs.devel/182483
Ted Zlatanov
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.