発音記号やアクセント記号なしでアラビア語のテキストを検索する方法は?


11

アラビア語には、他のいくつかの言語と同様に、発音を強化するための発音区別符号があります。1つの単語に対していくつの発音区別符号を書く必要があるかについての規則はありません。発音を明確にするのに十分なだけ(私が好む)の最小値を使用するものもあれば、不必要に、または単に書道の美的目的で使用するものもあります。したがって、1つの単語に関連付けられている発音区別符号の内容と数には、さまざまなバリエーションがあります。をisearch-forward/backward押して実行するC-s/rと、発音区別符号なしで検索ミニバッファーに入力すると問題が発生し、発音区別符号が含まれている場合、テキスト内の同じ単語と一致しないため、発音区別符号が含まれる可能性のあるこの単語を検索するタスクが不十分になります。

分音記号を認識しない検索/正規表現検索を作成する方法はありますか?私は含むように拡張することができる答えがあるだろう願っていますregexp C-M-s/rし、grep私は、マルチファイルラテックスプロジェクト内の単語を探すために舵-発射でかなり頻繁に使用することを検索します。

更新
オンデマンドでプレフィックスによってオフにされる可能性があるデフォルトの動作としてステップを照合する前に、テキストのステップを取り除く(アクセント/発音記号/名前を付ける)ことを行うすべての検索機能でEmacsが表示されるのを見るのは素晴らしいことです手元にある言語に関係なく。通常、私が最高のエディター(Emacs)に期待しない何かを検索すると、平凡なテキストの雑用を達成するために必要になることのある発音区別符号またはアクセントがあるため、この用法で失敗することがあります。


1
ucs-normalize-*関数を見てくださいlisp/international/ucs-normalize.el。大文字と小文字の折りたたみのように、事前定義された検索の折りたたみはありませんが、少なくとも領域を正規化してから検索することができます。適切な実装は、おそらくかなり複雑な作業です。
Ted Zlatanov、2015

ことができますsuperuser.com/a/675172/233868助けを?
名前

@Name、アラビア語には、文字(26)とアクセント/発音記号の組み合わせの可能性がはるかに多いため、アラビア語には適していません。言語固有のライブラリに代わるものはないようです。私はこれがMicrosoft Wordにすでに実装されていて、Emacsにはまだ実装されていないとは信じられません。
博士号

1
アラビア語には約80の発音区別符号と26の文字があり、すべての組み合わせを作ることは困難な作業です。何のように、その発音区別符号のテキストを取り除くためにいくつかの方法が存在しなければならないphp実装:stackoverflow.com/a/25563250/1288722 -も実装Javascriptstackoverflow.com/a/7193622/1288722
博士号

考えました:そのPHPクレンジング関数を介して文字列を実行し、結果を次のようなものに渡すことはできませんhelm-swoopか?
Sean Allred、2015

回答:


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

アラビア語で一般的に使用される発音区別符号を2つ追加しました。これは完全にソートされたリストです1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1648-更新は無料です。
博士号

最初の関数arabic-search-without-diacriticsはうまく機能しますが、いくつかの単語で壊れالأَます。なぜこのようになるのかわかりません。その他の注意点として、文字列をミニバッファーに入力するときは、常にset-input-methodをアラビア語に設定isearch-forward/backwardする必要がありますが、関数内ではそのままです。
博士号

kill-marksあらゆる種類の検索に対応できる手間のかからないテキストを提供するための優れたアプローチです。それをバッファ全体に実装してからマルチファイルに実装する方法がわかりません。
博士号

1
ありがとう!それは次のようにそれを作ることが可能であるisearch-forward/backward、異なると起動することにより、ハイライトすべての出現と、現在の1をs前方に移動しますr後方に移動しますか?
博士号

2
emacs-develに関するディスカッション:thread.gmane.org/gmane.emacs.devel/182483
Ted Zlatanov
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.