Привет, команда Discourse,
Мы управляем многоязычным форумом с значительным количеством контента на арабском и персидском языках и столкнулись с критическим ограничением в функциональности поиска, связанным с орфографической нормализацией арабского языка.
Описание проблемы
Арабский алфавит включает несколько представлений Unicode для семантически идентичных символов. К сожалению, текущий поисковый движок Discourse, по-видимому, рассматривает эти варианты как различные, что приводит к неполным или вводящим в заблуждение результатам поиска.
Примеры:
- Поиск по запросу
إطلاق مقاميвозвращает только точные совпадения, тогда как сообщения, содержащиеاطلاق مقامي,أطلاق مقاميилиإطلاقمقامي, исключаются. - Аналогично, поиск по символу
ي(U+064A) не находитی(U+06CC), аك(U+0643) не совпадает сک(U+06A9), несмотря на их функциональную эквивалентность в арабском и персидском контекстах.
Это касается не только вариантов хамзы (أ, إ, ء, ؤ, ئ), но и распространенных замен, таких как:
| Символ | Unicode | Предлагаемая нормализация |
|---|---|---|
أ, إ, ء, آ |
U+0623, U+0625, U+0621, U+0622 | Нормализовать до ا |
ؤ |
U+0624 | Нормализовать до و |
ئ |
U+0626 | Нормализовать до ي |
ى |
U+0649 | Нормализовать до ي |
ة |
U+0629 | Нормализовать до ه |
ي vs ی |
U+064A vs U+06CC | Нормализовать до ی |
ك vs ک |
U+0643 vs U+06A9 | Нормализовать до ک |
Проблема усугубляется, когда пользователи опускают диакритические знаки или используют различные раскладки клавиатуры, что приводит к фрагментированному поведению поиска.
Предлагаемое решение
Мы рекомендуем внедрить слой нормализации, учитывающий Unicode, как при индексации, так и при анализе запросов. Это можно реализовать следующим образом:
- Предварительная обработка как индексированного контента, так и запросов пользователей для унификации вариантов символов.
- Применение правил нормализации, аналогичных тем, что используются в библиотеках NLP для арабского языка или поисковых системах (например, Farasa, Hazm или пользовательские мапперы на основе регулярных выражений).
- По желанию, поддержка нечеткого поиска или расстояния Левенштейна для приближенных совпадений.
Вот упрощенный пример функции нормализации (в стиле Java):
public static String normalizeArabic(String text) {
return text.replace("أ", "ا")
.replace("إ", "ا")
.replace("آ", "ا")
.replace("ؤ", "و")
.replace("ئ", "ي")
.replace("ى", "ي")
.replace("ة", "ه")
.replace("ي", "ی")
.replace("ك", "ک");
}
Запрос
Можно ли рассмотреть возможность включения этой нормализации в основной поисковый движок или в качестве плагина? Это значительно улучшит удобство использования для арабских и персидских сообществ, использующих Discourse.
Если существует существующее решение или плагин, решающий эту проблему, мы будем признательны за любые рекомендации.
Спасибо за ваше время и за создание такой мощной платформы.
С уважением