Пользователь
0,0
рейтинг
31 июля 2013 в 08:20

Разработка → Подбор мнемонических цитат для автомобильных и телефонных номеров из песочницы

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

Приведу пример: Если кодировать цифры согласными буквами, то каждое слово или предложение соответствует целому числу. Обычно выбирают следующий способ кодирования 1-р, 2-д, 3-т, 4-ч, 5-п, 6-ш, 7-с, 8-в, 9-м (потому что 9 это “много”). Тогда слова “добрый мой приятель” соответствуют числу 219513. Но это несколько неудобно, поскольку без специальной подготовки не получается быстро выкинуть ненужные буквы, тем не менее, “добрый мой приятель” забыть довольно сложно, что всегда позволит вам находясь в спокойной обстановке вспомнить число 219513. И это весьма заманчиво, поскольку само по себе число это является весьма абстрактным и может запросто перепутаться с другими такими же абстрактными числами.


Существует довольно много информации по мнемотехнике, здесь я старался не изобретать велосипедов, а использовать возможности подбора текста, которые довольно затруднительно использовать без помощи вычислительной системы.
На всякий случай определение из Википедии: Мнемоника (греч. искусство запоминания), мнемотехника — совокупность специальных приёмов и способов, облегчающих запоминание нужной информации и увеличивающих объём памяти путём образования ассоциаций (связей). Замена абстрактных объектов и фактов на понятия и представления, имеющие визуальное, аудиальное или кинестетическое представление, связывание объектов с уже имеющейся информацией в памяти различных типов для упрощения запоминания.

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

Кодирование по первым буквам


Первоначальная идея заключалась в том, чтобы попробовать подобрать цитату из стихотворной части школьной программы, которая бы соответствовала заданному автомобильному номеру, то есть некоторой случайной последовательности буква-три_цифры-две_буквы (обычный номер без кода региона). При этом предполагалось, что первая буква даёт начало первому слову, каждая из трёх цифр кодируется согласной, каждая из которых также даёт начало слову и последние две буквы — ещё два слова. Притом в российском автомобильном номере не могут содержаться любые буквы, используются только 12 из них это: а, в, с, е, н, т, м, о, к, р, у, х. Было взято несколько крупных стихотворений: Евгений Онегин, Полтава, Руслан и Людмила, Ромео и Джульета + басни Крылова. В процессе анализа генерируется 1000 случайных номеров, для которых подбирается цитата из этих произведений
Был написан следующий скрипт:
#!/usr/bin/php
<?php
$path="school/";
$letters = array("а", "в", "с", "е", "н", "т", "м", "о", "к", "р", "у", "х");
$numbers = array("о", "р", "д", "т", "ч", "п", "ш", "с", "в", "м");

// получение случайного элемента из массива (отличие от array_rand в том, что возвращается значение, а не ключ)
function rn($a) { return $a[rand(0, count($a)-1)]; }

// получение длины и максимально возможной генерируемой последовательности
function getmax($handle, $required) {
	$result=array(); $max = 0; $queue = array();
	fseek($handle, 0);
	while (($buffer = fgets($handle, 4096)) !== false) {
		$words=explode(" ", $buffer);
		for ($j=0;$j<count($words); $j++) {
			// обрезаем лишние символы и понижаем регистр
			$w = mb_strtolower(trim($words[$j], " \t.,\n\r0123456789:-!;?"), "UTF-8");
			if (!$w) continue;
			$queue[]=$w;
			
			$avail = min(count($required), count($queue));
			$match = $avail; 
			for ($k=0;$k<$avail;$k++) {
				if (mb_strpos($queue[$k], $required[$k], 0, "UTF-8")!==0) {
					$match = $k; break;
				}
			}
			
			if ($max<$match) $max=$match;
			if ($match===count($required)) {
				$result[]=array_splice($queue, 0, $match);
				return array($max, $result);
			}
			
			if (count($queue)>=count($required))
				array_shift($queue);
		}
	}
	return array($max, $result);
}

$plates = array();
for ($i=0;$i<1000;$i++) $plates[]=array(rn($letters), rn($numbers), rn($numbers), rn($numbers), rn($letters), rn($letters));

$files=scandir($path);

