Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
4 / 4 / 0
Регистрация: 11.10.2014
Сообщений: 108

Как правильно сделать автозамену слов

24.02.2016, 02:15. Показов 1623. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

У меня есть набор предложений. Например, Маша ела кашу и суп. Я хочу сделать возможным следующее, записать предложение в виде:

Маша 11 243 и 243


Тогда программа дойдя до 11 и 243 обратилась бы либо к базе данных, либо к списку слов в xml (нет представления, как лучше), а там было бы

11
ела
кушала
лопала

243
кашу
гречку
суп
котлету
рис

И было выбрано по одному слову из каждого списка, т.е.

"Маша лопала суп и котлету" или "Маша ела котлету и рис".

На чем это было правильно сделать и как? Планируется, что это будет сайт, нужна скорость работы. Задача вроде бы простая, но как минимум нужно исключить повторяемость еще, а то может получится "Маша ела кашу и кашу".
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.02.2016, 02:15
Ответы с готовыми решениями:

Как сделать автозамену в ворде?
как сделать автозамену в ворде 2007?

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

Как сделать постоянную автозамену текста в файле?
Как можно реализовать постоянную автозамену текста? <?php $file = fopen('test.txt','a+'); $filename = 'test.txt'; $array_content...

8
Модератор
Эксперт функциональных языков программирования
3135 / 2282 / 469
Регистрация: 26.03.2015
Сообщений: 8,884
25.02.2016, 09:44
Слова храните в БД.

Для выборки двух случайных слов из таблицы:
SQL
1
2
3
4
SELECT top 2 Name FROM
(SELECT Name, newid() rnd FROM MyTable
WHERE id = 243) t 
ORDER BY rnd
1
Заблокирован
26.02.2016, 17:22
Если у вас слов не слишком много, то можно задать
строковый массив. Ваша программа будет генерировать
случайные числа (индексы массива) и если эти числа не равны,
то они и будут определять слова, которые попадут в текст...
1
4 / 4 / 0
Регистрация: 11.10.2014
Сообщений: 108
01.03.2016, 10:54  [ТС]
Коллеги, спасибо, но в общем-то выборку я сама сделаю, тем более, как вижу, у вас MS SQL в запросе, а у меня MySQL. Каюсь, не сказала сразу, что это уже подготовлено.

Главная проблема не в этом, а самом скрипте для веба: у mysql не очень хорошие отношения с выборкой произвольного количества слов по random, это раз и что совсем плохо, нет ясности, как же все-таки избавиться от одинаковых слов в случае, если из таблицы для 243 в предложении Маша 11 243 и 243 выбрано селектом по рендому одно и то же слово.

Алгоритм хочется очень. То ли отбирать во временную таблицу все слова и добавлять условие: not in (select ...), то ли отдать это вообще на откуп прикладному приложению, не базе данных, может, оно и быстрей будет в смысле выборки.

Добавлено через 18 минут
Т.е. база получается крайне маленькая, мегабайта не будет. Если дать приложению считать это все в оперативную и дальше уже подставлять в ней же, может, будет получше, чем с базой, так думается.
Может, питон какой-то или что-то еще в этом роде. А может, найдется еще и человек, который такое напишет мне под веб, я бы даже заплатила без проблем.
0
Модератор
Эксперт функциональных языков программирования
3135 / 2282 / 469
Регистрация: 26.03.2015
Сообщений: 8,884
01.03.2016, 15:44
Цитата Сообщение от ElenaTomsk Посмотреть сообщение
у вас MS SQL в запросе, а у меня MySQL
UUID() вместо newid()
и вместо "top 2" в начале - "LIMIT 2" в конце

Добавлено через 1 час 35 минут
Цитата Сообщение от ElenaTomsk Посмотреть сообщение
Если дать приложению считать это все в оперативную и дальше уже подставлять в ней же, может, будет получше, чем с базой, так думается.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
void Main()
{
    Console.WriteLine(Replace("Маша {11} {243} и {243}."));
}
 
