Здравствуйте, недавно у меня возникли проблемы с одним очень не стандартным заданием. Скажу так, я начинающий программист, и мне как не странно, нужна ваша помощь! Мне дали задачу, написать генератор фраз(предложений). Нужно было создать 3 класса(словаря), в котором по отдельности были существительные, глаголы и прилагательные. Т.е., это выглядело примерно так:
1 класс: Дерево, бумага, самолет, стол и т.д.
2 класс: Радоваться, летать, смотреть и т.д.
3 класс: Желтое, кривое, легкое и т.д.
Так вот, между ними должно происходить генерирование, т.е. программа должна выбрать по одному слову из каждого класса и сложить в предложение, в моем случае может получиться так "Самолет летать красивое". И тут возникают проблемы! Между словами должно быть логическое сопряжение, и, что самое главное, правильно склоняться, чтобы получалось нормальное предложение.
Надеюсь вы поняли, что мне нужно! Буду очень благодарен за вашу помощь!
Не совсем школьное задание ⇐ 11 класс
Информация
Уважаемые школьники!
Вместе с заданиями размещайте и свои варианты решения. В противном случае ваше сообщение будет проигнорировано
Уважаемые школьники!
Вместе с заданиями размещайте и свои варианты решения. В противном случае ваше сообщение будет проигнорировано
-
Автор темыfie4fix
- Всего сообщений: 2
- Зарегистрирован: 31.05.2016
- Образование: студент
-
daslex
- Гениалиссимус

- Всего сообщений: 7818
- Зарегистрирован: 07.02.2016
- Образование: среднее
Re: Не совсем школьное задание
Меняй задание. Компьютер человеческой логике не научишь.
Образование среднее-низшее.
-
Синица
- романист

- Всего сообщений: 259
- Зарегистрирован: 08.12.2014
- Образование: высшее естественно-научное
Re: Не совсем школьное задание
Одно из возможных решений -- для каждого слова прописать грамматические свойства и составить словарь словоформ, индексированный этими свойствами. Потом выбирать нужную словоформу по свойству. Тогда можно будет строить предложения вроде: "Красивый самолёт летал/летает" или "Красивые розы цвели/цветут". Сборку предложения можно начинать с любого слова. Например, вытаскиваете по rnd "пела" -- глагол, ед. число, ж. р. => ищете словоформы существительного и прилагательного с этими же свойствами => "зелёная" + "собака". Получаете предложение: "Зелёная собака пела"...fie4fix:Надеюсь вы поняли, что мне нужно! Буду очень благодарен за вашу помощь!
-
daslex
- Гениалиссимус

- Всего сообщений: 7818
- Зарегистрирован: 07.02.2016
- Образование: среднее
Re: Не совсем школьное задание
Я могу показать рабочий пример генератора, написанный на C++, генерирующий предложения одного вида, но там могут быть таки фразы:
"Красная бумага стоит"
Нельзя научить ПК человеческой логике.
===============================
Классы не хранят данные, это я автору темы точно могу сказать. Хранят их в файлах, в контейнерах, в массивах, на сервере, в базе данных, но не в классах.
Если я буду показывать, то без классов, потому что классы тут ни причём.
А ещё противоречие есть, если не применять предлогов для управления падежами, то ничего и не получится. Либо препод не разбирается, либо он - козёл, либо ты там напросился на подобную задачу выпендрежом своего ума.
==============================
Автору темы будет тяжело понять пример кода, полагаю. Это сама по себе задача такого вида, которые тяжелы для начала учёбы.
Алгоритм может быть такой.
Словари, хранящие следующее:
1. Набор существительных. Каждое существительное во всех падежах для каждого из родов.
2. Набор прилагательных. Каждое прилагательное, ассоциируемое с существительным в определённом падеже, согласующееся с родом существительного.
3. Набор глаголов. Каждый глагол в трёх вариантах времени, согласующийся с родом существительного.
4. Варианты предлогов, сочетаемые с падежом, для каждого падежа.
В реализации поведения программы:
- Выбирается существительное.
- Выбирается падеж существительного.
- Выбирается ассоциируемое с выбранным существительным прилагательное (ассоциации две: род, падеж)
- Выбирается ассоциируемый по роду существительного глагол случайного времени.
=============================
Это я алгоритм очень упрощённый привёл, может где неточно выразился. Можно варьировать предлоги, но потом нужно будет конкатенировать строки (предлог + прилагательное, например). В предлагаемом мною коде предлоги и не варьируются, а просто существует один для каждого падежа, совместно со словом.
Из такого алгоритма можно генерировать простые предложения по схеме: предлог+прилагательное+существительное+глагол.
P.S. - такие вопросы надо спрашивать на форумах по программированию, а не на форумах по русскому языку, ещё и в ветке нужного языка программирования. Язык языку - рознь
"Красная бумага стоит"
Нельзя научить ПК человеческой логике.
===============================
Классы не хранят данные, это я автору темы точно могу сказать. Хранят их в файлах, в контейнерах, в массивах, на сервере, в базе данных, но не в классах.
Если я буду показывать, то без классов, потому что классы тут ни причём.
А ещё противоречие есть, если не применять предлогов для управления падежами, то ничего и не получится. Либо препод не разбирается, либо он - козёл, либо ты там напросился на подобную задачу выпендрежом своего ума.
==============================
Автору темы будет тяжело понять пример кода, полагаю. Это сама по себе задача такого вида, которые тяжелы для начала учёбы.
Алгоритм может быть такой.
Словари, хранящие следующее:
1. Набор существительных. Каждое существительное во всех падежах для каждого из родов.
2. Набор прилагательных. Каждое прилагательное, ассоциируемое с существительным в определённом падеже, согласующееся с родом существительного.
3. Набор глаголов. Каждый глагол в трёх вариантах времени, согласующийся с родом существительного.
4. Варианты предлогов, сочетаемые с падежом, для каждого падежа.
В реализации поведения программы:
- Выбирается существительное.
- Выбирается падеж существительного.
- Выбирается ассоциируемое с выбранным существительным прилагательное (ассоциации две: род, падеж)
- Выбирается ассоциируемый по роду существительного глагол случайного времени.
=============================
Это я алгоритм очень упрощённый привёл, может где неточно выразился. Можно варьировать предлоги, но потом нужно будет конкатенировать строки (предлог + прилагательное, например). В предлагаемом мною коде предлоги и не варьируются, а просто существует один для каждого падежа, совместно со словом.
Из такого алгоритма можно генерировать простые предложения по схеме: предлог+прилагательное+существительное+глагол.
P.S. - такие вопросы надо спрашивать на форумах по программированию, а не на форумах по русскому языку, ещё и в ветке нужного языка программирования. Язык языку - рознь
Образование среднее-низшее.
-
Автор темыfie4fix
- Всего сообщений: 2
- Зарегистрирован: 31.05.2016
- Образование: студент
-
daslex
- Гениалиссимус