for ($i=0;$i<count($files);$i++) { 
	if (is_dir($path.$files[$i])) continue;
	
	$handle = @fopen($path.$files[$i], "r");

	if ($handle) {
		$cnt=array(0,0,0,0,0,0,0); $max = 0; $avg = 0; $best = array();
		
		for ($j=0;$j<count($plates);$j++) {
			list($c, $seq) = getmax($handle, $plates[$j]);
			if (($max && $max<$c) || !$max) { $max = $c; $best=array(implode("", $plates[$j])=>$seq);}
			else if ($max===$c) $best[implode("", $plates[$j])]=$seq;
			$cnt[$c] += 1;
			$avg += $c;
		}
		$avg/=count($plates);
		print $files[$i]."\t".$avg;
		for ($j=0;$j<count($cnt);$j++) print "\t".$cnt[$j];
		print "\n";
		print_r($best);

	    fclose($handle);
	}
}


Если немного прокомментировать код, то все поступающие слова складываются в очередь, которая растёт не больше длины подбираемой последовательности. Длина максимального совпадения запоминается. Таким образом выясняется максимальное количество букв от начала, которые можно закодировать при помощи некоторого текста.

Результаты следующие:
Название Среднее 0 1 2 3 4 5 6 Объём
Басни Крылова 2.434 0 35 530 403 30 2 0 83Кб
Евгений Онегин 3.237 0 0 120 549 306 24 1 1.1Мб
Полтава 2.507 0 17 510 424 47 2 0 85Кб
Ромео и Джульетта 2.821 0 36 239 598 122 5 0 219Кб
Руслан и Людмила 2.617 0 68 359 469 97 6 1 138Кб


Можно сказать, что эти результаты меня не обрадовали, получается, что только для двух номеров из 1000 получилось подобрать цитату. Посмотрим на эти две цитаты: м052рк — “мой. Они, пристрастною душой Ревнуя к”; о817вс — “От воспалённого Руслана Сокрылись вдруг среди”. Некоторая логика в этих фразах конечно присутствует, но незаконченность и обрывчатость делает их запоминание не слишком простым делом. Тем не менее, тесты позволили сказать, что даже на основе этих текстов в большинстве случаев получается генерировать последовательность для трёх букв.

Конечно же я заинтересовался: что происходит когда тексты становятся больше? Быть может появляется большее количество фрагментов, из которых уже можно выбрать. Для следующего теста я выбрал из библиотеки Мошкова: два завета библии в синодальном переводе, все крупные стихи Бодлера, все романы Достоевского, “Хоббит, или Туда и обратно”, все романы Пушкина в стихах, всего Шекспира, все романы Толстого. Были получены следующие результаты:

Название Среднее 0 1 2 3 4 5 6 Объём
Ветхий завет 3.09 0 0 188 557 235 17 3 1.1Мб
Новый завет 3.126 0 13 180 498 289 17 3 1.5Мб
Достоевский 4.053 0 0 10 206 526 237 21 15Мб
Толкиен 3.12 0 10 148 581 234 27 0 807Кб
Пушкин 3.234 0 0 114 565 295 25 1 1.2Мб
Бодлер 2.943 0 4 231 594 160 11 0 461Кб
Шекспир 4.489 0 0 0 49 474 416 61 64Мб
Толстой 3.96 0 0 8 236 555 190 11 11Мб


Самих цитат получилось довольно много, чтобы не утомлять читателя я не буду приводить их все, только упомяну, что их характер остался прежним, какой-то незаконченно-загадочный: в488ом — “Вот что, Ваня верь одному: Маслобоев”, т380тт — “три тысячи, вскричал он, три тысячи”, м081не — “мне от вас рабство наслаждение. Есть”. Прочитав их все посещает мысль о каких-то гаданиях, которые устраивают по книгам (когда открывают случайную страницу, читают случайную строку и пытаются это как-то интерпретировать в рамках собственной жизни). Но я таких целей не ставил.


График зависимости среднего от десятичного логарифма объёма (по Y — среднее, плюс-минус стандартное отклонение, а по X — логарифм объёма используемого текста)

В принципе, такой вид зависимости можно было угадать, здесь немного выбиваются только два томика Библии, а в остальном среднее растёт пропорционально логарифму объёма.

Кодирование по длинам