Dictionary<int,string[]> Replaces = new Dictionary<int,string[]> {
    { 11, new string[] {"ела", "кушала", "лопала"} },
    { 243, new string[] {"кашу", "гречку", "суп", "котлету", "рис"} },
};
string Replace(string input)
{
    Dictionary<int, int> wordsCounts = new Dictionary<int, int>();
    Regex regex = new Regex(@"\{\d+[\},:]", RegexOptions.IgnoreCase);
    return regex.Replace(input, delegate(Match match)
    {
        string value = match.ToString();
        value = value.Substring(1, value.Length - 2);
        int id = int.Parse(value);
        string[] arr = Replaces[id];
        int count;
        if(!wordsCounts.TryGetValue(id, out count))
            count = 0;
        wordsCounts[id] = count + 1;    
        return Shuffle(arr, count);
    });
}
 
Random rnd = new Random();
string Shuffle(string[] arr, int i)
{
   int j = rnd.Next(i, arr.Length);
   string temp = arr[i];
   arr[i] = arr[j];
   arr[j] = temp;
   return arr[i];
}
1
4 / 4 / 0
Регистрация: 11.10.2014
Сообщений: 108
02.03.2016, 13:46  [ТС]
Shamil1,

Спасибо, но все же ни один из вариантов, по-моему, не решает основную проблему: запрет на дублировать слова.
Т.е. если будет предложение:
"Маша 11 243 и 243, после чего еще решила 11 243, 243, 243 и еще 243", то слова из группы 243 повторяться не должны. В каждой группе достаточное количество слов, от 20 и более, но предложения могут быть сложносочиненные и сложноподчиненные.
0
Модератор
Эксперт функциональных языков программирования
3135 / 2282 / 469
Регистрация: 26.03.2015
Сообщений: 8,884
02.03.2016, 15:49
Лучший ответ Сообщение было отмечено ElenaTomsk как решение

Решение

Цитата Сообщение от ElenaTomsk Посмотреть сообщение
Спасибо, но все же ни один из вариантов, по-моему, не решает основную проблему: запрет на дублировать слова.
Что Вы передали на вход методу Replace(), что он выдал Вам повторения?

Программе всё равно, какие у Вас предложения. Для неё это набор символов. В пределах одного вызова Replace() слова повторяться не будут. Если слов не хватит, то программа бросит исключение.

Если Вам хочется глобально исключить повторения, то перенесите подсчёт слов (словарь wordsCounts) на уровень класса.
1
4 / 4 / 0
Регистрация: 11.10.2014
Сообщений: 108
07.03.2016, 08:15  [ТС]
Не работает это правильно в MySQL.

SQL
1
SELECT Mword FROM (SELECT Mword tw. Mword, UUID () rnd FROM tw) tbl_word t ORDER BY rnd LIMIT 2;
Возвращаются одни и те же два слова, сколько не запускай.
0
Модератор
Эксперт функциональных языков программирования
3135 / 2282 / 469
Регистрация: 26.03.2015
Сообщений: 8,884
07.03.2016, 13:30
Это потому что UUID() в MySQL возвращает одно и то же значение для всех строк. Замените на RAND().
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.03.2016, 13:30
Помогаю со студенческими работами здесь

Как по умолчанию убить автозамену?
Меня бесит вордовская автозамена! Постоянно пытается мне работу усложнить. Я печатаю, то что мне нужно - он подставляет, что в голову...

Как делать автозамену в готовом документе?
Я читаю законы, и нужно сокращать многие слова с помощью замены. Может кто знает, как это делать автоматически, во многих документах?...

Как реализовать автозамену смайликов на картинки
на странице есть блок с обсуждением, в тексте которого могут содержаться кусочки обозначающие смайлики, например: &quot;Этот тестовый ...

Как правильно дублировать в actionscript 2.0 и как правильно сделать объект для дублирования
Я только начал изучать actionscript и прошу мне помочь. Как правильно дублировать в actionscript 2.0 и как правильно сделать объект для...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru