Nickolay.info. PHP. Генератор синтаксически правильного русского текста Geniot

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

Слово "гениот" принадлежит перу Григория Климова - лучшего из известных мне авторов, писавших о законах и тайных пружинах развития человеческого общества. Оно обозначает буквально "гениальный идиот", человек, чрезвычайно активно несущий заумную чушь и навязывающий другим эту чушь в качестве откровений. Такими гениотами кажется мне подавляющее большинство политиков и общественных деятелей, чья фразеология, возможно, повлияла на словарь программы, несущей подобный же бред :)

Описание скрипта Geniot, демо, ссылка для скачивания

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

Посмотреть в работе: ссылка (новое окно)

Скачать: geniot.zip, 17 Кб. Версия 1.0 (28.10.2008)

Написано 24-26 октября 2008 г. на PHP без использования MySQL, совместимо с любым PHP 4.0.2 и выше.

Настройки скрипта просты. В начале файла config.php можно изменить путь к папке с даннными скрипта и число создаваемых фраз по умолчанию:

//Путь к папке с файлами *.dat и *.txt, БЕЗ слеша в конце
$datapath="./data";
//Число выводимых фраз по умолчанию (параметр n)
$default_phrases = 100;

Можно создать собственные файлы data/head.inc и data/foot.inc, представляющие собой обычный HTML-код, выводимый в начале и в конце каждой страницы. В файле head.inc содержится также пример формы для вызова скрипта извне (настроена на URL http://127.0.0.1/geniot/index.php, т.е., при размещении на локальном хосте Windows скрипт можно кинуть в папку c:\\Inetpub\\wwwroot\\geniot).

Скрипт реагирует только на 2 параметра, передаваемые методом GET:

Пример вывова с параметрами: http://ваш_url/geniot/index.php?n=200&seed=10

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

Буду признателен, если вы пришлете мне что-либо полезное для развития скрипта. Также замечу, что скрипт не предназначен для SEO и создания поискового спама, если Вы используете его с подобными целями - это целиком остается на вашей совести.

Словари

Далее следует краткое описание файлов программы, сделанное для себя в процессе ее написания.

СУЩЕСТВИТЕЛЬНЫЕ: файл such.txt
слово 			род(м/ж/c) 		одушевленность(н/о) 	номер парадигмы из such.dat
Например:
абстракция ж н 11
МАССИВЫ В ПРОГРАММЕ:
$such['such_word']	$such['such_r']		$such['such_o']		$such['such_num']
КОЛИЧЕСТВО СУЩЕСТВИТЕЛЬНЫХ: $such_count

ФОРМЫ СУЩЕСТВИТЕЛЬНЫХ: файл such.dat
В каждой строке 12 окончаний - единственное, затем множественное число по падежам:
ИП (кто/что) РП (кого/чего) ДП (кому/чему) ВП (кого/что) ТП (кем/чем) ПП (о ком/о чем)
0 обозначает, что окончания нет.
Например:
0 а у 0 ом е а ов ам а ами ах #дом
Во всех файлах данных не читаются пустые строки и концы строк после знака #
МАССИВЫ В ПРОГРАММЕ:
$sp['sp_IP1'] $sp['sp_RP1'] $sp['sp_DP1'] $sp['sp_VP1'] $sp['sp_TP1'] $sp['sp_PP1']
$sp['sp_IP2'] $sp['sp_RP2'] $sp['sp_DP2'] $sp['sp_VP2'] $sp['sp_TP2'] $sp['sp_PP2']
КОЛИЧЕСТВО ПРИЛАГАТЕЛЬНЫХ: $sp_count
Функция генерации: word_such(ч,р,п,о)
При разборе всегда отбрасываем окончание слова в именительном падеже
единственного числа (если таковое есть), затем подставляем нужные окончания с конца слова.

ПРИЛАГАТЕЛЬНЫЕ: файл pril.txt
слово (м.р., ед.ч.) форма (1-10)
Например:
абстрактный 1
Массивы в программе:
$pril['pril_word']	$pril['pril_num']
КОЛИЧЕСТВО $pril_count
Например:
абсолютный 1

Формы прилагательных; файл pril.dat
Всего 21 окончание, сначала 16 для единственного числа
мужской род (5): ИП (Какой) РП (какого)  ДП (какому)  ВП - как ИП(*) ТП (каким)  ПП (о каком) //0-4
женский род (6): ИП (Какая) РП (какой)   ДП (какой)   ВП (какую)     ТП (какой)  ПП (о какой) //5-10
средний род (5): ИП (Какое) РП (какого)  ДП (какому)  ВП - как ИП(*) ТП (каким)  ПП (о каком) //11-15
                   затем 5 для множественного числа
множ. число (5): ИП (Какие) РП (каких)   ДП (каким)   ВП - как ИП(*) ТП (какими) ПП (о каких) //16-20
**** - формы нет в файле, она может определяться программно.
Массивы в программе - $pp[]. Их 24 (с учетом отсутствующих в файле падежей)
$pp['pp_IPM1'] $pp['pp_RPM1'] $pp['pp_DPM1'] $pp['pp_VPM1'] $pp['pp_TPM1'] $pp['pp_PPM1'] - Муж. 6 пад.ед.ч.
          Z                                                                               - Жен. 6 пад.ед.ч.
          S                                                                               - Сред.6 пад.ед.ч.
$pp['pp_IP2']  $pp['pp_RP2']  $pp['pp_DP2']  $pp['pp_VP2']  $pp['pp_TP2']  $pp['pp_PP2']  - Все, 6 пад.мн.ч.
КОЛИЧЕСТВО $pp_count
Например:
ый ого ому ым ом ая ой ой ую ой ой ое ого ому ым ом ые ых ым ыми ых
Функция генерации: word_pril(ч,р,п,о)

ГЛАГОЛЫ: файл glag.txt
слово (неопр.форма)  парагдигма (1-44) 						  glag_word glag_num
есть ли причастия: 5 штук - дейст.наст. и прош., страд.наст. и прош., деепр.	  glag_prich (5)
соверш.вид (что сделать), н - несоверш. (что делать)				  glag_v
управляет ли род.падежом : н - никогда, п - может, с - всегда			  glag_p (5)
управляет ли дат.падежом : н - никогда, п - может, с - всегда
управляет ли вин.падежом : н - никогда, п - может, с - всегда;  м - модальный 
управляет ли твор.падежом : н - никогда, п - может, с - всегда; 
                              для модальных - вид второго: н, б или * (любой)
управляет ли пред.падежом (с предлогом о):н - нет, п - может, с - всегда
управляет ли обст.места (где?) : н - нет, п - может, с - всегда		          glag_ob (3)
управляет ли обст.обр.действ. (как?) : н - нет, п - может, с - всегда
управляет ли обст.места (куда?) : н - нет, п - может, с - всегда
Например:
абстрагировать      2 +++-+ н ннпнн ппн
КОЛИЧЕСТВО $glag_count

Формы глаголов: файл glag.dat
 --- окончание определяется отбрасыванием от слова окончания неопределенной формы
 --- ? обозначает, что форма не существует
$gp[]		19 элементов
неопр. форма                                                                //0       gp_NF
я... ты... он... мы... вы... они...  (настоящее время по лицу и числу)      //1-6  
                                           //gp_PNVED1 gp_PNVED2 gp_PNVED3 gp_PNVMN1 gp_PNVMN2 gp_PNVMN3
он_совал она_совала оно_совало они_совали (прошедшее время по роду и числу) 
                                           //7-10 gp_PPVED3M gp_PPVED3Z gp_PPVED3S gp_PPVMN3
для будущего времени также учесть
#буду  будешь  будет  будем  будете  будут
ты_делай вы_делайте (повелительное наклонение)                              //11-12   gp_PNED, gp_PNMN,
включающий включавший (действит. пр. - наст. и прош. время)  ДЗ            //14-14   gp_PDZNV gp_PDZPV
включаемый включенный (страдат. пр. - наст. и прош. время)   СЗ            //15-16   gp_PSZNV gp_PSZPV
включая включав (деепричастие - наст. и прош. время)                       //17-18   gp_DNV gp_DPV
Например:
ть ю ешь ет ем ете ют л ла ло ли й йте ющий вший емый нный я в
КОЛИЧЕСТВО $gp_count
Функция генерации:
глаг0(число,род,лицо,время?,залог,падеж,одушевленность,
       двин.падеж.,дтворит.падеж,ддат.падеж,дместа,двремени)
число 
лицо = 1,2,3
время = НФ(неопр.форма) ДЕЕП, ППВ ПНВ (причастия прош. и наст. времени),  ? любое значение
залог = ДЗ СЗ
падеж = ИП РП ДП ВП ТП ПП
двп,дтп,ддп,дм,дв = - или + или * (любое)

НАРЕЧИЯ и прочие слова: файл nar.txt
$nar['nar_word']	$nar['nar_cat']
Например:
архиважно как
КОЛИЧЕСТВО $nar_count

личмест (число,род,лицо,падеж) - генеирует личные местоимения.
#я меня мне меня мной мне      //число ед., любой род, лицо 1, 6 падежей
#ты тебя тебе тебя тобой тебе  //число ед., любой род, лицо 2, 6 падежей
#он его ему его им нем         //число ед., муж.род, лицо 3, 6 падежей
#она ее ей ее ей ней           //число ед., жен.род, лицо 3, 6 падежей
#оно его ему его им нем        //число ед., ср.род, лицо 3, 6 падежей
#мы нас нам нас нами нас       //число множ., любой род, лицо 1, 6 падежей
#вы вас вам вас вами вас       //число множ., любой род, лицо 2, 6 падежей
#они их им их ими них          //число множ., любой род, лицо 3, 6 падежей
См. также функции sebya(), budu() в коде.

Правила и парадигмы фраз

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

фраза = #$phrase в главной программе
        случайное число(ч) #get_ch
        случайное существительное(р,о) #gen_such
        случайное существительное(р1,о1) 
        случайное время(в) #get_vr
        случайное время(в1)
        1.      гп(ч,р,ИП,о) + гс(ч,р,3,в) + тчк #gen_gp gen_gs
        2.      до + зпт + гп(ч,р,ИП,о) + гс(ч,р,3,в) + тчк #gen_do 
        3.      гс(ч,р,3,в) + гп(ч,р,ИП,о) + "и" + гс(ч,р,3,в) + тчк
        4.      гп(ч,р,ИП,о) + гс(ч,р,3,в) + тчкзпт + личмест(ч,р,3 ИП) + гс(ч,р,3,в1) + тчк
        5.      гп(ч,р,ИП,о) + гс(ч,р,3,в) + "и" + гс(ч,р,3,в) + тчк
        6.      гп(ч,р,ИП,о) + гс(ч,р,3,в) + зпт + "но не" + гс(ч,р,3,в) + тчк
        7.      гп(ч,р,ИП,о) + тире + "это" + гп(ч,р1,ИП,о1) + тчк
        8.      гп(ч,р,ИП,о) + воскл + гс(ч,?,?,ПН) + воскл
        9.      гп(ч,р,ИП,о) + воскл + "не" + гс(ч,?,?,ПН) + воскл
        10.     гс(ч,р,2,в) + зпт + гп(ч,р,ИП,о) + зпт + "или" + гс(ч,р,2,в) + впр
        11.     личмест(ч,р,2,ИП) + зпт + гп(ч,р,ИП,о) + зпт + гс(ч,р,2,в1) + тчк
        12.     гп(ч,р,ИП,о) + зпт + "не" + до + зпт + гп(ч,р1,РП,о1) + тчк
        13.     гп(ч,р,ИП,о) + зпт + глаг0(ч,р,2,в,'?','?',о,'+','+','+','+','+') + "ли" + 
                   личмест(ч,р,2,ИП)  + зпт + гс(ч,р,2,в) + "или" + гс(ч,р,2,в) + впр
        14.     гп(ч,р,ИП,о) + гс (ч,р,3,в) + зпт + до + тчк
        15.     личмест(ч,р,1,ИП)+гс(ч,р,3,в)+"прочее слово"(как)+"и"+"прочее слово"(как)+зпт+до+                    
                   зпт + глаг0(ч,р,?,НФ,?,?,о,'-','-','-','-','*') + сущ (ч,р1,ТП,о1) + тчк
        16.     гп(МН,р,ИП,о)+зпт+"прочее слово"(куда)+гс(МН,?,?,ПН)+тчк
        17.     до + гп(ч,р,ИП,о) +"прочее слово"(когда)+гс(ч,р,2,ПВ)+тчк
 
гп(ч,р,п,о) = #ген.подлежащее (сущ.) число-род-падеж-одушевленность gen_gp
        случайное число(ч1)
        случайное существительное(р1,о1)
        1.      гп0(ч,р,п,о)                             #Существительное gen_gp0
        2.      гп0(ч,р,п,о) + гп0(ч1,р1,РП,о1)          #Существительное существительного
        3.      гп0(ч,р,п,о) + зпт + по(ч,р,п,о) + зпт   #Существительное, существительное
        4.      по(ч,р,п,о) + гп0(ч,р,п,о)               #Прилагательное Существительное gen_po

гп0(ч,р,п,о) = #gen_gp0
        случайное число(ч1)
        случайное существительное(р1,о1)
        1.      сущ(ч,р,п,о) #word_such                               #компьютер
        2.      прил(ч,р,п,о) + сущ(ч,р,п,о) #word_pril               #активный компьютер
        3.      прил(ч,р,п,о) + прил(ч,р,п,о) + сущ(ч,р,п,о)          #активный осмелевший компьютер
        4.      сущ(ч,р,п,о) + сущ(ч1,р1,РП,о1)                       #вертолеты анархий
        5.      сущ(ч,р,п,о) + прил(ч1,р1,РП,о1) + сущ(ч1,р1,РП,о1)   #вертолеты естественных анархий
        6.      сущ(ч,р,п,о) + сущ(ч1,р1,РП,о1) + прил(ч,р,п,о)       #вертолеты анархий естественных 
        7.      прил(ч1,р1,РП,о1) + сущ(ч1,р1,РП,о1) + сущ(ч,р,п,о)   #естественных анархий вертолеты 
        8.      "себя"(п)     ----- при п!=ИП


гс(ч,р,л,в) = #Ген. сказуемое (глагол): число-род-лицо-время gen_gs
        1.      гс0(ч,р,л,в,-,-,-,-,-)
        2.      гс0(ч,р,л,в,-,-,-,+,дв) + гс0(-,-,-,НФ,-,-,-,- дв)
        3.      гс0(ч,р,л,в,-,-,-,-,-) + зпт + до + зпт #gen_do

гс0(ч,р,л,в,двп,дтп,ддп,дм,дв) = $gen_gs0
        случайное число(ч1)
        случайное число(ч2)
        случайное существительное(р1,о1)
        случайное существительное(р2,о2)
        если в!=НФ то дв=*
        1.      глаг(ч,р,л,в,-,-,-,дм,дв)
        2.      глаг(ч,р,л,в,-,-,-,дм,дв) + обст.места
      ----- далее только при дм!=+
        3.      глаг(ч,р,л,в,-,-,+,-,дв) + гп0(ч1,р1,ДП,о1)
        4.      глаг(ч,р,л,в,-,+,-,-,дв) + гп0(ч1,р1,ТП,о1)
        5.      глаг(ч,р,л,в,+,-,-,-,дв) + гп0(ч1,р1,ВП,о1)
        6.      гп0(ч2,р2,ТП,о2) + глаг(ч,р,л,в,+,+,-,-,дв)
                   + гп0(ч1,р1,ВП,о1)
        7.      глаг(ч,р,л,в,+,+,-,-,дв) + гп0(ч2,р2,ВП,о2)
                   + гп0(ч1,р1,ТП,о1)
        8.      глаг(ч,р,л,в,+,-,+,-,дв) + гп0(ч2,р2,ВП,о2)
                   + гп0(ч1,р1,ДП,о1)

по(ч,р,п,о) = #причастный оборот: число-род-падеж-одушевленность gen_po
        1.      по0(ч,р,ПНВ,ДЗ,п,о) #падеж настоящего времени - действительный залог
        2.      по0(ч,р,ППВ,ДЗ,п,о)
        3.      по0(ч,р,ПНВ,СЗ,п,о)
        4.      по0(ч,р,ППВ,СЗ,п,о) #падеж прошедшего времени - страдательный залог

по0(ч,р,в,з,п,о) = #причастный оборот gen_po0
        случайное число(ч1)
        случайное число(ч2)
        случайное существительное(р1,о1)
        случайное существительное(р2,о2)
        1.      прич(ч,р,в,з,п,о,-,-,-,-,*)
        2.      прич(ч,р,в,з,п,о,-,-,-,-,*) + обст.места #gen_obstmesta
        3.      прич(ч,р,в,з,п,о,-,-,+,-,*) + гп0(ч1,р1,ДП,о1)
        4.      прич(ч,р,в,з,п,о,-,+,-,-,*) + гп0(ч1,р1,ТП,о1)
      ----- далее только при з==ДЗ
        5.      прич(ч,р,в,з,п,о,+,-,-,-,*) + гп0(ч1,р1,ВП,о1)
        6.      гп0(ч2,р2,ТП,о2) + прич(ч,р,в,з,п,о,+,+,-,-,*)
                   + гп0(ч1,р1,ВП,о1)
        7.      прич(ч,р,в,з,п,о,+,+,-,-,*) + гп0(ч2,р2,ВП,о2)
                   + гп0(ч1,р1,ТП,о1)
        8.      прич(ч,р,в,з,п,о,+,-,+,-,*) + гп0(ч2,р2,ВП,о2)
                   + гп0(ч1,р1,ДП,о1)

обст.места = #gen_obstmesta
        случайное число(ч)
        случайное существительное(р,о)
        1.      "прочее слово"(где) #word_other
        2.      "прочее слово"(где...) + гп0(ч,р,РП,о)
        3.      "в" + гп0(ч,р,ПП,о)

до = #деепричастный оборот gen_do
        случайное число(ч)
        случайное число(ч1)
        случайное существительное(р,о)
        случайное существительное(р1,о1)
        1.      деепр(-,-,-,-,*)
        2.      деепр(-,-,-,-,*) + обст.места
        3.      деепр(-,-,+,-,*) + гп0(ч,р,ДП,о)
        4.      деепр(-,+,-,-,*) + гп0(ч,р,ТП,о)
        5.      деепр(+,-,-,-,*) + гп0(ч,р,ВП,о)
        6.      гп0(ч,р,ТП,о) + деепр(+,+,-,-,*) +','+ гп0(ч,р,ВП,о) #p1,o1?
        7.      деепр(+,+,-,-,*) + гп0(ч,р,ВП,о) + гп0(ч,р,ТП,о) #p1,o1?
        8.      деепр(+,-,+,-,*) + гп0(ч,р,ВП,о) + гп0(ч,р,ДП,о) #p1,o1?
        9.      деепр(-,-,-,-,*) + и + деепр(-,-,-,-,*)
       10.      деепр(-,-,-,-,*) + глаг0(ч,р,?,НФ,?,?,о,-,-,-,-,*)

деепр(двп,дтп,ддп,дм,дв) = #gen_deepr
        глаг0(?,?,?,ДЕЕП,?,?,?,двп,дтп,ддп,дм,дв)

глаг(ч,р,л,в,двп,дтп,ддп,дм,дв) = #gen_glag
        глаг0(ч,р,л,в,?,?,?,двп,дтп,ддп,дм,дв) #word_glag0

прич(ч,р,в,з,п,о,двп,дтп,ддп,дм,дв) = #gen_prich
        если з==СЗ то двп=+
        если в==ППВ и з==СЗ то дв=+
        если в==ПНВ и з==ДЗ то дв=-
        если в==ПНВ и з==СЗ и ддп==+ то дв=-
        если в==ПНВ и з==СЗ и ддп==- то дв=+
        глаг0(ч,р,?,в,з,п,о,двп,дтп,ддп,дм,дв) #word_glag0

В исходнике оставлено много закомментаренной отладочной печати вида

//print "<br>...";

Рейтинг@Mail.ru
вверх гостевая; E-mail