Генератор текста и перефразировщик

Словарь синонимов

В качестве базы синонимов используется информация в тезаурусе. Содержимое этой базы можно удобно просматривать с помощью программы Грамматический Словарь Русского Языка. Расширение базы синонимов возможно несколькими способами.

Во-первых, SDK Синонимизатора поддерживает механизм пользовательских словарей. Таким образом можно добавлять собственные синонимы к базовому словарю, к примеру используя утилиту LexiconEditor. Также SDK позволяет добавлять свои правила перефразировки текста.

Во-вторых, SDK Pro позволяет загрузить словарь в SQL базу данных и редактировать тезаурус с помощью программы SQLex.

SDK синонимизатора

Все описываемые ниже процедуры являются частью API синонимизатора, который доступен как DLL и .NET сборка в SDK синонимизатора.

На странице синонимизатора есть ссылки для скачивания демонстрационных версий программ Synonymizer (консольный синонимизатор и перефразировщик) и Joker (генератор и перефразировщик текста).

Программы для синонимизации и перефразировки

В составе SDK есть две утилиты, выполняющие синонимизацию и перефразировку текста.

Во-первых, консольная утилита Rewriter для платформы .NET. Она написана на C#, использует DLL-версию движка. Она работает на 32- и 64-битных версиях MS Windows с установленным .NET Framework. Ее исходные тексты включены в SDK как один из примеров.

Во-вторых, консольная утилита Synonymizer. В отличие от Rewriter, в ней код грамматического движка скомпилирован как часть программы. Она доступна в вариантах для 32- и 64-битных версий MS Windows и Linux.

синонимизация и перефразировка русского текста     синонимизация и перефразировка русского текста

В составе демо-программы Joker, доступной для свободного скачивания, так же есть модуль синонимизации и перефразировки:

русский синонимизатор

Примеры в SDK

В составе SDK Синонимизатора есть несколько простых программ, демонстрирующих работу с API перефразировщика и синонимизатора.

К примеру, в подкаталоге ...\demo\ai\solarix\Grammar_Engine\LinuxRewriter можно найти простой пример на C++, который компилируется под Windows, используя synonymizer.dll, и под Linux, используя synonymizer.so.

К примерам, доступным с исходными текстами, относится также утилита Rewriter. Она написана на C#, работает на платформе .NET и обращается к API синонимизатора, перефразировщика и генератора текста через вспомогательную сборку synonymizer_fx.dll.

Подготовка и настройка генератора текста

Создание генератора

HGREN_PHRASOMAT sol_CreatePhraseGenerator( HGREN hEngine, int ilang )

Аргументы:

ilang - код языка, целочисленные константы объявлены в _sg_api.h, _sg_api.cs, _sg_api.pas для C++, C# и Delphi соответственно.

Возвращает:

Дескриптор объекта, который затем указывается в других процедурах для работы с генератором текста. Вы должны удалить объект по окончании работы вызовом sol_DeletePhraseGenerator. При возникновении ошибки , например если задан неподдерживаемый язык, возвращается NULL.

Удаление генератора

int sol_DeletePhraseGenerator( HGREN_PHRASOMAT hBuilder )

Аргументы:

hBuilder - дескриптор генератора, созданный sol_CreatePhraseGenerator.

Перенастройка внутреннего генератора псевдослучайных чисел

void sol_RandomizePhraseGenerator( HGREN_PHRASOMAT hBuilder )

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

Аргументы:

hBuilder - дескриптор генератора, созданный sol_CreatePhraseGenerator.

Генерация случайных фраз на заданную тему

Задание белого списка слов

void sol_SetWordsForPhrase( HGREN_PHRASOMAT hBuilder, int n, const int* words_ie, bool use_thesaurus )

По умолчанию генератор использует все имеющиеся в загруженном лексиконе слова. Чтобы ограничить генератор, можно задать список слов и N-грамм (см. sol_Set2GramsForPhrase).

Аргументы:

hBuilder - дескриптор объекта генератора текста, созданного вызовом sol_CreatePhraseGenerator

n - число слов в списке

words_ie - индексы слов, разрешенных к использованию (см. sol_FindEntry).

use_thesaurus - использовать ли грамматически связанные с заданными в words_ie слова.

Задание белого листа 2-грамм

void sol_Set2GramsForPhrase( HGREN_PHRASOMAT hBuilder, int npairs, const int* words_ie )

