Delphi 2009:Поиск с пропуском диакритических знаков в unicode utf-8
Вопрос
У меня есть файл в кодировке 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.