Поделиться через


Реализация разбиения Word и парадигматического модуля

Корпорация Майкрософт предоставляет средства разбиения по словам и парадигматические модули для ряда языков. В этом разделе описывается, как реализовать и использовать пользовательские средства разбиения по словам и парадигматические модули для языков, а также языковых стандартов за пределами предоставляемых корпорацией Майкрософт.

Примечание

Пользовательские средства разбиения по словам временно не поддерживаются. В июле 2018 г. в Windows Server 2019 было внесено изменение, которое не позволило загружать библиотеки DLL без подписи Майкрософт с помощью SearchIndexer.exe. Это ограничение было отменено в январе 2021 г.

Эта тема организована следующим образом:

Регистрация библиотеки 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

Word размыкатели реализуют IWordBreaker. Метод IWordBreaker::BreakText выполняет всю обработку и анализ текста. Чтобы реализовать компонент средства разбиения по словам, необходима эвристика языка. Сюда входят сведения о синтаксисе и морфологии. Вам также может потребоваться список слов для исключения или включения. Вы создаете файл "шумные слова" для языкового стандарта вашего языка из списка исключенных слов. Дополнительные сведения о лингвистических соображениях и о том, как они влияют на реализации средства разбиения по словам, см. в разделе Вопросы лингвистики и Юникода.

Main целью IWordBreaker::BreakText является непрерывная обработка текста из TEXT_SOURCE до тех пор, пока не будет обработан весь текст или пока средство разбиения по словам не обнаружит ошибку. В этом цикле обработки данных IWordBreaker::BreakText вызывает методы анализа и служебные методы, которые выполняют определенные задачи для этого процесса. Например, средство разбиения по немецким словам может обрабатывать составные слова, в то время как средство разбиения по французским словам может обрабатывать диакритические знаки или клитики. Конкретные функции, которые выполняет средство разбиения по словам, и стратегия, которую оно использует при выполнении этих задач, полностью зависят от требований к языку.

При разрыве текста средства разбиения по словам определяют "альтернативные" формы для слов, которые могут иметь несколько представлений. Между созданными словами не подразумевается семантическое отношение. На самом деле исходное слово не может быть включено в список альтернативных вариантов. Альтернативные формы сохраняются в той же позиции в индексе, что и исходное слово, чтобы указать, что они идентичны.

При включении документа в индекс каждому слову присваивается целочисленное значение, представляющее смещение, или расстояние от слова от начала документа. Относительное расстояние между словами в запросе сравнивается со смещениями, хранящимися в полнотекстовом индексе. Запрос "Where is Kyle's document" соответствует любому документу с "Where" в смещении n, "is" в n+1, "Kyle's" в n+2 и "document" в n+3. "Где документ Кайла, поданный в базу данных?" представляется следующим образом:

               
Where — это Кайл Кайл
документ Подал in мыши база данных базы данных

 

В этом примере средство разбиения по словам сохраняет альтернативные формы для "Kyle" ("Kyle") и "база данных" ("база данных") в индексе. Средство разбиения по словам создает и сохраняет альтернативные слова в процессе создания индекса при следующих условиях:

  • Если альтернативное слово, скорее всего, будет отображаться как одно слово в запросе
  • Если парадигматический метод не может получить исходное слово из альтернативы

Создание альтернативных текстовых форм увеличивает количество способов, которыми запросы представляют и сопоставляют предложение, как показано в следующих вариантах:

  1. Где находится документ Кайл, поданный в базу данных
  2. Где находится документ Кайла, поданный в базу данных
  3. Где документ Кайла, поданный в базу данных
  4. Где документ Кайла, поданный в базу данных

WordSink и PhraseSink

Word средства разбиения используют объекты IWordSink и IPhraseSink для сбора и хранения всех слов и фраз, извлекаемых из текста. Средство разбиения по словам хранит слова в форме, максимально близкой к исходной форме слова в документе. IPhraseSink хранит фразы во время запроса. Фразы повышают релевантность результатов запроса, так как более длинные последовательности слов встречаются реже и обеспечивают большее различие по сравнению с меньшими фразами. Когда индексатор помещает фразу в IPhraseSink во время запроса, он создает экземпляр средства разбиения по словам для разбиения фразы на слова. Затем индексатор оценивает фразу, проверяя, находятся ли слова в фразе рядом друг с другом в индексе. Например, если "ABCD" встречается в индексе в позициях x, x+1, x+2 и x+3, совпадение фраз будет происходить, если в запросе будет отправлена какая-либо смежная подстрока "ABCD". Эта стратегия эффективна для разбиения слов на основе символов, которые разделяют фразы и длинные слова во время создания индекса и создают фразы во время запроса.