По умолчанию генератор использует любые грамматически законные, но возможно семантически и прагматически недопустимые, сочетания слов. Чтобы ограничить генератор в выборе пар, можно задать список слов (см. sol_SetWordsForPhrase) и N-грамм.

Аргументы:

hBuilder - дескриптор объекта генератора текста, созданного вызовом sol_CreatePhraseGenerator

n - число пар в списке

words_ie - индексы слов, разрешенных к использованию (см. sol_FindEntry). Число элементов списка равно удвоенному n.


Задание фильтрующих тегов для выбора синонимов

int sol_SetTagsW( HGREN_PHRASOMAT hBuilderconst wchar_t * Tags, int Flags )

int sol_SetTagsA( HGREN_PHRASOMAT hBuilderconst char * Tags, int Flags )

int sol_SetTags8( HGREN_PHRASOMAT hBuilderconst char * Tags, int Flags

Аргументы:

Tags - список (в текущей версии поддерживается только одна пара) пар тег=значение. Указанные теги запоминаются и при последующих вызовах sol_Paraphrase влияют на выбор синонимов из тезауруса. Для варианта sol_SetTagsW это строка из широких символов, для sol_SetTags8 строка имеет кодировку utf-8. Если указать пустую строку, то фильтр будет отменен.

Flags - дополнительные управляющие флаги, в текущей версии должно быть 0.

Генерация очередного предложения

wchar_t* sol_GeneratePhrase( HGREN_PHRASOMAT hBuilder, int PhraseType )

Аргументы:

PhraseType - флаги, управляющие генерацией. Может быть битовой комбинацией констант, объявленных в synonymizer_engine.h:

FG_QUEST - генерировать вопросительные предложения
     FG_EXCLAM - генерировать восклицательные предложения
     FG_COMSENT - генерировать повествовательные предложения

FG_LOGICS - предложения с логическими конструкциями типа кошка и собака, быть или не быть.
     FG_GERUND1 - использовать причастные обороты
     FG_GERUND2 - использовать деепричастные обороты
     FG_INTRO - использовать семантический мусор в виде вводных слов и словосочетаний.
     FG_COMPLEX - использовать сложные конструкции типа луна видна при условии, что небо чистое.
     FG_MULTISENT - генерировать фрагменты, состоящие из нескольких связанных по смыслу предложений, например - временные последовательности.

При работе алгоритм учитывает заданные ранее белые списки слов и пар слов (sol_SetWordsForPhrase и sol_Set2GramsForPhrase). С помощью добавления к PhraseType нижеописанных констант можно управлять использованием фильтрующих списков

FG_USE_LEX_WHEN_EXHAUSTED - слова берутся из белого списка случайным образом и удаляются в случае успеха, а после исчерпания списка начинают поставляться из всего лексикона. По умолчанию без этого флага исчерпание белого списка приведет к тому, что слова будут браться из белого списка без удаления использованных.
     FG_EXTRACT_FIRST - слова берутся из белого списка не случайно, а последовательно.
     FG_DONT_REMOVE_USED - слова берутся из белого списка, но не удаляются из него, так что могут встречаться в сгенерированных предложениях снова и снова.

FG_GENERATOR_USES_CHAINS - использовать при генерации текста матрицу переходов, построенную функцией sol_BuildKnowledheBase2. При этом другие флаги употребляться не должны.

Возвращает:

Указатель на строку со сгенерированным предложением. Освобождение этого указателя выполняется функцией sol_DeleteGeneratedPhrase.


Генерация фразы - вариант без выделения памяти

int sol_GeneratePhrase2( HGREN_PHRASOMAT hBuilder, int PhraseType, wchar_t* Buffer, int maxlen )

Единственным отличием этой процедуры от sol_GeneratePhrase является то , что она копирует созданное предложение в предоставленный буфер Buffer.

Освобождает память, выделенную под сгенерированную фразу

int sol_DeleteGeneratedPhrase( wchar_t*Phrase )

Аргументы:

Phrase - указатель на строку, которую возвратила процедура sol_GeneratePhrase.

 

Подготовка к имитации текста - изучение исходного текста

int sol_BuildKnowledgeBase( HFAIND hEngine, const wchar_t *DocumentsFolder, const wchar_t *DestinationFolder, int LanguageId, int Flags )

Выявляются статистические характеристики текста документов, которые находятся в указанном каталоге. База данных о тексте сохраняется в заданном каталоге. Затем эту базу можно загрузить процедурой sol_LoadKnowledgeBase и сгенерировать набор предложений, имитирующих статистические характеристики исходного текста без сохранения семантики, с помощью sol_GeneratePhrase.

Аргументы:

DocumentFolder - путь к папке с изучаемыми документами. Движок используется для обработки документов все доступные плагины поискового движка.

DestinationFolder - папка для сохранения файлов базы знаний об исходных документах.

LanguageId - идентификатор языка, можно использовать константы API или процедуру sol_FindLanguage.

Flags - должен быть 0 в текущей версии.

Возвращает:

0 - база знаний успешно построена, значение <0 возвращается при ошибке.

 

Загрузка результатов изучения текста

int sol_LoadKnowledgeBase( HGREN_PHRASOMAT hBuilder, const wchar_t *FolderPath )

База с результатами изучения текста создается вызовом sol_BuildKnowledgeBase. После загрузки базы можно генерировать случайный текст, сохраняющий статистические характеристики исходного текста, с помощью вызовов sol_GeneratePhrase.

Аргументы:

FolderPath - папка с базой знаний, записанной sol_BuildKnowledgeBase.

Возвращает:

0 - база успешно загружена, -1 возникла ошибка.

Подготовка матрицы переходов для вероятностного автомата

int sol_BuildKnowledgeBase2HGREN_PHRASOMAT hBuilderconst wchar_t * EtalonPathint Orderint Flags )

