Delphi 2009: Поиск с пропуском диакритических знаков в Unicode utf-8

У меня есть файл в кодировке utf-8, содержащий арабский текст, и мне нужно его найти.

Моя проблема - диакритические знаки, как искать, пропуская их?

Например, если вы загружаете этот текст в Internet Explorer (конечно, конвертируя текст в HTML), IE пропускает эти диакритические знаки?

Любая помощь?

Edit1: поиск просто выполняется с помощью следующего кода:

 var m1 : TMemo; //contains utf-8 data)
     m2 : TMemo; // contains results

 ...

      m2.lines.BeginUpdate;
      for s in m1.Lines do
      begin
        if pos(eSearch.Text,s)>0 then
           begin
           m2.Lines.Add(s);
           end;
      end;
      m2.Lines.EndUpdate;

Edit2: пример данных Unicode:

قُلْ هُوَ اللَّهُ أَحَدٌ Если искать только буквы без диакритических знаков قل, слово قُلْ не будет найдено.


person Irfan Mulic    schedule 08.04.2009    source источник
comment
Как вы осуществляете поиск?   -  person Daniel Rikowski    schedule 08.04.2009
comment
Код добавлен к вопросу.   -  person Irfan Mulic    schedule 08.04.2009


Ответы (2)


Я считаю, что диакритические знаки не единственная проблема.

Я бы сделал замены символов, заменив их пустыми строками, я бы также нормализовал текст 'أ' 'إ' 'آ' все конвертируются в 'ا', а также сделал бы то же самое для ى ئ ي ؤ و ة ه.. .

Для поиска я бы также использовал легкий стеммер, такой как «Khoja Stemmer» (источник Java здесь). )

Более продвинутый способ — сделать это следующим образом:

  • Удалить знаки препинания
  • Удалить диакритические знаки (в основном слабые гласные) Большая часть корпуса не содержала слабых гласных.
  • Некоторые словарные статьи содержали слабые гласные. Это сделало все последовательным.
  • Удалить не буквы
  • Замените начальное إ или أ на bare alif .ا
  • Замените آ на ا
  • Замените последовательность ىء на ئ
  • Замените конечную ى на ي
  • Замените конечное ة на ه
  • Разделите 6 префиксов: определенные артикли ( فال آال، بال، وال، ال، ) и و (и) от начала нормализованных слов
  • Удалите 10 суффиксов с концов слов ات ان، ها،ي ة، ه، ية، يه، ين، ون

Я бы проиндексировал текст по этому измененному тексту (для заметок я бы сохранил индекс слова в исходном тексте) и сделал бы то же самое для поискового запроса.

Я бы также искал в Memo1.Text, а не в строках одну за другой, поиск мог бы быть для нескольких слов, которые могут быть в конце строки и перенесены на следующую строку.

person Osama Al-Maadeed    schedule 23.05.2009

В Vista+ вы, вероятно, можете (у меня нет опыта работы с арабским языком) использовать CompareString с опцией LINGUISTIC_IGNOREDIACRITIC.

NORM_IGNORENONSPACE также может помочь. Опять же, может и не .

В качестве альтернативы (но я просто предполагаю), вы можете проанализировать свои строки с помощью GetStringTypeEx и вручную удалите диакритические знаки. Возможно, вам придется вызвать FoldString или MultiByteToWideChar с флагом MAP_COMPOSITE.

person gabr    schedule 09.04.2009