Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Корпорация Майкрософт предоставляет словарные разбиватели и морфологические анализаторы для нескольких языков. В этом разделе описывается, как реализовать и использовать пользовательские средства разбиения слов и стеммеры для языков и локалей помимо предоставляемых корпорацией Майкрософт.
Заметка
Пользовательские средства разбиения слов временно не поддерживаются. В июле 2018 года в Windows Server 2019 было внесено изменение, которое не позволило загружать библиотеки DLL без подписи Майкрософт SearchIndexer.exe. Это ограничение было отменено в январе 2021 года.
Этот раздел организован следующим образом:
- Регистрация DLL языкового ресурса
- Регистрация языка
- Реализация Word Beaker
- Реализация стеммера
- Связанные темы
Регистрация библиотеки DLL языковых ресурсов
Каждая DLL языкового ресурса должна реализовывать и экспортировать следующие точки входа. DLL может быть зарегистрирована в любой папке.
- DllMain — это стандартная точка входа в библиотеку DLL.
- DllRegisterServer регистрирует библиотеку DLL в реестре, например
regsvr32.exe %SystemRoot%\MyFolder\wordbreaker.dll
- DllCanUnloadNow позволяет клиентам вызывать эту точку входа через объектную модель компонента (COM), чтобы определить, можно ли выгрузить библиотеку DLL языковых ресурсов.
- DllUnRegisterServer удаляет библиотеку DLL из реестра.
Регистрация языка
Реестр содержит записи, относящиеся к языку для индексируемого языка, и эти записи управляют частями процессов индексирования и запросов, относящихся к языку. Записи реестра можно найти под следующим ключом реестра.
HKEY_LOCAL_MACHINE
SYSTEM
CurrentControlSet
ContentIndex
Control
Language
Реализация Word Beaker
Инструменты разбиения слов реализуют IWordBreaker. Метод IWordBreaker::BreakText выполняет всю обработку текста и синтаксический анализ. Чтобы реализовать компонент разбиения слов, необходимо иметь эвристики языка для вашего языка. Сюда входят сведения о синтаксисе и морфологии. Для исключения или включения может потребоваться также список слов. Вы создаете файл стоп-слов для языковой локали из списка исключенных слов. Дополнительные сведения о лингвистических соображениях и о том, как эти соображения влияют на реализации разбиения слов, см. в лингвистические и юникодовские соображения.
Основной целью IWordBreaker::BreakText является непрерывная обработка текста из TEXT_SOURCE до тех пор, пока не будет обработан весь текст, или пока средство разбиения слов не столкнется с ошибкой. В этом цикле обработки данных IWordBreaker::BreakText вызывает парсинг и служебные методы, выполняющие определенные задачи этого процесса. Например, немецкий разделитель слов может обрабатывать составные слова, в то время как французский разделитель слов может обрабатывать диакритические знаки или клитики. Конкретные функции, которые выполняет средство разбиения слов, и стратегия, которую она использует при выполнении этих задач, полностью зависит от требований для этого языка.
При разбивке текста разделители слов определяют "альтернативные" формы для слов, которые могут иметь несколько представлений. Между созданными словами не подразумевается семантическая связь. На самом деле исходное слово не может быть включено в список альтернативных вариантов. Альтернативные формы сохраняются в той же позиции в индексе, что и исходное слово, чтобы указать, что они идентичны.
Если документ включен в индекс, каждое слово присваивается целочисленное значение, представляющее смещение, или расстояние слова от начала документа. Относительное расстояние между словами в запросе сравнивается со смещениями, хранящимися в полнотекстовом индексе. Запрос "Where is Kyle's document" соответствует любому документу, в котором "Where" находится со смещением n, "is" со смещением n+1, "Kyle's" со смещением n+2 и "document" со смещением n+3. Где документ Кайла хранится в базе данных? представляется следующим образом:
Где | является | Кайл Кайл |
документ | поданный | в | тем | База данных |
В этом примере средство разбиения слов сохраняет альтернативные формы для "Kyle" ("Kyle's") и "database" ("база данных") в индексе. Средство разбиения слов создает и сохраняет альтернативные слова во время процесса создания индекса в следующих условиях:
- Если альтернативное слово, скорее всего, будет отображаться как одно слово в запросе
- Если стеммер, вероятно, не сможет извлечь исходное слово из альтернативной формы
Генерация альтернативных форм слов увеличивает число способов, с помощью которых запросы могут представлять и сопоставлять предложение, как показано в следующих вариантах:
- Где документ Кайла хранится в базе данных?
- Где в базе данных находится документ Кайла?
- Где находится документ Кайла в базе данных?
- Где находится документ Кайла в базе данных?
WordSink и PhraseSink
Средства разбиения по словам используют IWordSink и объекты IPhraseSink для сбора и хранения всех слов и фраз, извлеченных из текста. Средство разбиения слов хранит слова в форме, которая как можно ближе к исходной форме слова в документе. IPhraseSink хранит фразы во время запроса. Фразы повышают релевантность результатов запроса, так как более длинные последовательности слов являются редкими и обеспечивают большее различие, чем небольшие фразы. Когда индексатор помещает фразу в IPhraseSink во время запроса, он создает экземпляр средства разбиения слов, чтобы разбить фразу на слова. Затем индексатор оценивает фразу, проверяя, стоят ли слова в фразе рядом друг с другом в индексе. Например, если "ABCD" встречается в индексе по позициям x, x+1, x+2 и x+3, совпадение фразы произойдет, если любая смежная подстрока "ABCD" передается в запросе. Эта стратегия эффективна для средств разбиения на основе символов, которые разбивают фразы и длинные слова при создании индекса и создают фразы во время выполнения запроса.
Перерывы
Разрывы — это пробелы между словами. Пробелы, знаки препинания, форматирование или просто особенности самого языка могут вызывать разрывы. Существует четыре разных типа разрывов, которые индексатор использует: конец слова (EOW), конец предложения (EOS), конец абзаца (EOP) и конец главы (EOC). Разрыв EOW — это разрыв по умолчанию. После каждого маркера каждая пауза указывает на другое семантическое расстояние между словами по обе стороны. Слова, разделенные EOW, имеют самую тесную семантику связи, за которой следует EOS, EOP и EOC. Несколько вызовов IWordSink::PutBreak являются накопительными и эквивалентны вставке пустых слов или предложений.
Масштабируемость, производительность и безопасность
Способ, которым программа для разбиения слов реагирует на одновременные вызовы, в значительной степени зависит от выбора модели потоков. Индексатор — это однопоточное приложение. Чтобы средства разбиения слов работали в однопоточной среде, они должны быть написаны с использованием модели потоков "свободная" или "оба". Средства разбиения слов не должны регистрироваться в COM, используя поточную модель "Apartment".
Рекомендуется избегать глобальных состояний и хранить данные в экземпляре средства разбиения слов. Единственное содержимое, которое должно храниться в реализации средства разбиения слов, предназначено для параметров fQuery и ulMaxTokenSize. Средства разбиения слов не должны быть более чем в два раза медленнее, чем эталон, установленный английским средством разбиения слов. Производительность механизма разбиения слов также должна улучшаться с увеличением возможностей оборудования.
Средства разбиения слов индексатора работают в контексте безопасности локальной системы. Они должны быть написаны для управления буферами и правильной организации стека. Все копии строк должны иметь явные проверки для защиты от переполнения буфера. Всегда следует проверять выделенный размер буфера и проверять размер данных по размеру буфера. Средства разбиения слов не могут предположить, что текст, переданный в метод IWordBreaker::BreakText, правильно сформирован. Дополнительные сведения об устранении неполадок с разбиением слов см. в разделе "Устранение проблем с языковыми ресурсами и лучшие практики".
Реализация стеммера
Стеммеры реализуют интерфейс IStemmer. Метод IStemmer::GenerateWordForms создает список перегибаемых форм слов для определенного входного слова. Для реализации компонента stemmer необходимо иметь эвристики языка для вашего языка. Сюда входят сведения о морфологии. Для исключения или включения может потребоваться также список слов. Дополнительные сведения о лингвистических соображениях и о том, как эти соображения влияют на реализацию стеммеров, см. в Лингвистические и Юникодные соображения.
Рекомендуется, чтобы стеммеры не создавали слов в родительном падеже. Например, "Дэвид" не создается как альтернативная форма для "Дэвида". Средство разбиения слов создает как "Дэвид", так и "Дэвида", когда оно разбирает "Дэвида".
Стеммер использует объект IWordFormSink для сбора списка альтернативных слов. IWordFormSink::PutWord генерирует окончательное слово с использованием стеммера. Во всех случаях это окончательное слово совпадает с входным словом из IStemmer::GenerateWordForms. Например, учитывая слово "плавать", стеммер создает следующие формы слов: "плавание", "пловец", "плавает", "плавал", и "плывший", путем вызова метода IWordFormSink::PutAltWord. Стеммер генерирует "плавать" через IWordFormSink::PutWord.
Масштабируемость, производительность и безопасность
Стеммеры, подобно средствам разбиения слов, должны использовать "свободную" модель потоков и регистрироваться в COM с этой моделью потоков, установленной на "свободную" или "оба". Поиск Windows вызывает отдельные экземпляры стеммера из разных потоков одновременно. Таким образом, у стеммеров должны быть минимальные данные экземпляра.
Точность стеммера оказывает значительное влияние на релевантность запросов. Если стеммер неправильно стеммирует текст, запросы могут возвращать непредсказуемые и неточные результаты. Стеммеры должны обрабатывать сотни запросов в секунду, не влияя на производительность запросов. Производительность стеммера должна улучшиться с увеличением возможностей оборудования. Сведения об устранении неполадок со стеммерами см. в разделе Устранение неполадок с языковыми ресурсами и лучшие практики.
Стеммеры для поиска Windows выполняются в контексте локальной системы безопасности. Они должны быть предназначены для управления буферами и правильного расположения стека. Все копии строк должны иметь явные проверки для защиты от переполнения буфера. Всегда следует проверять выделенный размер буфера и проверять размер данных по размеру буфера.
Связанные разделы