Анализируется текст, содержащийся в файле с указанным именем EtalonPath. Если EtalonPath соответствует каталогу, то анализируется каждый их найденных в каталоге файлов.

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

Аргумент Order задает длину цепочек слов, которые определяют историю состояний, влияющих на переход автомата, то есть на выбор нового слова для добавления в выходной текст. Чем больше значение этого аргумента, тем ближе результат генерации к исходному тексту, но при этом очень быстро растет объем потребляемой памяти для сохранения матрицы переходов.

Аргумент Flags в текущей версии должен быть равен 0.

Анализ текста проводится с использованием сегментатора и токенизатора для текущего языка объекта hBuilder.

Генерация текста с использованием построенной матрицы переходом выполняется процедурой sol_GeneratePhrase с флагом FG_GENERATOR_USES_CHAINS. Утилита Rewriter из SDK Синонимизатора вызывает функцию sol_BuildKnowledgeBase2 при указании сценария обработки chains.

Модификации текста

Создание шаблона генерации

HGREN_FGTEMPLATE sol_CreateFGTemplate( HGREN_PHRASOMAT hBuilder, const wchar_t*text, int Language )

Аргументы:

text - одно или несколько предложений. Оптимальным вариантом является именно одно предложение.

Language - идентификатор языка.

Возвращает:

Дескриптор объекта , который затем может быть использован для генерации текста. Удаление этого объекта выполняется процедурой sol_DeleteFGTemplate.

 

Удаление шаблона генерации

int sol_DeleteFGTemplate( HGREN_FGTEMPLATE hTemplate )

 

Сколько слов в шаблоне могут подставляться при генерации

int sol_CountFGTemplateQuantors( HGREN_FGTEMPLATE hTemplate )

Возвращает:

Количество слов в шаблоне (в текущей версии - существительных), которые могут подставляться на другие слова с учетом согласований, при генерации текста из шаблона.

 

Степень завершенность синтаксического анализа для шаблона

int sol_CountFGTemplateRoots( HGREN_FGTEMPLATE hTemplate )

Возвращает:

Количество узлов верхнего уровня в минимальном графе после выполнения синтаксического анализа.

Синтаксический анализ выполняется для шаблона автоматически при его создании в sol_CreateFGTemplate. Обычно полностью успешный синтаксический анализ приводит к графу с 1 узлом верхнего уровня (2 специальных узла, отмечающих начало и конец предложения в данной функции не учитываются). Так как последующая корректная генерация предложений из шаблона во многом определяется успешностью синтаксического анализа исходного шаблона, то данная функция позволяет выявить слишком "сложные" или неверно интерпретируемые тексты.

 

Генерация текста из шаблона