- Всего сообщений: 7818
- Зарегистрирован: 07.02.2016
- Образование: среднее
Re: Не совсем школьное задание
Пример работы (с добавлением цикла): https://ideone.com/MjduTq
(прокрутить вниз, там будут генерированные фразы)
Код: Выделить всё
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <string>
using namespace std;
int main()
{
const int CountNouns = 3; //Число существительных (дерево, бумага, самолёт)
const int CountAdject = 3; //Число прилагательных (красный, зелёный, красивый)
const int CountAct = 2; //Число глаголов (стоит, летит)
const int CountSKL = 6; //Число склонений (в русском 6)
const int CountTime = 3; //Число времён для глагола (настоящее, будущее, прошлое)
// Именительный, Родительный, Дательный, Винительный, Творительный, Предложный, Род (ср,ж,м)
string Nouns[CountNouns][CountSKL + 1] = {
{"дерево", "дерева", "дереву", "дерева", "деревом", "дереве", "0"},
{"бумага", "бумаги", "бумаге", "бумаги", "бумагой", "бумаге", "1"},
{"самолёт", "самолёта", "самолёту", "самолёта", "самолётом", "самолёте", "2"}
};
string Adject[CountAdject][CountNouns][CountSKL] = {
{
{"Красное", "У красного", "К красному", "У красного", "Красным", "На красном"}, //(0,0,0),(0,0,1),(0,0,6)
{"Красная", "У красной", "К красной", "У красной", "Красной", "На красной"}, //(0,1,0),(0,1,1),(0,1,6)
{"Красный", "У красного", "К красному", "У красного", "Красным", "На красном"}
},
{
{"Зелёное", "У зелёного", "К зелёному", "У зелёного", "Зелёным", "На зелёном"}, //(1,0,0),(1,0,1),(1,0,6)
{"Зелёная", "У зелёной", "К зелёной", "У зелёной", "Зелёной", "На зелёной"}, //(1,1,0),(1,1,1),(1,1,6)
{"Зелёный", "У зелёного", "К зелёному", "У зелёного", "Зелёным", "На зелёном"}
},
{
{"Красивое", "У красивого", "К красивому", "У красивого", "Красивым", "На красивом"}, //(1,0,0),(1,0,1),(1,0,6)
{"Красивая", "У красивой", "К красивой", "У красивой", "Красивой", "На красивой"}, //(1,1,0),(1,1,1),(1,1,6)
{"Красивый", "У красивого", "К красивому", "У красивого", "Красивым", "На красивом"}
}
};
// Настоящее, Прошлое, Будущее
string Action[CountAct][3][CountTime] = {
{
{"стоит", "стояло", "встанет"}, //Средний род
{"стоит", "стоялa", "встанет"}, //Женский род
{"стоит", "стоял", "встанет"}, //Мужской род
},
{
{"летит", "летело", "полетит"}, //Средний род
{"летит", "летела", "полетит"}, //Женский род
{"летит", "летел", "полетит"}, //Мужской род
}
};
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
setlocale(LC_ALL,"");
srand(time(0));
//1. Выбор существительного
int Noun_word = rand() % CountNouns;
int Noun_case = rand() % CountSKL;
//2. Ассоциируем с прилагательным
int Adj_word = rand()%CountAdject;
int Adj_case = Noun_case;
int Act_word = rand() % CountAct;
int Act_Case = rand() % CountTime;
if (Nouns[Noun_word][CountSKL] == "0"){ //Если средний род
cout << Adject[Adj_word][0][Adj_case] << ' ' << Nouns[Noun_word][Noun_case] << ' ' << Action[Act_word][0][Act_Case];
}
else if (Nouns[Noun_word][CountSKL] == "1"){ //Если женский род
cout << Adject[Adj_word][1][Adj_case] << ' ' << Nouns[Noun_word][Noun_case] << ' ' << Action[Act_word][1][Act_Case];
}
else if (Nouns[Noun_word][CountSKL] == "2"){ //Если мужской род
cout << Adject[Adj_word][2][Adj_case] << ' ' << Nouns[Noun_word][Noun_case] << ' ' << Action[Act_word][2][Act_Case];
}
cout << '\n';
}
(прокрутить вниз, там будут генерированные фразы)
Образование среднее-низшее.
-
НаталияЛия
Re: Не совсем школьное задание
я бы сделала проще: замените прилагательные на наречия, например; быстро, хорошо и т.п., которые подойдут ко всем сказуемым и подлежащим
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
Мобильная версия