Первое что приходит в голову это то что способ кодирования слишком много текста оставляет вне рассмотрения, то есть для цифр берутся только 10 букв и для букв 12, остальные слова только разрывают цепочки. Конечно, можно придумать другие способы кодирования, которые используют все буквы или хотя бы только согласные. Эти способы описаны в литературе, но моя идея заключалась в том, чтобы сделать простой в использовании инструмент, такой чтобы пользователь не ломал голову над тем как же соответствует фраза этому номеру, какие нужно выбрасывать буквы, а какие учитывать, в противном случае можно было бы применять кодирование до первой значимой буквы, оно даёт однозначность, но не удобно для человека. Пришла идея кодировать цифры количеством букв в слове. При таком кодировании возникает проблема представления ноля, но пока не будем на этом останавливаться. Для того чтобы сравнить я провёл серию тестов на том же наборе и по тем же правилам (код почти тот же, по этой причине листинг был бы одним повторением):

Название Среднее 0 1 2 3 4 5 6 Объём
Басни Крылова 2.831 0 96 203 490 197 13 1 83Кб
Онегин 3.497 0 96 85 166 536 113 4 1.1Мб
Полтава 2.808 0 96 231 459 199 13 2 85Кб
Ромео и Джульетта 3.149 0 96 116 377 371 34 6 219Кб
Руслан и Людмила 2.94 0 96 178 443 258 23 2 138Кб


Можно сказать, что ситуация гораздо лучше, только сразу же настораживает одинаковое число 96 в столбике “1”, здесь посчитаны номера, для которых нашлось слово на первую букву, но не нашлось на первую цифру. Это естественно номера начинающиеся на ноль, около 100 таких номеров ещё в столбцах 2 и 3, как можно заметить, их не больше 85. Пример получившейся цитаты: в325нм — “вам: рад бы… право не могу”. Обрывчатость в случае со стихами можно компенсировать тем, что приводить цитату от начала строки, пользователю потребуется дополнительно запомнить где в стихотворении начинается номер, например, приведённая цитата должна выдаваться как: “Клянусь вам: рад бы… право не могу.” или даже вместе с предыдущей строкой: “Ах, милостивый рыцарь, Клянусь вам: рад бы… право не могу”. Но так уже перестаёт быть явным начало фразы. Если запоминать начало фразы, то можно и запомнить положение нолей отдельно. Возможно кому-то покажется такая идея издевательством, но я считаю её применимой по крайней мере.
Применение этой идеи даёт следующие результаты:

Название Среднее 0 1 2 3 4 5 6 Объём
Басни Крылова 3.444 0 0 114 426 367 88 5 83Кб
Онегин 4.26 0 0 2 93 596 261 48 1.1Мб
Полтава 3.413 0 0 132 414 367 83 4 85Кб
Ромео и Джульетта 3.791 0 0 39 298 508 143 12 219Кб
Руслан и Людмила 3.611 0 0 83 356 445 99 17 138Кб
Ветхий завет 4.189 0 0 5 126 585 243 41 1.1Мб
Новый завет 4.292 0 0 3 83 581 285 48 1.5Мб
Достоевский 5.019 0 0 0 0 208 565 227 15Мб
Толкиен (Хоббит) 4.123 0 0 2 155 587 230 26 807Кб
Пушкин 4.251 0 0 3 94 593 269 41 1.2Мб
Бодлер 3.946 0 0 18 214 591 158 19 461Кб


По этим данным можно предположить, что для случайного номера с вероятностью 22% можно подобрать соответствующую цитату из Достоевского, уже не плохо. Цитаты конечно получаются весьма многозначительными, как и в прошлом случае: в725вр — “весело смотрит за нашей весёлой работой”, м582то — “мои слова казалось её тронули, она”, м385нс — “между тем каким-то чудом необыкновенное сходство”, к514нт — “кровавой битве и день настал толпы”.

А что если генерировать не для автомобильных номеров, а для телефонных? Сказано — сделано:

Название Среднее 1 2 3 4 5 6 7
Басни Крылова 4.145 0 23 270 387 214 71 35
Онегин 5.248 0 0 9 260 347 242 142
Полтава 4.131 0 16 293 385 193 76 37
Ромео и Джульетта 4.608 0 0 138 374 286 146 56
Руслан и Людмила 4.349 0 11 212 381 256 93 47


Эти результаты позволяют предположить, что для шестизначного случайного номера с вероятностью почти 40% найдётся соответствующая цитата из произведения “Евгений Онегин”, а это ведь стихи, которые гораздо приятней к запоминанию (не для всех скорее всего, но для большинства всё же, я надеюсь).