int sol_GeneratePhrase3( HGREN_PHRASOMAT hBuilder,HGREN_FGTEMPLATE hTemplate,int PhraseType, wchar_t* NewPhrase,int maxlen)

Возвращает:

Количество символов, не считая терминирующего 0, записанных в NewPhrase

Аргументы:

PhraseType - управляет ходом генерации фразы. В текущей версии допускается только значение FG_SUBSTWORDS.

NewPhrase - буфер для записи сгенерированного текста

maxlen - максимальная вместимость буфера (в символах).

 

Задание списка запрещенных синонимов

void sol_StopSynonyms( HGREN_PHRASOMAT hBuilder, int n, const int* words_ie, bool use_thesaurus )

Синонимизатор не будет синонимизировать слова из списка. Программа Rewriter использует этот вызов для обработки списка стоп-слов из файла stopsyn.txt.

Аргументы:

hBuilder - дескриптор объекта генератора текста, созданного вызовом sol_CreatePhraseGenerator

n - число слов в списке

words_ie - индексы слов, запрещенных для синонимизации (см. sol_FindEntry).

use_thesaurus - использовать ли грамматически связанные с заданными в words_ie слова. 

Перефразирование и синонимизация

int sol_Paraphrase( HGREN_PHRASOMAT hBuilder, int ScenarioType, int SyntaxAnalysisFlags, int NGramFlags, int ThesaurusFlags, int DebugFlags, int ResultsFormat, int MaxSubst, const wchar_t* OrgPhrase, wchar_t* NewPhrase, int maxlen, int max_elapsed_msec )

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

Возвращает:

Кол-во символов, не считая терминирующего 0, записанных в NewPhrase

Аргументы:

ScenarioType - флаг выбора сценария модификации:

FG_SYNONYMIZE - случайным образом менять слова на синонимы.

FG_SYNONYMIZER_MULTIWORD - работать с многословными синонимами, в том числе - расшифровывать аббревиатуры.

FG_PARAFRASE_REORDER - менять порядок слов. В русском языке порядок слов достаточно свободен, в отличие от, к примеру, английского или китайского.

FG_PARAFRASE_CONSERVATIVE - консервативные (не меняющие семантику) преобразования, к примеру перестройка причастных и деепричастных оборотов.

FG_TRANSFORM - различные неконсервативные преобразования, в некоторых случаях они могут изменить смысл текста. Обычно этот сценарий меняет фрагменты

FG_RANDOMIZE - рандомизация, подстановка случайных слов с сохранением грамматической формы.

Вместе с флагом FG_RANDOMIZE употребляются следующие флаги для включения замены определенных частей речи:

FG_RND_NOUN - заменять существительные

FG_RND_ADJ - заменять прилагательные и причастия

FG_RND_VERB - заменять глаголы, инфинитивы и деепричастия

FG_RND_ADVERB - заменять наречия

SyntaxAnalysisFlags - управление морфологическим и синтаксическим анализатором:

FG_SIMPLE_ANALYSIS - упрощенный анализ, быстрый, но не дающий возможность отработать сценариям FG_PARAFRASE_REORDER, FG_PARAFRASE_CONSERVATIVE и ограничивающий результативность синонимизатора.

FG_PEDANTIC_ANALYSIS - особо тщательный, но медленный анализ.

NGramFlag - флаг учета N-грамм при синонимизации:

FG_NO_NGRAMS - не использовать N-граммы

FG_SYNONYMIZER_USES_NGRAMS - проверять возможность синонимизации по таблице N-грамм

FG_PEDANTIC_NGRAMS - тщательный и трудоемкий отсев вариантов

FG_OMIT_FREQ1 - игнорировать N-граммы с частотой 1

FG_2GRAMS - фильтровать по 2граммам

FG_23GRAMS - фильтровать по 2граммам, 3граммы для сортировки частоты

FG_3GRAMS - фильтровать по 2 и 3граммам

FG_4GRAMS - фильтровать по 2, 3 и 4граммам

FG_5GRAMS - фильтровать по 2, 3, 4 и 5граммам

FG_2345GRAMS - фильтровать по 2граммам, 3, 4 и 5 граммы для сортировки частоты

ThesaurusFlags - управление тезаурусом (зарезервированный флаг).

DebugFlags - отладка:

FG_DEBUG - печатать отладочные пометки в результирующий текст.

FG_DEBUG_HTML - печатать отладочные пометки в формате HTML в результирующий текст.

