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

StackOverflow https://stackoverflow.com/questions/730143

Вопрос

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

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

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

Какая-нибудь помощь?

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

 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:Пример данных в юникоде:

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

Это было полезно?

Решение

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

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

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

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

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

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

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

Другие советы

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

NORM_IGNORENONSPACE также может помочь.Потом еще раз, это может и не.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top