Другие способы


Какие ещё возможности остались за кадром: генерация текстов, а именно генерация соответствующих слов или предложений определённой структуры (с нужным количеством букв или ещё как) в принципе это уже давно сделано и без компьютеров. Указанный в литературе учебник предлагает для каждого числа от 0 до 1000 какое-то слово, которое уже подобрано автором, но, к сожалению, такой способ не даёт возможности запоминать большие числа, поскольку образы нельзя соединять, это по словам автора приводит к их стиранию. Оно и понятно, всё начинает наслаиваться и так далее. Вот например простой способ: можно закодировать цифры распространёнными ассоциациями — 3 (от 03) — врач, 7 — топор (из-за формы) и например 5 — пятница. В этом случае подобрав для каждой цифры по три образа (для каждого положения) все трёхзначные числа можно закодировать очень яркими историями вроде “375 — врача зарубили в пятницу”, но так можно запомнить только очень небольшое количество чисел, потому что всё начнёт мешаться, нужно проводить дополнительные параллели, чтобы запомнить когда именно зарубили врача в этот раз.

Заключение


Алгоритм генерации по длинам слов реализован в приложении, которое распознаёт номера авто на мобильных устройствах и является некоммерческой разработкой just for fun. Кроме того, такой подбор осуществляется на сайте YaZapomnil [2].

Мне показался довольно интересным тот факт, что разнообразие текстов относительно таких странных метрик как последовательность количеств букв или последовательность первых букв слов растёт при увеличении объёма текста. Притом результаты довольно хорошо ложатся на прямую. При увеличении текста возрастает возможность выбора между фрагментами, это возможно улучшит их качество.

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

Ссылки


  1. Козаренко В. А. Учебник мнемотехники, 2002, электронная публикация
  2. Подбор цитаты по числу yazapomnil.ru/n/