ResultsFormat - управление форматом результатов, выдаваемых в буфер NewPhrase:

FG_YIELD_PLAIN_TEXT - результаты выдаются без форматирования, как plain text

FG_YIELD_XML - результаты работы синонимизатора выдаются в формате XML

FG_YIELD_ALL_SYNS - в XML результатах будут выводится все найденные для каждого исходного слова синонимы

OrgPhrase - исходное (единственное) предложение.

NewPhrase - буфер для записи модифицированного предложения.

maxlen - максимальная вместимость NewPhrase.

max_elapsed_msec - максимальное отведенное для работы время в миллисекундах.

Перефразирование и синонимизация utf-8 текста

int sol_Paraphrase8( HGREN_PHRASOMAT hBuilder, int ScenarioType, int SyntaxAnalysisFlags, int NGramFlags, int ThesaurusFlags, int DebugFlags, int ResultsFormat, int MaxSubst, const char* OrgPhrase, char* NewPhrase, int maxlen, int max_elapsed_msec )

Отличается от sol_Paraphrase только тем, что принимает в OrgPhrase и возвращает в NewPhrase текст в кодировке utf-8. Эта функция введене специально для удобной работы под Linux.

Примеры использования API синонимизатора

Примеры на C++ и C# входят в состав SDK синонимизатора - см. описание консольной утилиты Rewriter.

Также в состав SDK входит простой пример синонимизатора на Delphi.

Дополнительные материалы

Алгоритмы русской морфологии

Дистрибутив SQL синонимизатора

Генератор случайного текста и имитатор текста

Рандомизатор

Синонимизатор

Перефразировщик

  © Elijah Koziev 2010
прикладные проекты на основе грамматического словаря API грамматической машины компоненты для доступа к грамматическому словарю условия получения SDK токенизатор и сегментатор морфологический анализ и синтез лемматизатор база N-грамм синтаксический анализатор словоформы морфология и синтаксис русского языка падеж число род совершенный и несовершенный вид экспорт в SQL формат экспорт в XML формат скрипт SQL словаря структура SQL словаря структура XML словаря компоненты для доступа к грамматическому словарю ORM Persistent Dictionary Library лемматизация стемминг примеры использования грамматического словаря склонение существительных в русском языке склонение русских прилагательных спряжение глаголов в русском языке поиск текста с учетом морфологии OCR подсистема расширенные регулярные выражения генератор текста генератор случайного текста и имитатор рандомизатор синонимизатор перефразировщик Статистика буквенных паттернов

Грамматический словарь русского языка



Грамматический словарь
склонение и спряжение глаголов, существительных, прилагательных

В состав входит русский и английский словарь.

платформа:  Windows 2000 ... Windows 7
требования: 512 Mb свободной памяти, 300 Мб на диске
размер:         34 Мб

  скачать грамматический словарь купить грамматический словарь SDK грамматического словаря
грамматический словарь русского языка



SDK Грамматического словаря



SDK Грамматического Словаря
склонение и спряжение глаголов, существительных, прилагательных

В состав входит русский и английский словарь.

платформа:  Windows 2000 ... Windows 7
размер:         13 Мб

SQL словарь (демо):
sqlite mysql oracle firebird mssql

скачать демо-версию SDK купить SDK API грамматического словаря



Поисковая система



Integra
настольная и сетевая поисковая система 

платформа:  Windows XP ... Windows 7
требования: 512 Mb свободной памяти
размер:         21 Мб

Дополнительные компоненты:
MySQL поисковый сервер 13.5 Мб
Integra.Premium MySQL 3.9 Мб

скачать поисковую систему SDK поисковой системыописание поисковой системы



SDK Поисковой системы



SDK Поискового движка
API для настольной и сетевой поисковая система 

платформа:  Windows XP ... Windows 7
размер:         17 Мб

Дополнительные компоненты:

MySQL поисковый сервер 13.5 Мб
Integra.Premium MySQL 3.9 Мб

скачать SDK SDK поисковой системы



Экранный переводчик



Translator
экранный переводчик

платформа:  Windows XP ... Windows 7
требования: 256 Mb свободной памяти
размер:         4.4 Мб

Дополнительные компоненты:
расширенный англо-русский словарь 6.4 Мб


скачать экранный переводчикописание экранного переводчика



изменено 25-Aug-11