Delphi 2009: поиск пропущенных диакритических знаков в Unicode UTF-8 - PullRequest
4 голосов
/ 08 апреля 2009

У меня есть файл в кодировке 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;

Редактировать2 : Пример данных Unicode:

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

Ответы [ 2 ]

5 голосов
/ 09 апреля 2009

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

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

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

2 голосов
/ 24 мая 2009

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

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

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

Более продвинутый способ сделать это, например, TREC :

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

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

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

...