Разрывы

Разрывы — это пробелы между словами. Пробелы, знаки препинания, форматирование или просто характер самого языка могут привести к разрыву. Существует четыре различных типа разрывов, которые использует индексатор: конец слова (EOW), конец предложения (EOS), конец абзаца (EOP) и конец главы (EOC). Прерывание EOW — это разрыв по умолчанию. После каждого маркера каждый разрыв указывает на разное семантическое расстояние между словами с обеих сторон. Слова, разделенные EOW, имеют самую тесную семантику, за которой следуют EOS, EOP и EOC. Несколько вызовов IWordSink::P utBreak являются накопительными и аналогичны вставке пустых слов или предложений.

Масштабируемость, производительность и безопасность

Способ реагирования средства разбиения по словам на одновременные вызовы в значительной степени зависит от выбора модели потоков. Индексатор является однопоточным приложением. Чтобы средства разбиения по словам работали в однопотоковой среде, средства разбиения по словам должны быть написаны с использованием "свободной" или "обеих" потоковой модели. Word размыкатели не должны регистрироваться в COM с помощью модели потоков "подразделения".

Рекомендуется, чтобы средства разбиения по словам избегали глобальных состояний и хранили данные в экземпляре средства разбиения по словам. Единственное содержимое, которое должно храниться в реализации средства разбиения по словам, — это для параметров fQuery и ulMaxTokenSize. Word разбиения должны быть не более чем в два раза медленнее, чем установленный английским разбиение по словам. Word производительность размыкателя также должна повыситься благодаря увеличению возможностей оборудования.

Word средства разбиения для индексатора выполняются в контексте безопасности локальной системы. Они должны быть записаны для управления буферами и правильного стека. Все копии строк должны иметь явные проверки для защиты от переполнения буфера. Всегда следует проверять выделенный размер буфера и проверять размер данных на соответствие размеру буфера. Word средства разбиения не могут предполагать, что текст, передаваемый в метод IWordBreaker::BreakText, имеет правильный формат. Дополнительные сведения об устранении неполадок с средствами разбиения по словам см. в разделе Устранение неполадок с языковыми ресурсами и рекомендациями.

Реализация парадигматического модуля

Парадигматические модули реализуют интерфейс IStemmer . Метод IStemmer::GenerateWordForms создает список форм с перегибом слов для конкретного входного слова. Для реализации компонента парадигматического модуля требуется эвристика языка. Сюда входят сведения о морфологии. Вам также может потребоваться список слов для исключения или включения. Дополнительные сведения о лингвистических соображениях и о том, как они влияют на реализации парадигматического модуля, см. в разделе Вопросы лингвистики и Юникода.

Рекомендуется, чтобы парадигматические модули не создавали генитивный или притяжательный регистр слов. Например, "Дэвид" не создается в качестве альтернативной формы для "Дэвида". Средство разбиения по словам создает слова "David" и "David's" при анализе "Дэвид".

Парадигматический метод использует объект IWordFormSink для сбора списка альтернативных слов. IWordFormSink::P utWord создает последнее слово из парадигматического модуля. Во всех случаях это последнее слово совпадает с входным словом из IStemmer::GenerateWordForms. Например, учитывая слово "плавать", парадигматический метод формирует следующие формы слов: "плавание", "пловец", "плавает", "плавает" и "плавает" с помощью вызовов IWordFormSink::P utAltWord. Парадигматический метод создает "плавать" через IWordFormSink::P utWord.

Масштабируемость, производительность и безопасность

Парадигматические модули, как и средства разбиения по словам, должны использовать "свободную" потоковую модель и регистрироваться в COM с их потоковой моделью, для нее задано значение "free" или "both". Windows Search одновременно вызывает отдельные экземпляры парадигматического модуля из разных потоков. Поэтому парадигматические модули должны иметь минимальные данные экземпляра.

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

Парадигматические модули для Windows Search выполняются в контексте локальной безопасности. Они должны быть записаны для управления буферами и правильного стека. Все копии строк должны иметь явные проверки для защиты от переполнения буфера. Всегда следует проверять выделенный размер буфера и проверять размер данных на соответствие размеру буфера.

Расширение языковых ресурсов

Основные сведения о компонентах языковых ресурсов

Вопросы лингвистики и Юникода

Устранение неполадок с языковыми ресурсами и рекомендациями