@parsifal
карма
22,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (12)

  • +5
    2355990 =>
    И если бы сам Шнейдер явился теперь из Швейцарии взглянуть на своего бывшего ученика и пациента, то и он, припомнив то состояние, в котором бывал иногда князь в первый год лечения своего в Швейцарии, махнул бы теперь рукой и сказал / бы, / как / тогда: / «Идиот!
    / Учительша, / прискакав в Павловск, явилась прямо к расстроенной со вчерашнего дня Дарье Алексеевне и, рассказав ей всё, что знала, напугала ее окончательно.


    Текст какой-то сложноватый для запоминания человеком, который не осилил 7 цифр.
    • 0
      согласен, в прозе довольно длинные предложения, а значимым является только небольшой фрагмент, со стихами как-то лучше. Не все цитаты получаются хорошими, безусловно, они выбираются автоматически и на данный момент до первой попавшейся, если будет больше текстов можно добавлять функции оценки качества цитаты
  • 0
    665 => Избушка там на / курьих / ножках / Стоит без окон, без дверей

    Или я не понял метода, или должно быть ШШП и не должно быть букв р, д, т, ч, с, в, м. Тем не менее я вижу только одну Ш не вижу вообще п. Зато вижу несколько р, с, д.

    Поясните.
    • 0
      это подбор по длинам слов: курьих = 6 букв, ножках = 6 букв, стоит = 5 букв. Слэш предшествует слову, которое имеет соответствующее количество букв, слова идут подряд, цитата приводится от начала строки
    • 0
      Пришла идея кодировать цифры количеством букв в слове.

      Все уже пояснено ;)
  • +1
    хммм. имхо было бы любопытнее найти последовательность для числа Пи? или e? Хотя бы знака до 10-го?
    • 0
      аа. я уже сам попробовал :)
      удается подобрать, если по частям. приходется запомнить несколько фраз. Или у Вас ограничение на длину входной строки?
      • 0
        есть ограничение на 7 значимых цифр, поскольку даже для них получается закодировать далеко не всё на этом наборе текстов. Можно сказать точно, что если подобралось только 6 значит 7 и больше точно нет. Так как у Шекспира подобралось 7 могу дополнительно проверить, но это очень маловероятно
    • 0
      до 7 знака находится у Шекспира, в Библии и у Достоевского только до 6 знака. Чтобы закодировать до 10 знака нужно больше текстов
    • +1
      Пи, пе из классиков, но запомнить не сложно — «Как я хочу и желаю надраться до чертей после сих тупых докладов, наводящих тяжелую депрессию»
    • 0
      del
  • +7
    Cразу вспомнился Швейк:

    Фельдфебель начал свёртывать цигарку. Швейк между тем разглядывал номер винтовки и вдруг воскликнул:

    — Четыре тысячи двести шестьдесят восемь! Такой номер был у одного паровоза в Печках. Этот паровоз стоял на шестнадцатом пути. Его собирались увести на ремонт в депо Лысую-на-Лабе, но не так-то это оказалось просто, господин фельдфебель, потому что у старшего машиниста, которому поручили его туда перегнать, была прескверная память на числа. Тогда начальник дистанции позвал его в свою канцелярию и говорит: «На шестнадцатом пути стоит паровоз номер четыре тысячи двести шестьдесят восемь. Я знаю, у вас плохая память на цифры, а если вам записать номер на бумаге, то вы бумагу эту также потеряете. Если у вас такая плохая память на цифры, послушайте меня повнимательней. Я вам докажу, что очень легко запомнить какой угодно номер. Так слушайте: номер паровоза, который нужно увести в депо в Лысую-на-Лабе, — четыре тысячи двести шестьдесят восемь. Слушайте внимательно. Первая цифра — четыре, вторая — два. Теперь вы уже помните сорок два, то есть дважды два — четыре, это первая цифра, которая, разделённая на два, равняется двум, и рядом получается четыре и два. Теперь не пугайтесь! Сколько будет дважды четыре? Восемь, так ведь? Так запомните, что восьмёрка в номере четыре тысячи двести шестьдесят восемь будет по порядку последней. После того как вы запомнили, что первая цифра — четыре, вторая — два, четвёртая — восемь, нужно ухитриться и запомнить эту самую шестёрку, которая стоит перед восьмёркой, а это очень просто. Первая цифра — четыре, вторая — два, а четыре плюс два — шесть. Теперь вы уже точно знаете, что вторая цифра от конца — шесть; и теперь у вас этот порядок цифр никогда не вылетит из головы. У вас в памяти засел номер четыре тысячи двести шестьдесят восемь. Но вы можете прийти к этому же результату ещё проще…

    Фельдфебель перестал курить, вытаращил на Швейка глаза и только пролепетал:

    — Карре аb!

    Швейк продолжал вполне серьёзно:

    — Тут он начал объяснять более простой способ запоминания номера паровоза четыре тысячи двести шестьдесят восемь. «Восемь без двух — шесть. Теперь вы уже знаете шестьдесят восемь, а шесть минус два — четыре, теперь вы уже знаете четыре и шестьдесят восемь, и если вставить эту двойку, то всё это составит четыре — два — шесть — восемь. Не очень трудно сделать это иначе, при помощи умножения и деления. Результат будет тот же самый. Запомните, — сказал начальник дистанции, — что два раза сорок два равняется восьмидесяти четырём. В году двенадцать месяцев. Вычтите теперь двенадцать из восьмидесяти четырёх, и останется семьдесят два, вычтите из этого числа ещё двенадцать месяцев, останется шестьдесят. Итак, у нас определённая шестёрка, а ноль зачеркнём. Теперь уже у нас сорок два, шестьдесят восемь, четыре. Зачеркнём ноль, зачеркнём и четвёрку сзади, и мы преспокойно опять получили четыре тысячи двести шестьдесят восемь, то есть номер паровоза, который следует отправить в депо в Лысую-на-Лабе. И с помощью деления, как я уже говорил, это также очень легко. Вычисляем коэффициент, согласно таможенному тарифу…» Вам дурно, господин фельдфебель? Если хотите, я начну, например, с «General de charge! Fertig! Hoch an! Feuer!» Чёрт подери! Господину капитану не следовало посылать вас на солнце. Побегу за носилками.

    Пришёл доктор и констатировал, что налицо либо солнечный удар, либо острое воспаление мозговых оболочек.

    Когда фельдфебель пришёл в себя, около него стоял Швейк и говорил:

    — Чтобы докончить… Вы думаете, господин фельдфебель, этот машинист запомнил? Он перепутал и всё помножил на три, так как вспомнил святую троицу. Паровоза он не нашёл. Так он и до сих пор стоит на шестнадцатом пути.

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