Создать понятное предложение


55

Проблема:

Создайте предложение, которое можно прочитать и понять. Он должен содержать тему, глагол и объект, и времена и множественное число должны совпадать. Программа также должна быть способна генерировать несколько разных предложений для квалификации.

Правила:

  • Жесткое кодирование предложений не допускается, и при этом они не считываются непосредственно из файла (я смотрю на тебя, unclemeat)
  • Вы можете иметь любое количество списков слов
  • Отправьте пример предложения или 2, которые были сгенерированы вашей программой
  • Любой язык принят
  • Это , поэтому победит ответ, получивший наибольшее количество голосов.

7
Я думаю, что из некоторых ответов ( MatLab я смотрю на вас) ясно, что вы должны изменить правила так, чтобы интеллектуальному анализу данных не разрешалось извлекать последовательные слова из любого источника.
Карл Виттофт

Пока я умница: так как это просто конкурс популярности, кто-то должен просто опубликовать jpg HotModelBikini. Это получит больше голосов, чем что-либо еще.
Карл Виттофт

7
Я буду одобрять любого, кто использует в качестве типовых предложений повторения «буйвол» или «рыба»!

7
Большинство ответов здесь либо содержат правильные, полные предложения из текстовых источников, либо генерируют выходные данные, которые не соответствуют критериям. Мне кажется, что оба подхода противоречат духу вопроса! Если кто-то действительно хочет произвести впечатление, могу ли я предложить программу, которая начинается с набора допустимых структур предложений, таких как [Adjective] [pl. noun] [verb] [adjective] [pl. noun]и извлекает их из реального словаря (может быть, с использованием одного из доступных API словарей) для заполнения пробелов? Я написал бы сам, если бы у меня было несколько свободных минут! :( В конце концов ...Lazy Developers Write Lousy Programs.
Брайан Лейси

1
@Pureferret Word списки будут списки отдельных слов. Жесткое кодирование будет список полных предложений. В случае списков слов вам, как правило, понадобится некоторая логика в программе, чтобы собрать воедино законченное предложение. С жестко закодированными предложениями вам в основном нужно просто печатное утверждение.
8bittree

Ответы:


87

удар

fgrep '/* ' /usr/src/linux* -r | cut -d '*' -f 2 | head -$((RANDOM)) | tail -1

Требования: исходный код ядра Linux установлен в / usr / src

Это вытягивает случайные комментарии из источника ядра. Являются ли предложения действительно понятными , открыто для обсуждения.

Примеры фактического вывода:

  • end of packet for rx
  • I don't know what to do
  • 256 byte packet data buffer.
  • The rest of this junk is to help gdb figure out what goes where
  • Convert page list back to physical addresses, what a mess.
  • ???
  • Only Sun can take such nice parts and fuck up the programming interface

12
Хороший! Вы должны вытащить их всех и представить в качестве официальной fortuneбазы данных.
Джейсон С

18
"???" лучший комментарий когда-либо
Рэй

4
Не нарушено ли первое правило «и не читается ли оно непосредственно из файла»?
kuldeep.kamboj

6
Я бы сказал, что поиск по системному исходному коду и фильтрация текста из комментариев на самом деле не считается «чтением напрямую».
Бунт

7
и Slave Overflow. хорошее название для сайта SE
TheDoctor

95

Matlab

why

пример выходов:

>> why
The programmer suggested it.
>> why
To please a very terrified and smart and tall engineer.
>> why
The tall system manager obeyed some engineer.
>> why
He wanted it that way.

[Это одно из пасхальных яиц Матлаба]

РЕДАКТИРОВАТЬ: вы можете увидеть код этой функции здесь: why.m


3
Вы можете увидеть код здесь: opg1.ucsd.edu/~sio221/SIO_221A_2009/SIO_221_Data/Matlab5/…
Елисей

8
Второй пример не является предложением. Это инфинитивная фраза.
wchargin

2
Множество ответов здесь приводят не только к предложениям (посмотрите на другие высоко оцененные ответы, например). Задача не говорит, что она должна создавать только предложения, она говорит, что должна быть способна создавать предложения.
Елисей

51

PHP

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

Строка 'TOS...'обеспечивает логарифмическую шкалу частоты букв, чтобы более точно соответствовать английскому языку. Это используется для генерации строки большего размера с приблизительными относительными частотами букв.

$a = ord('A');
$s = '';

foreach (str_split('TOSRWQPPUALRQTTRGUUUQMMLMFZ') as $i=>$f)
{
    if (!ctype_alpha($c = chr($a + $i)))
        $c = ' ';
    $s .= str_repeat($c, round(exp((ord($f) - $a) / 3.976)));
}

$l = strlen($s) - 1;
for (;;)
    echo substr($s, mt_rand(0, $l), 1);

Запустив его, я обнаружил такие литературные жемчужины как:

  • GO NOW- Ты как субъект подразумевается.
  • IM AOK - Я в порядке
  • IM FDR - Я F (ранклин) D (Элеано) R (Оозевельт)

Кроме того, многочисленные оскорбления, чтобы кратко выразить недовольство текущей ситуацией. [Некоторые буквы отредактированы.]

  • F**K
  • S**T

А также следующее с использованием точно настроенного масштабирования:

  • IS IT ON
  • I AM STU
  • I SEE HTML

60
Почему кучка обезьян может сделать то же самое!
Тим С.

11
Мне нравится! Теперь создайте программу, которая обрабатывает буквы, выходящие из этого, и находит понятные предложения! :)
TheDoctor

2
+1 - есть ли шансы автоматизировать открывающую часть? Задача заключалась в том, чтобы создать * одно * (?) Предложение. КСТАТИ: сколько времени вы провели;)
Вольф

20
Как вы получили F**Kи S**Tпри условии, что нет *в 'ABCDEFGHIJKMLNOPQRSTUVWXYZ '?
glglgl

3
@Ypnypn - 'TOS...'строка представляет частоту каждой буквы в логарифмическом масштабе. Так Aимеет частоту T, Bимеет частоту O. Jимеет самую низкую частоту, Aкоторая переводится в 0, из которых обратное логарифмическое число равно 1. Последний символ - это пробел, который имеет частоту Z, или округляется (exp (25 / 3.976)) = 538, поэтому пробелы встречаются в 538 раз чаще, чем J. Просто подумал, что это изрядно исказит проблему с обезьяной на пишущей машинке .

42

С

char*strerror(),i;main(){for(;--i;)puts(strerror(i));}

Пример вывода:

Программное обеспечение вызвало прерывание соединения
Прерванный системный вызов должен быть перезапущен

Есть также много правильных выводимых предложений, которые не имеют темы, глагола и объекта:

Таймер истек
Файл существует


как и когда это заканчивается? (да, но я не понимаю, почему)
phil294

1
@Blauhirn условие завершения цикла --iоценивается как ложное, когда i(переменная типа charс начальным значением 0) снова достигает 0. Если значение charunsigned (например, ARM), iсразу же обернется до его наибольшего значения (обычно 255) и обратного отсчета до 0. Если charподписано (большинство систем Intel), поведение строго говоря не определено, но обычно после достижения минимального значения ( как правило, -128), он обернется вокруг своего максимума (обычно 127) и обратного отсчета до 0. Таким образом, программа обычно печатает всего 256 строк.
Ecatmur

37

Ява

Извлекает вступительное предложение из случайной статьи в Википедии:

import java.io.InputStream;
import java.net.URL;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;

public class RandomSentence {
    public static void main (String[] args) throws Exception {
        String sentence;
        do {
            InputStream in = new URL("https://en.wikipedia.org/wiki/Special:Random").openStream();
            Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(in);
            String intro = doc.getElementsByTagName("p").item(0).getTextContent();
            sentence = intro.replaceAll("\\([^(]*\\) *", "").replaceAll("\\[[^\\[]*\\]", "").split("\\.( +[A-Z0-9]|$)")[0];
        } while (sentence.endsWith(":") || sentence.length() < 30 || sentence.contains("?"));
        System.out.println(sentence + ".");
    }
}

Иногда тебе не везет; Я пытаюсь минимизировать это, устанавливая минимальную длину предложения и отфильтровывая предложения, которые заканчиваются на «:» (все страницы устранения неоднозначности начинаются таким образом) или содержат «?» (кажется, есть много статей с неразрешенной неизвестной информацией, отмеченной вопросительными знаками). Границы предложения - это период, за которым следует пробел, за которым следует цифра или заглавная буква.

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

  • Idle Cure была арена рок-группы из Лонг-Бич, штат Калифорния.
  • Самофокусировка - это нелинейный оптический процесс, вызванный изменением показателя преломления материалов, подверженных воздействию интенсивного электромагнитного излучения.
  • TB10Cs4H3 является членом H / ACA-подобного класса некодирующей молекулы РНК, которая направляет сайты модификации уридинов в псевдоуридины субстратных РНК.
  • Шестиглавый дикий баран в шумерской мифологии был одним из героев, убитых Нинуртой, покровителем лагаша в древнем Ираке.
  • «Сахарный папа» - это жаргонный термин для мужчины, который предлагает поддержать обычно более молодую женщину или мужчину после установления отношений, которые обычно являются сексуальными.
  • Старая Вефильская Объединенная Методистская Церковь расположена по адресу: 222 Calhoun St., Чарльстон, Южная Каролина.
  • Дуглас Гирс - американский композитор.

Если вы заметили какие-либо проблемы с грамматикой, это ваша вина, что вы не были прилежным редактором Википедии! ;-)


4
Существует определенная разница между «действительным» и «понятным». У меня есть несколько субстратных РНК-псевдоуридинов для тебя, детка.
Джейсон С,

1
Я получил это в первый раз, когда запустил его: Echinolittorina africana / Litorina africana Philippi, 1847 / Litorina decollata Philippi, 1847 / Littorina africana / Littorina perplexa Turton, 1932 / Nodilittorina africana ./ Кажется, есть некоторые вики-страницы, которые вы должны исключить из своего поиск! ;) Ха-ха! OMG, во второй раз, когда я запустил его, он вернул строку со страницы Wiki Михаила Горбачева. Кто разделяет мое имя. Довольно странно.
mikhailcazi

2
«/» На самом деле не было! Хаха: PI использовал его для представления новых строк. Может быть, я должен был использовать \ n. Это отсюда: en.wikipedia.org/wiki/Afrolittorina_africana . Стол справа, под синонимами :) В любом случае, это не было плохим впечатлением, так что не волнуйтесь, потому что эта вещь Михаила Горбачева была довольно крутой. И все предложения после этого были нормальными.
mikhailcazi

2
Вы можете найти этот ответ по физике интересным, недавним соавтором одной из этих статей.
EP

2
Это может быть один общий, но крайне неинтуитивный аспект вероятности: события «один на миллион» могут быть довольно распространенными в мире с миллиардами людей. Тем не менее, я не уверен, что бы сказал официальный анализ. Я тоже был очень удивлен! Вы также можете заметить, что здесь нет «другого парня».
EP

34

Ооооо ... Так как это , я повеселился evalс функциями. По сути, я генерирую случайное число, а затем выполняю случайную функцию на основе этого числа (по вашему мнению switch,!) Через eval.

PHP, ~ 9k правильных выводов

<?php

//Subjects
function s1(){ echo "I "; $m = rand(1,20); eval ("v".$m."(0);");}
function s2(){ echo "You "; $m = rand(1,20); eval ("v".$m."(0);");}
function s3(){ echo "He "; $m = rand(1,20); eval ("v".$m."(1);");}
function s4(){ echo "She "; $m = rand(1,20); eval ("v".$m."(1);");}
function s5(){ echo "We "; $m = rand(1,20); eval ("v".$m."(0);");}
function s6(){ echo "They "; $m = rand(1,20); eval ("v".$m."(0);");}

//Verbs
function v1($n){ echo "want"; if($n==1)echo"s"; echo " to "; $z = rand(1,10); eval ("a".$z."();");}
function v2($n){ echo "need"; if($n==1)echo"s"; echo " to "; $z = rand(1,10); eval ("a".$z."();");}
function v3($n){ echo "ha"; if($n==1){echo"s";}else{echo"ve";} echo " to "; $z = rand(1,10); eval ("a".$z."();");}
function v4($n){ echo "wanted to "; $z = rand(1,10); eval ("a".$z."();");}
function v5($n){ echo "needed to "; $z = rand(1,10); eval ("a".$z."();");}
function v6($n){ echo "had to "; $z = rand(1,10); eval ("a".$z."();");}
function v7($n){ echo "eat"; if($n==1)echo"s"; echo " "; $w = rand(1,20); eval ("o".$w."();");}
function v8($n){ echo "think"; if($n==1)echo"s"; echo " about "; $w = rand(1,20); eval ("o".$w."();");}
function v9($n){ echo "ate "; $w = rand(1,20); eval ("o".$w."();");}
function v10($n){ echo "thought about "; $w = rand(1,20); eval ("o".$w."();");}
function v11($n){ echo "draw"; if($n==1)echo"s"; echo " "; $w = rand(1,20); eval ("o".$w."();");}
function v12($n){ echo "drew "; $w = rand(1,20); eval ("o".$w."();");}
function v13($n){ echo "smell"; if($n==1)echo"s"; echo " like "; $w = rand(1,20); eval ("o".$w."();");}
function v14($n){ echo "shot "; $w = rand(1,20); eval ("o".$w."();");}
function v15($n){ echo "destroy"; if($n==1)echo"s"; echo " "; $w = rand(1,20); eval ("o".$w."();");}
function v16($n){ echo "destroyed "; $w = rand(1,20); eval ("o".$w."();");}
function v17($n){ echo "melt"; if($n==1)echo"s"; echo " "; $w = rand(1,20); eval ("o".$w."();");}
function v18($n){ echo "saw "; $w = rand(1,20); eval ("o".$w."();");}
function v19($n){ echo "ha"; if($n==1){echo"s";}else{echo"ve";} echo " "; $w = rand(1,20); eval ("o".$w."();");}
function v20($n){ echo "had "; $w = rand(1,20); eval ("o".$w."();");}

//Auxiliaries
function a1(){ echo "punch "; $w = rand(1,20); eval ("o".$w."();");}
function a2(){ echo "drive "; $w = rand(1,20); eval ("o".$w."();");}
function a3(){ echo "mount "; $w = rand(1,20); eval ("o".$w."();");}
function a4(){ echo "see "; $w = rand(1,20); eval ("o".$w."();");}
function a5(){ echo "have "; $w = rand(1,20); eval ("o".$w."();");}
function a6(){ echo "eat "; $w = rand(1,20); eval ("o".$w."();");}
function a7(){ echo "stun "; $w = rand(1,20); eval ("o".$w."();");}
function a8(){ echo "kiss "; $w = rand(1,20); eval ("o".$w."();");}
function a9(){ echo "Ted "; $w = rand(1,20); eval ("o".$w."();");} //See "How I met Your Mother" for further informations :)
function a10(){ echo "blow "; $w = rand(1,20); eval ("o".$w."();");}

//Objects
function o1(){ echo "a cow!<br>";}
function o2(){ echo "a meatball!<br>";} 
function o3(){ echo "a car!<br>";} 
function o4(){ echo "shoes!<br>";} 
function o5(){ echo "pigs!<br>";} 
function o6(){ echo "a telephone!<br>";} 
function o7(){ echo "some bottles of water!<br>";} 
function o8(){ echo "a laptop!<br>";} 
function o9(){ echo "my shorts!<br>";} //Quote needed
function o10(){ echo "anchovies!<br>";}
function o11(){ echo "an alarm clock!<br>";}
function o12(){ echo "every second!<br>";}
function o13(){ echo "until the end!<br>";}
function o14(){ echo "sitting!<br>";}
function o15(){ echo "a sword!<br>";}
function o16(){ echo "fire!<br>";}
function o17(){ echo "the dust!<br>";}
function o18(){ echo "in the bedroom!<br>";}
function o19(){ echo "a poor ant!<br>";}
function o20(){ echo "a pencil!<br>";}

//Testing
$n = rand(1,6); eval ("s".$n."();");
$n = rand(1,6); eval ("s".$n."();");
$n = rand(1,6); eval ("s".$n."();");
$n = rand(1,6); eval ("s".$n."();");

?>

Некоторые выводы ...

She draws a sword!
They thought about sitting!
You eat my shorts!
He wanted to Ted a cow!
You want to mount a poor ant!
She smells like anchovies!
He wanted to have shoes!
They wanted to see a pencil!

@ nyuszika7h, PHP_EOLвсегда равен \nили \r\n, в зависимости от операционной системы, но никогда <br>или аналогично.
timmyRS

@timmyRS Да, вы правы, это старый комментарий, я не знаю, почему я написал это в то время.
nyuszika7h

33

PHP + Проект Гутенберг

Я написал PHP-скрипт, который превращает простой текстовый документ в набор биграмм , которые затем используются для генерации случайных предложений. Вот некоторые из лучших примеров, которые он сгенерировал из всей текстовой версии речи Патрика Генри «Дай мне свободу или дай мне смерть» , включая мелкий шрифт Project Gutenberg:

  • Проект Гутенберг Этекст наций и рабства!

  • Мы приносим свои извинения за 200-летие этого мелкого шрифта!

  • ВЫ НЕ ИМЕЕТЕ ДРУГИХ ГАРАНТИЙ ЛЮБОГО РОДА, ЯВНЫХ ИЛИ СЛУЧАЙНЫХ УЩЕРБОВ, Но для меня смерть!

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

Если вы хотите запустить исходный код самостоятельно, не забудьте загрузить $src_textвыбранный текст.

<html>
<head>
<title>Give Me Liberty Or Give Me Death</title>
<style>
body { margin:4em 6em; text-align:center; background-color:#feb; }
h1 { font-weight:normal; font-size:2em; margin-bottom:2em; }
blockquote { font-style:italic; }
</style>
</head>
<body>
<h1>A collection of quotes randomly generated from Patrick Henry's speech
<a href="http://www.gutenberg.org/ebooks/6">Give Me Liberty Or Give Me Death</a>
(and its accompanying Project Gutenberg blurb).</h1>
<?php

/* Give Me Liberty Or Give Me Death */
/* Plain text available from http://www.gutenberg.org/ebooks/6 */
$src_text = file_get_contents('libertyordeath.txt');

$bigrams = array();
$openers = array();
$loc = 0;
$new_sentence = true;
$last = false;
while (preg_match('/\'?\w+[^\s\[\]\*\(\)"#@]*/',$src_text,$matches,PREG_OFFSET_CAPTURE,$loc)) {
  $w = $matches[0][0];
  $loc = $matches[0][1]+strlen($w);
  $bareword = preg_replace('/\W/','',$w);
  if ($last) {
    if (!isset($bigrams[$last][$w])) $bigrams[$last][$w] = 1;
    else $bigrams[$last][$w]++;
  }
  if (!isset($bigrams[$bareword])) $bigrams[$bareword] = array();
  $last = $bareword;
  if ($new_sentence && preg_match('/^[A-Z]/',$w)) {
    if (!isset($openers[$w])) $openers[$w] = 1;
    else $openers[$w]++;
    $new_sentence = false;
  }
  if (ends_sentence($w)) {
    $new_sentence = true;
    $last = false;
  }
}

/* Now generate ten random sentences */

for ($ns=0; $ns<10; $ns++) {

  echo "<blockquote><p>";

  /* Choose a starting word */

  $sum = 0;
  foreach ($openers as $w=>$c) $sum += $c;
  $r = mt_rand(0,$sum);
  foreach ($openers as $w=>$c) {
    $r -= $c;
    if ($r<=0) break;
  }

  /* Barf out additional words until end of sentence reached */

  while(1) {
    echo "$w ";
    if (ends_sentence($w)) break;
    $bareword = preg_replace('/\W/','',$w);
    $sum = 0;
    foreach ($bigrams[$bareword] as $w=>$c) $sum += $c;
    $r = mt_rand(0,$sum);
    foreach ($bigrams[$bareword] as $w=>$c) {
      $r -= $c;
      if ($r<=0) break;
    }
  }

  echo "</p></blockquote>\n";
}

function ends_sentence($w) {
  if (!preg_match('/[\.\?!]$/',$w)) return false;
  if (preg_match('/^(\w|St|Mr|Ms|Mrs|Messrs|i\.e|e\.g|etc|Rd)\./i',$w)) return false;
  return true;
}

?>
</body>
</html>

+10 Это действительно придает дух испытания! Я не могу найти его сейчас, но раньше был онлайн-генератор предложений на основе Google, который работал аналогичным образом, но биграммы (или, возможно, более крупные n-граммы) были получены из результатов поиска Google путем поиска слова и наблюдения что последовало за этим во фрагментах предварительного просмотра результатов поиска. Возможно я буду воссоздавать это и отправлять это здесь.
Джейсон С

Как насчет этого! «Сэр, мы находим, что были рады улучшить конкурс». Или этот! «Они сообщают нам о возврате ужасного момента для улучшения части Etext 6 Дата последнего обновления: 5 мая 2005 г. Официально выпущен только для наших сражений».
Hosch250

1
But for me, death!: D Желаю, чтобы все лицензии / соглашения заканчивались так же сильно.
Навин

Ха-ха, «Официально выпущен только для наших сражений».
Джейсон С

1
Я ничего не получил." :(
TheNumberOne

29

питон

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

Он производит несколько почти вменяемых утверждений:

The snigger westernizes the bacteriologist.
A drizzle stoked the sentiments.

Многие безумные

Tipper's orthopaedic knitwear plates a payroll.
A fibula teletypewritered a yogi.
The protozoan's spiralling skydive coats this veterinarian

И много вещей, которые звучат как Монти Пайтон, делающие непристойные намеки:

That rolling indictment tarries some bang's bulge.
Some inflammatory tush's intermarriage sextants some postman.
Some pentagon's manufacturer squeaked the wolverine.
A disagreeable participant is entertaining my optimized spoonful.

Версия 3 была изменена, чтобы принимать любой текстовый файл в качестве входных данных:

$ man python | python words.py
The disabled comma-separated source is using those wizards at exit.
$ cat COPYING | python words.py  #GPL
My user accord actions a gnu of software.
$ cat pg2591.txt | python words.py #Grimm's Fairy Tales 
Some bargain receives my threepence.
Any wrong worms your world.
$ cat words.py | python words.py #self reflection
Your filter_possesive not_nouned those prepositions.
$ ls /usr/bin | python words.py  #directory lists
Their dropbox funziped an arch.

Код (версия 3) :

import random
import string
import sys
import re

#words = open("/usr/share/dict/words").readlines()
words = re.sub("[]:;.,:?!<>{}()|=\"`[]",' ',sys.stdin.read(),flags=re.M).split()
words = list(set(words))

articles=('','a ','the ','some ','this ','that ','my ','any ','your ','their ',
             'all ','more '
             'an ') #an must be last
pl_articles=('','some ','those ','many ','the ','these ')
prepositions = ('of','by','to','for','from','in','with','on','which','when','at',
                     'into','as','if','near')
conjunctions = ('and','or','but')
verbs = ('is','are','was', 'be','do','came','been','had','have')
pronouns_s = ('he','she','it','we','you')
pronouns_o = ('him','her','them')

possesive=False
modifiers=0
use_prep = None

MAX_MODIFIERS=2

def is_modifier(w):
    return ("'" in w or
        w[-2:] in ('ry','ed','er','ic','al')  or
        w[-3:] in ('ing','est','ble','ous') or
        w[-4:] in ('less','ical','mmon') )

def is_verb(w):
    return (w in verbs or 
        w[-2:] in ('ed',) or
        w[-3:] in ('ing','ize') )

def is_article(w):
    return w+' ' in articles or w+' ' in pl_articles

def is_conjunction(w):
    return w in conjunctions

def filter_possesive(w,always=False): 
    global possesive
    #allow only one
    result = True if "'" in w else False
    if result:
        if always: return False
        if not possesive: 
            possesive = True
            return False
    return result

def is_preposition(w):
    global use_prep
    if w in prepositions:
        use_prep = w
        return True
    return False

def is_adverb(w):
    return w[-2:]=='ly'

def is_gerund(w):
    return w[-3:]=='ing'

def is_plural(w):
    return w[-1]=='s'

def not_verb(w):
    return (w in ('you','they','our','yes') or 
              w[-4:] in ('ness','such') or
              w in pronouns_o or w in pronouns_s
              )

def not_noun(w):
    return (w in verbs)


def getword():
    while True:
        w=words[random.randrange(len(words))].rstrip()
        if w[0] in string.ascii_uppercase: continue
        if is_article(w) or is_preposition(w):  continue
        if filter_possesive(w): continue 
        #print w
        return w

def get_article():
    return articles[random.randrange(len(articles)-1)]

#print '--s--'
substr=''
conjunction = False
while True:
    w=getword()
    if is_modifier(w):
        if modifiers < MAX_MODIFIERS:
            substr+=w+' '
            modifiers+=1
        else: continue
    elif is_adverb(w) or is_plural(w) or not_noun(w): continue
    else:
        if is_conjunction(w): 
            conjunction = w
            continue    
        substr= substr+w+' '
        if conjunction:
            substr+=conjunction+' '
            conjunction = False
            continue
        if w in pronouns_s: 
            substr = w+' '
            art=''
        else:
            art = get_article()
            if art is 'a ' and substr[0] in 'aeiou': art='an '
        substr= string.capwords(art+substr,'.')
        break

#print '--v--'
verbstr=''
while True:
    w=getword()
    if not_verb(w) or filter_possesive(w,True): continue
    elif is_adverb(w): verbstr+=w+' '
    elif is_gerund(w):
        verbstr+='is '+w+' '
        break
    elif is_verb(w):
        verbstr= verbstr+w+' '
        break
    elif is_modifier(w) or is_conjunction(w): continue
    else:
        if not is_plural(w):
            w=w+'ed' if w[-1]!='e' else w+'d'
        verbstr= verbstr+w+' '
        break

#print '--o--'
obstr=''
conjunction = False
while True:
    w=getword()
    if is_modifier(w):
        if modifiers<MAX_MODIFIERS:
            obstr+=w+' '
            modifiers+=1
        else: continue
    elif is_adverb(w) or not_noun(w) or w in pronouns_s: continue
    else:
        if is_conjunction(w): 
            conjunction = w
            continue
        obstr = obstr+w
        if conjunction:
            obstr+=' '+conjunction+' '
            conjunction = False
            continue
        if is_plural(w):
            art = pl_articles[random.randrange(len(pl_articles))] 
        else:
            art = articles[random.randrange(len(articles)-1)] 
            if art is 'a ' and obstr[0] in 'aeiou': art='an '
        if w in pronouns_o:
            obstr=w
        else:
            obstr= art+obstr
        break

#print '--p--'
while use_prep:
    w=getword()
    if (is_modifier(w) or is_preposition(w) or 
         is_gerund(w) or not_noun(w) or is_conjunction(w)):
        continue
    obstr+=' '+use_prep+' '+w
    use_prep=None

print substr+verbstr+obstr+'.'

3
Примеры предложений заставляют меня так смеяться, я плачу! xD
mikhailcazi

cat FILE | COMMAND? UUOC ;)
nyuszika7h

Спасибо @ nyuszika7h, я кое-что узнал сегодня.
Отказаться от

1
This smoke toasted some nonresidents., WOAH.
phil294

25

удар

Вдохновленный ответом Matlab. Предполагается, что вы aptitudeустановили.

r=$[ RANDOM % 7 ]
a=''
for i in `seq $r`; do a=$a'v'; done
if [ $r -ne 0 ]; then a='-'$a; fi
aptitude $a moo

Возможные выводы (скриншот из этой статьи в Википедии)

введите описание изображения здесь


7
Я не думаю, что . /----\ -------/ \ / \ / | -----------------/ --------\ ----------------------------------------------это правильное предложение.
svick

1
@svick you winможет быть предложением (подразумевается объект «аргумент»). И даже если это не так, вопрос не запрещает случаи, когда вывод не является действительным.
ace_HongKongIndependence

23

Python:

import random
l = ['Buffalo']
while random.randint(0,5) > 0:
    l.append('buffalo')
print ' '.join(l) + '.'

Образцы:

  • Буффало Буффало Буффало.
  • Буффало Буффало Буффало Буффало Буффало Буффало Буффало Буффало.

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

Также здесь есть ссылка.


3
Не добавляйте пробелы к литералам бизонов; вместо этого используйте ' '.join(l). Это избавит от замыкающего пространства. Затем вы можете просто добавить точку.
Blacklight Shining

@BlightlightShining Обновил его. Спасибо за предложение.
8bittree

Пожалуйста. И +1 для буйвола. :)
Blacklight Shining


1
Выражается с помощью itertools ,print " ".join(takewhile(lambda _: randint(0, 5), repeat("buffalo"))).capitalize() + "."
nmclean

16

Руст + Токи Пона

Любой язык принят, поэтому я написал программу на Rust, которая генерирует некоторые предложения в Toki Pona .

Токи Пона - это попытка создать минимальный естественный язык, и он имеет супер простую и правильную грамматику. Это очень полезное свойство для этого конкурса!

use std::rand;

#[deriving(Rand)]
struct Phrase { a: Option<~GNominal>, b: ~Sujet, c: ~Predicat }

#[deriving(Rand)]
enum Sujet { A(~GNominal), B(~SCompose) }

#[deriving(Rand)]
enum Predicat { C(~GVerbal), D(~PCompose) }

#[deriving(Rand)]
struct SCompose { a: ~Sujet, b: ~Sujet }

#[deriving(Rand)]
struct PCompose { a: ~Predicat, b: ~Predicat }

#[deriving(Rand)]
struct GNominal { a: ~nom::Nom, b: Multi<~adjectif::Adjectif> }

#[deriving(Rand)]
struct GVerbal { a: ~verbe::Verbe, b: Multi<~adjectif::Adjectif>, c: Multi<~ODirect> }

#[deriving(Rand)]
struct ODirect { a: ~GNominal}

#[deriving(Rand)]
enum Multi<T> { Zero, One(T), Two((T,T)) }

mod nom {
    #[deriving(Rand)]
    #[deriving(ToStr)]
    pub enum Nom {akesi,ala,ale,anpa,ante,ijo,ike,ilo,insa,jaki,jan,jo,kala,kalama,kama,kasi,ken,kili,kiwen,ko,kon,kule,kulupu,lape,lawa,len,lete,linja,lipu,luka,lupa,ma,mama,mani,meli,mi,mije,moku,moli,monsi,mun,musi,mute,nanpa,nasin,nena,nimi,noka,oko,olin,ona,pakala,pali,palisa,pana,pilin,pimeja,pini,pipi,poka,poki,pona,seli,selo,sewi,sijelo,sike,sina,sinpin,sitelen,sona,soweli,suli,suno,supa,suwi,tan,tawa,telo,tenpo,toki,tomo,tu,unpa,uta,utala,walo,wan,waso,wawa,weka,wile}
}

mod verbe {
    #[deriving(Rand)]
    #[deriving(ToStr)]
    pub enum Verbe {ante,awen,ijo,ike,jaki,jan,jo,kalama,kama,ken,kepeken,kule,kute,lape,lawa,lete,lili,lon,lukin,moku,moli,musi,mute,nasa,olin,open,pakala,pali,pana,pilin,pimeja,pini,pona,seli,sin,sitelen,sona,suli,suwi,tawa,telo,toki,tu,unpa,utala,wan,wawa,weka,wile,}
}

mod adjectif {
    #[deriving(Rand)]
    #[deriving(ToStr)]
    pub enum Adjectif {ala,ale,anpa,ante,awen,ike,insa,jaki,jan,jelo,kama,kin,kiwen,kon,kule,kute,kulupu,lape,laso,lawa,lete,lili,linja,loje,luka,lukin,mama,meli,mi,mije,moli,monsi,mun,musi,mute,nasa,ni,olin,ona,pali,pimeja,pini,poka,pona,sama,seli,sewi,sike,sin,sina,suli,suwi,taso,tawa,toki,tomo,unpa,uta,walo,wan,wawa,weka,wile,}
}

impl ToStr for Phrase {
    fn to_str(&self) -> ~str {
        self.a.as_ref().map_or(~"", |g| format!("{:s} la ", g.to_str()))
        + format!("{:s} li {:s}", self.b.to_str(), self.c.to_str())
    }
}

impl ToStr for Sujet {
    fn to_str(&self) -> ~str {
        match *self {
            A(ref v) => v.to_str(),
            B(ref v) => v.to_str(),
        }
    }
}

impl ToStr for Predicat {
    fn to_str(&self) -> ~str {
        match *self {
            C(ref v) => v.to_str(),
            D(ref v) => v.to_str(),
        }
    }
}

impl ToStr for SCompose {
    fn to_str(&self) -> ~str {
        format!("{:s} en {:s}", self.a.to_str(), self.b.to_str())
    }
}

impl ToStr for PCompose {
    fn to_str(&self) -> ~str {
        format!("{:s} li {:s}", self.a.to_str(), self.b.to_str())
    }
}

impl ToStr for GNominal {
    fn to_str(&self) -> ~str {
        format!("{:s} {:s}", self.a.to_str(), self.b.to_str())
    }
}

impl ToStr for GVerbal {
    fn to_str(&self) -> ~str {
        format!("{:s} {:s} {:s}", self.a.to_str(), self.b.to_str(), self.c.to_str())
    }
}

impl ToStr for ODirect {
    fn to_str(&self) -> ~str {
        format!("e {:s}", self.a.to_str())
    }
}

impl<T: ToStr> ToStr for Multi<~T> {
    fn to_str(&self) -> ~str {
        match *self {
            Zero => ~"",
            One(ref v) => v.to_str(),
            Two((ref v,ref w)) => format!("{:s} {:s}", v.to_str(), w.to_str()),
        }
    }
}

fn main() {
    let phrase = rand::random::<Phrase>();
    println!("{:s}\n{:?}", phrase.to_str(), phrase);
}

Я не говорю на Токи Поне, но я нашел синтаксис Токи Поны как набор правил BNF в Википедии. Я создал одну структуру или перечисление для каждого правила BNF и пометил их deriving(Rand), что дает мне возможность генерировать случайную Phraseструктуру бесплатно! Затем я реализовал ToStrдля каждой из этих структур преобразование их в строку.

Я намеренно оставил названия структур на французском языке, потому что правила BNF, которые я нашел, написаны на французском языке, а также потому, что они отражают многоязычный характер моего представления!

Пример выходов

Некоторые результаты и их переводы, которые я сделал на основе правил BNF и словаря Toki Pona . Я уверен, что эти переводы в основном неверны, но Токи Пона на самом деле оставляет много места для интерпретации предложения.

насин ми тава ла джан ли яки

Во время моей поездки кто-то загрязнил

Монси Ли Яки Ли Джан Айк Муси

Окурок грязный и смешной плохой человек

сина ли тава эль джело и кили тава э инса

Вы переместили фрукт и центр в желтую вселенную

вопросы

  • Я не проверяю, является ли глагол транзитивным или нет, поэтому некоторые предложения грамматически некорректны.
  • Некоторые структуры являются рекурсивными, и когда правило может повторяться, я выбираю случайным образом вывод 0, 1 или 2 элементов. Это может привести к очень длинным сгенерированным предложениям, содержащим тысячи слов ...
  • Я не могу действительно проверить правильность вывода, я полностью полагаюсь на синтаксис BNF, словарь и мои собственные дикие догадки :)

1
sina li tawa ale jelo e kili tawa e insa == "Вы переместили фрукт и центр в желтую вселенную" Довольно хорошо для машины, обычно только опытные пользователи tp могут использовать преобразующие конструкции.
MatthewMartin

1
monsi li jaki li jan ike musi == Попка (жопа? как в жопе?) грязная и смешная плохая личность.
MatthewMartin

1
Привет, спасибо за ваши комментарии, @MatthewMartin! Я, конечно, не ожидал, что спикер Toki Pona рассмотрит мою заявку, но я рад, что эти высказывания не являются полным бредом :)
barjak

Подсказка: это не код гольф.
nyuszika7h

1
@ nyuszika7h Я не уверен, какова цель вашего комментария. На самом деле, это не гольф-код, а конкурс популярности.
Барджак

14

питон

import this


The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

7
Не могли бы вы утверждать, что import antigravityприводит к выходу I LEARNED IT LAST NIGHT! EVERYTHING IS SO SIMPLE!? : D
ace_HongKongIndependence

Несомненно, да.
Рене Лидер

14

пролог

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

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

Код:

% Define the vocabulary
verb(V) :- V = 'eats' | V = 'fights' | V = 'finds'.
subj_pronoun(P) :- P = 'he' | P = 'she' | P = 'it'.
obj_pronoun(P) :- P = 'him' | P = 'her' | P = 'it'.
name(N) :- N = 'alice' | N = 'bob'.
noun(N) :- N = 'cat' | N = 'door' | N = 'pen'.
article(H) :- H = 'the' | H = 'a'.

% Grammar
subject_phrase_short(H) :- subj_pronoun(H)
                         | name(H).
% Subordinate clause. Don't use verb_phrase here to avoid recursive clauses.
sub_clause([Which, Verb|T], Rest) :- Which = 'which', verb(Verb),
                                     object_noun_phrase_short(T, Rest).
subject_phrase([H|T], Rest) :- subject_phrase_short(H), Rest = T.
object_noun_phrase_short([A, N | T], Rest) :- article(A), noun(N), Rest = T
                                            | obj_pronoun(A), Rest = [N|T].
object_phrase(L, Rest) :- object_noun_phrase_short(L, Rest)
                        | object_noun_phrase_short(L, Rest1), sub_clause(Rest1, Rest).
verb_phrase([H|T], Rest) :- verb(H), object_phrase(T, Rest).
sentence(S) :- subject_phrase(S, Rest), verb_phrase(Rest, []).

Запустите этот запрос:

sentence(L).

генерировать все возможные предложения на этом языке.

Некоторые примеры выходов:

L = [he, eats, the, cat] ;
L = [she, finds, a, door] ;
L = [alice, fights, the, door] ;
L = [he, fights, the, cat, which, eats, the, pen] ;
L = [alice, eats, him, which, finds, the, cat] ;

(РЕДАКТИРОВАТЬ: Разрешить подчиненные предложения объекта).


1
Какие-нибудь примеры выходных предложений?
TheDoctor

Да, я поставил несколько образцов в ответ. Всего генерируется 2520 результатов, поэтому я не могу опубликовать их все ...
chrisd

11

питон

Как вы знаете, в Python вы можете делать все, что угодно, всего за несколько importсекунд. Эта простая задача может быть выполнена с помощью этого 2-х строчного скрипта Python.

import random

print ("I like the number "+str(random.uniform(0,1)))

Количество предложений, генерируемых этим сценарием, довольно велико: 10^12разные предложения. Если чтение предложения займет у вас ~ 0,5 секунды, то чтение их всех займет более 15000 лет!

Некоторые примеры предложений:

  • I like the number 0.444371877853
  • I like the number 0.358614422548

Все же все сгенерированные предложения содержат предмет, глагол и объект.

ОБНОВИТЬ:

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

import random

print ('I like the number'+''.join([' '+{'0':'zero','.':'point','1':'one','2':'two','3':'three','4':'four','5':'five','6':'six','7':'seven','8':'eight','9':'nine'}[digit] for digit in str(random.uniform(0,1))])+'.')

Вот несколько примеров предложений:

  • I like the number zero point six three five nine zero eight one five eight four two four.
  • I like the number zero point four nine zero eight four four three two zero six two seven.

Я не могу найти некоторые из ваших слов в моем словаре
д-р belisarius

5
Я настроил свое программное обеспечение так, чтобы оно лучше подходило вашему плохому словарю.
Антонио Раганьин

2
Хорошо. Через 15000 лет я отправлю письмо, чтобы подтвердить, что нашел их всех
доктор Белизарий

10

Игра с внутренним словарем Mathematica:

res = {};
SeedRandom[42 + 1];
Do[
  (While[
    If[(c = Flatten@WordData[RandomChoice[WordData[All]], "Examples"][[All, 2]]) != {},
     StringPosition[(c1 = RandomChoice@c), "'" | "-" | "\\" | "`"] != {}, True, True]];
   sp = ToLowerCase /@ StringSplit[c1, (WhitespaceCharacter .. | ",")];
   toChange = RandomSample[Range@#, RandomInteger[IntegerPart[{#/2, #}]]] &@Length@sp;
   If[StringPosition[ToString@WordData[sp[[#]], "Definitions"],  "WordData"] == {}, 
    sp[[#]] = RandomChoice@ WordData[All, RandomChoice@WordData[sp[[#]], "PartsOfSpeech"]]]
             & /@ toChange;
   AppendTo[res, StringJoin@Riffle[sp, " "]];)
  ,
  {10}];
res

Вам повезло, скажем, в 70% случаев. Он генерирует такие вещи, как:

электрическая цепь миндалевидного тела
вон там Паркия была неограниченной, хотя
оборвала его долгоживущее общество.
Доктор педагогических наук неразборчивый ответ на
маленький музыкальный театр кибуца против Юлия Цезаря
и тайский поползень
вниз в спортивном центре, вопреки твоему скупости,
необходимые внешние детергенты
без некромантического колдуна,
противоположного вены, противоположной вены Трофейная жена, устанавливающая тренд, инвесторы коричневого цвета,
как портативное поле огня,
очаровательно, на мой взгляд,
еще одна безрукавная буря без запаха, без запаха, Алант Аральского моря, сложная вафля
для исповедуемого восхищения монголоидного типа металла.

но иногда:

Мое принятие за наименьшую битву при Люцене принесло бы наличные в течение того времени, когда Хеджира из колун
девятого рода Шайнер субдукции Seiurus согревала свою аудиторию

Да ладно, его использование английского лучше, чем мое.


8

VBA / Excel

[править 2]

Научили его, как спрягать глаголы, примеры, приведенные ниже, представляют собой простое прошедшее время:

Умеренный дикий кокаин скользил в ногу с историческим моментальным решением. Региональная безопасная глава раскололась внутри многочисленных случайных объектов. Желтый правый домен удален за хрупким магнитным полом. Физическое смертельное загрязнение началось после мертвой плохой сенсации. Когнитивно-храбрый театр вышел на передний план хрупкой сознательной литературы. Обычный фактический выход сопротивлялся от любимого иммунного сайта. Фиксированный экономический близнец признан из злой человеческой необходимости.

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

Все корни слов выбираются случайным образом, но я заставляю их располагаться в определенном шаблоне предложения:

Debug.Print getWords("ad adj adj nns vpa1s pl ad adj adj nns")

... что я использовал для генерации вывода выше. Отсюда следует общая форма: «Быстрая рыжая лиса перепрыгнула через ленивую коричневую собаку».

Function getWords(strStruc As String) As String
    Dim i As Long
    Dim s As Long
    Dim strIn As String
    Dim strOut As String

    getWords = ""
    s = numElements(strStruc)
    For i = 1 To s
        strIn = parsePattern(strStruc, i)
        Select Case strIn
            Case ",", ";", ":", """" 'punctuation
                strOut = strIn
                getWords = Trim(getWords)
            Case "ai", "ad" 'indefinite article, definite article
                strOut = getArticle(strIn)
            Case "adj" 'adjective
                strOut = getWord("adj", 1)
            Case "nns" 'noun nominative singular
                strOut = getWord("n", 1)
            Case "nnp" 'noun nominative plural
                strOut = getWord("n", 2)
            Case "nps" 'noun posessive singular
                strOut = getWord("n", 3)
            Case "npp" 'noun posessive plural
                strOut = getWord("n", 4)
            Case "vpr1s" 'Present 1st Person Singular
                strOut = getWord("v", 1)
            Case "vpr2s" 'Present 2nd Person Singular
                strOut = getWord("v", 2)
            Case "vpr3s" 'Present 3rd Person Singular
                strOut = getWord("v", 3)
            Case "vi" 'Infinitive
                strOut = getWord("v", 4)
            Case "vpp" 'Present Participle
                strOut = getWord("v", 5)
            Case "vi" 'Imperative/Subjunctive
                strOut = getWord("v", 6)
            Case "vpa1s" 'Past Tense First Person
                strOut = getWord("v", 7)
            Case "vpa2s" 'Past Tense Second Person
                strOut = getWord("v", 8)
            Case "vpa3s" 'Past Tense Third Person
                strOut = getWord("v", 9)
            Case "vppr1s" 'Present Progressive First Person Singular
                strOut = getWord("v", 10)
            Case "vppr2s" 'Present Progressive Second Person Singular
                strOut = getWord("v", 11)
            Case "vppr3s" 'Present Progressive Third Person Singular
                strOut = getWord("v", 12)
            Case "vppe1s" 'Present Perfect First Person Singular
                strOut = getWord("v", 13)
            Case "vppe2s" 'Present Perfect Second Person Singular
                strOut = getWord("v", 14)
            Case "vpp3s" 'Present Perfect Third Person Singular
                strOut = getWord("v", 15)
            Case "vi1s" 'Imperfect First Person Singular
                strOut = getWord("v", 16)
            Case "vi2s" 'Imperfect Second Person Singular
                strOut = getWord("v", 17)
            Case "v13s" 'Imperfect Third Person Singular
                strOut = getWord("v", 18)
            Case "vsf" 'Simple Future
                strOut = getWord("v", 19)
            Case "vfp" 'Future Progressive
                strOut = getWord("v", 20)
            Case "vc" 'Conditional
                strOut = getWord("v", 21)
            Case "vcp" 'Conditional Perfect
                strOut = getWord("v", 22)
            Case "vci" 'Conditional Imperfect
                strOut = getWord("v", 23)
            Case "pl" 'location prepositions
                strOut = getWord("pl", 1)
        End Select
        getWords = getWords & strOut & " "
    Next i
End Function

[начать оригинальный пост]

Все еще в стадии разработки, необходимо добавить логику для времен и множественного числа существительных / глаголов, а именно:

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

... который разбирается, но не имеет особого смысла.

Программирование позволяет их грязному рыбаку далеко от нашей свинины бросить вместо предложения.

Правильно. Не совсем предложение, но лучше, чем некоторые сообщения об ошибках JavaScript.

Его призыв поднимает каждый живой вопрос, который моя леди обрисовывает в общих чертах над ее английским языком.

Процедура недосказанности почти первосортная, хотя ...

Код для последующего анона. У этого конкурса есть крайний срок?

[править 1]

Код, сгенерированный выше.

Function getWord(sht As Worksheet) As String
    Dim i As Long
    Dim freq As Long
    Dim c As Long
    Dim f As Double
    Dim fSum As Double

    c = 4
    fSum = WorksheetFunction.Count(sht.Columns(c))
    f = Rnd() * fSum
    i = 2
    Do
        If i >= f Then Exit Do
        i = i + 1
    Loop
    getWord = sht.Cells(i, 1).Value
End Function
Function PCase(str As String) As String
    PCase = UCase(Left(str, 1)) & Right(str, Len(str) - 1)
End Function
Sub doMakeSentences01()
    Dim shtIn As Worksheet
    Dim shtOut As Worksheet
    Dim strSheet As String
    Dim rIn As Long
    Dim rOut As Long
    Dim cFreq As Long
    Dim c As Long
    Dim strPattern As String
    Dim w As Long
    Dim strOut As String
    Dim strIn As String
    Dim strWord As String

    cFreq = 4
    Set shtOut = Sheets("Output")
    rOut = shtOut.Range("A65536").End(xlUp).Row + 1

    strPattern = "anvajncanvian"
    For rOut = rOut To rOut + 1000
        strOut = ""
        For w = 1 To Len(strPattern)
            Set shtIn = Sheets(Mid(strPattern, w, 1))
            strWord = getWord(shtIn)
            If w = 1 Then strWord = PCase(strWord)
            strOut = strOut & strWord & " "
        Next w
        strOut = Trim(strOut) & "."
        shtOut.Cells(rOut, 1).Value = strOut
    Next rOut
End Sub

5
Где твой код?
ace_HongKongIndependence

Смотрите мои изменения для кода.
Брэндон Р. Гейтс

6

Perl 5

ОК, смелость программы заключается в следующем:

use v5.14;
my %pad = (
    ...
);
sub pad { shift =~ s(\{(.+?)\}){pad($pad{$1}[rand(@{$pad{$1}})])}rogue }
say ucfirst pad '{START}';

Это в основном двигатель "madlib". Чтобы на самом деле генерировать интересные предложения, вам нужно заполнить %padнекоторыми данными. Вот пример %pad...

my %pad = (
  START => ['{complex}.'],
  complex => [
    '{simple}',
    '{simple}, and {simple}',
    '{simple}, and {complex}',
    '{simple}, but {simple}',
    '{simple}, yet {simple}',
    'even though everybody knows {simple}, {simple}',
    'not only {simple}, but also {simple}',
  ],
  simple => [
    '{thing} {verb}s {thing}',
    '{thing} {verb}s {adverb}',
    '{thing} is {adjective}',
    '{things} {verb} {thing}',
    '{things} {verb} {adverb}',
    '{things} are {adjective}',
    '{thing} {past_verb} {thing}',
    '{things} {past_verb} {thing}',
  ],
  thing => [
    'the {adjective} gorilla',
    'the {adjective} mailbox',
    'Archbishop Desmond Tutu',
    'the beef salad sandwich',
    'the {adjective} stegosaur',
    'the summit of Mt Everest',
    'Chuck Norris',
    'the cast of television\'s "Glee"',
    'a {adjective} chocolate cake',
  ],
  things => [
    '{adjective} shoes',
    'spider webs',
    'millions of {adjective} eels',
    '{adjective} children',
    '{adjective} monkeys',
    '{things} and {things}',
    'the British crown jewels',
  ],
  verb => [
    'love',
    'hate',
    'eat',
    'drink',
    'follow',
    'worship',
    'respect',
    'reject',
    'welcome',
    'jump',
    'resemble',
    'grow',
    'encourage',
    'capture',
    'fascinate',
  ],
  past_verb => [  # too irregular to derive from {verb}
    'loved',
    'ate',
    'followed',
    'worshipped',
    'welcomed',
    'jumped',
    'made love to',
    'melted',
  ],
  adverb => [
    'greedily',
    'punctually',
    'noisily',
    'gladly',
    'regularly',
  ],
  adjective => [
    'enormous',
    'tiny',
    'haunted',
    'ghostly',
    'sparkling',
    'highly-decorated',
    'foul-smelling',
    '{adjective} (yet {adjective})',
    'expensive',
    'yellow',
    'green',
    'lilac',
    'tall',
    'short',
  ],
);

Вот несколько примеров мудрости, которую я обнаружил из этого %pad. Эти предложения не были отредактированы для длины, пунктуации, грамматики и т. Д., Хотя я выбрал некоторые неинтересные и переставил порядок, в котором появляются предложения - они уже не в том порядке, в котором они были созданы, но вместо этого я пытаюсь используйте их, чтобы рассказать историю: историю, которую, я надеюсь, вы найдете трогательной и заставляющей задуматься.

  • Паутина короткие.
  • Паутина очаровывает регулярно.
  • Короткие обезьяны сверкают, но паутина жадно пьет.
  • Сверкающие (но вонючие) обезьяны следовали за крошечной (но сверкающей) гориллой.
  • Вершина горы Эверест приветствовала высоко украшенного стегозавра.
  • Не только вершина горы Эверест стоит дорого, но и актерский состав телесериала «Радость» последовал за сверкающей гориллой.
  • Актерский состав телесериала "Glee" напоминает сиреневый почтовый ящик.
  • Дорогой почтовый ящик высокий, а дорогой стегозавр прыгает на Чака Норриса, а зеленые ботинки прыгали на бутерброд с салатом из говядины.
  • Сэндвич с салатом из говядины любил Чак Норрис.
  • Миллионы сверкающих угрей зеленые (но призрачные).

Теперь, если бы вы могли заполнить площадку программно
Pureferret

Заполнение площадки программно не является большой проблемой. Просто поцарапайте викисловарь или что-то в этом роде. Это не привело бы к таким забавным предложениям.
Tobyink

Это не очень сложная задача, но я думаю, что это забавная часть.
Pureferret

5

Г-жа слово

Я не уверен, что это приемлемо, но так как HTML есть, я думаю, что это также должно быть приемлемым.

 =rand(1,1)

Примеры предложений:

На вкладке «Вставка» галереи содержат элементы, предназначенные для согласования с общим видом вашего документа.

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

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


4

Работа в процессе с использованием JSoup и simpleNLG

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;

import simplenlg.framework.NLGFactory;
import simplenlg.lexicon.Lexicon;
import simplenlg.phrasespec.SPhraseSpec;
import simplenlg.realiser.english.Realiser;

/**
 * Scapes words from Wiktionary then assembles them into sentences
 * 
 * @author pureferret
 *
 */
public class SentenceBuilder {
    static ArrayList<String> ListOfWordTypes= new ArrayList<>(Arrays.asList("Noun","Verb","Adjective","Adverb","Proper noun","Conjunction"));
    private static String RandomWiktWord ="http://toolserver.org/~hippietrail/randompage.fcgi?langname=English";  
    /**
     * @param args
     */
    public static void main(String[] args) {
        Lexicon lexicon = Lexicon.getDefaultLexicon();
        NLGFactory nlgFactory = new NLGFactory(lexicon);
        Realiser realiser = new Realiser(lexicon);

        ArrayList<String> nounList = new ArrayList<String>();
        ArrayList<String> verbList = new ArrayList<String>();
        ArrayList<String> adjeList = new ArrayList<String>();
        ArrayList<String> adveList = new ArrayList<String>();
        ArrayList<String> pnouList = new ArrayList<String>();
        ArrayList<String> conjList = new ArrayList<String>();


        String word= null;
        String wordType = null;

        try {
            newDoc:
            while( nounList.size()<1 ||
                    verbList.size()<1 ||
//                  adjeList.size()<2 ||
//                  adveList.size()<2 ||
                    pnouList.size()<1){
                Document doc = Jsoup.connect(RandomWiktWord).get();
                Element bodyElem = doc.body();
                word = bodyElem.select("h1>span[dir=auto]").get(0).ownText();
                int wtIdx = 0;
                while(wtIdx<bodyElem.select("div#mw-content-text span.mw-headline").size()){
                    wordType = bodyElem.select("div#mw-content-text span.mw-headline").get(wtIdx).id()
                            .replace("_", " ");
                    wtIdx++;
                    switch (wordType) {
                    case "Proper noun":
                        pnouList.add(word);
                        continue newDoc;
                    case "Noun":
                        nounList.add(word);
                        continue newDoc;
                    case "Verb":
                        verbList.add(word);
                        continue newDoc;
                    case "Adjective":
                        adjeList.add(word);
                        continue newDoc;
                    case "Adverb":
                        adveList.add(word);
                        continue newDoc;
                    case "Conjunction":
                        conjList .add(word);
                        continue newDoc;
                    default:
                        break;
                    }
                }
            }
                SPhraseSpec p = nlgFactory.createClause();
                p.setSubject(pnouList.get(0));
                p.setVerb(verbList.get(0));
                p.setObject(nounList.get(0));

                String output2 = realiser.realiseSentence(p); // Realiser created earlier.
                System.out.println(output2);

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            System.err.println(word + " is a " + wordType);
        } catch (IndexOutOfBoundsException e) {
            e.printStackTrace();
            System.err.println(word + " is a " + wordType);
        }
    }

}

Вопросы:

  • Предложения слишком просты
  • Иногда 404 (без хорошей обработки!)
  • Только генерирует одно предложение за один раз
  • Использует корпус переключателя!

Пример выходов:

Пополока колотит фасоль.
Тропик Козерога балует тела.
Пекин синонимизировал наволочки.
Влияние чукчей на культуру.


3

PHP

<?php
  $trends = file_get_contents('http://www.google.com/trends/hottrends/widget?pn=p1&tn=30');
  preg_match_all("/widget-title-in-list'>(.+?)</", $trends, $m);

  $q = urlencode($m[1][array_rand($m[1])]);
  $page = file_get_contents("http://www.google.com/search?q=$q&btnI=1");
  preg_match_all('/[A-Z]([\w,]+ ){2,}[\w, ]+?[.!]/', strip_tags($page), $m);

  echo $m[0][array_rand($m[0])];

Он выбирает 30 самых популярных поисковых запросов в Google, выполняет поиск «Мне повезет», а затем отображает случайное предложение с этой страницы, содержащее не менее 3 слов.

Примеры:

«Она была признана фаворитом медали в этом событии».

«Кейт закончила среднюю школу на год раньше».

«15 апреля 2014 года, чтобы способствовать соблюдению политики в отношении биографий живых людей».

«От имени Брайана мы, его семья, хотели бы поблагодарить всех за излияние любви, молитв и поддержки».

«Эта статья об американском баскетболисте».

«К сожалению, в вашем браузере отключен JavaScript или нет поддерживаемого проигрывателя».


3

Python 2.7

python2.7 -c "import urllib2, pprint; pprint.pprint([str(x[:x.find('<')]) for x in unicode(urllib2.urlopen('http://codegolf.stackexchange.com/questions/21571/generate-an-understandable-sentence').read(), 'utf8').split('<p>') if x.find('<') >= 1][1].split('.')[0])"

выход:

Создать предложение, которое можно прочитать и понять


Используйте URI общего доступа Stack Exchange (например, /q/21571вместо /questions/21571/generate-an-understandable-sentence).
Blacklight Shining

2
Поскольку это не кодекс, разрывы строк для удобства чтения были бы хорошими.
nyuszika7h

2

Сценарии оболочки

Этот скрипт всегда будет отображать заголовок первого вопроса, который в данный момент находится над этим сайтом. Я предполагаю, что заголовок вопроса всегда будет удобочитаемым. И это будет меняться динамически. Таким образом, всякий раз, когда приходит новый вопрос и когда выполняется скрипт, он будет давать заголовок последнего вопроса.

curl "codegolf.stackexchange.com" -s |  w3m -dump -T text/html > foo.txt
awk 'f;/more tags/{f=1}' foo.txt > foo1.txt
sed '8q;d' foo1.txt

Пробный 1 выход

Find words containing every vowel

Пробная версия 2

Hello World 0.0!

РЕДАКТИРОВАТЬ

Не используя никаких файлов. Без файлов я могу использовать приведенный ниже скрипт.

value1=$(curl "codegolf.stackexchange.com" -s |  w3m -dump -T text/html)
echo "$value1" | grep -A 8 "more tags" | tail -1

Выход

Generate an understandable sentence

1
и при этом не читает их непосредственно из файла ...
rafaelcastrocouto

Я внес изменения, чтобы не использовать файл. Теперь он просто использовал переменные. Как насчет этого?
Рамеш

2
убрал голосование!
rafaelcastrocouto

2

JavaScript (ES6)

var t='';for(f of [_=>foo,_=>null.a,_=>0..toString(0)])try{f()}catch(e){t+=e.message+'\n';}t

Запуск его в консоли производит

foo is not defined
null has no properties
radix must be an integer at least 2 and no greater than 36

Еще короче:t='';for(f of [_=>foo,_=>null.a,_=>0..toString(0)])try{f()}catch(e){t+=e.message+'\n'}t
Зубная щетка

2

Еще один скрипт на Python

Ответ user3058846 не плохо, но это показывает каждые предложения, каждый раз. Здесь я предлагаю скрипт, который выводит случайное предложение из Zen of Python :

from random import choice
import subprocess
proc = subprocess.Popen(('python', '-c', 'import this'), stdout=subprocess.PIPE,)
# Get output of proc, split by newline
sentences = [x for x in proc.communicate()[0].splitlines() if x != '']
print(choice(sentences))

В одну строчку для поклонников :

from random import choice;import subprocess;print(choice([x for x in subprocess.Popen("python -c 'import this'",shell=True,stdout=subprocess.PIPE).communicate()[0].split('\n') if x]))

(Буо, грязно.)

Примеры:

>>> a()  # <--- a is just the oneline above
Explicit is better than implicit.
>>> a() 
Although never is often better than *right* now.
>>> a() 
Errors should never pass silently.
>>> a() 
Special cases aren't special enough to break the rules.


Еще один интересный способ в Python

Спасибо @TheDoctor за идею :-) Отключите вывод импорта и поиграйте с псевдо-зашифрованным dict в модуле.

import sys, random 
_stdout, sys.stdout = sys.stdout, open('/tmp/trash', 'w')  # silent the stdout just for the import
import this
sys.stdout = _stdout
lst = []
for x in this.s:
    if x in this.d:
        lst.append(this.d[x])
    else:
        lst.append(x)

# Then, example from the interpreter
>>> random.choice(''.join(lst).split('\n'))
'Beautiful is better than ugly.'
>>> random.choice(''.join(lst).split('\n'))
'Although never is often better than *right* now.'
>>>

Обычно это плохая практика shell=True. Хотя в этом случае это небезопасно, поскольку вы не принимаете пользовательский ввод, я бы выбрал subprocess.Popen(('python', '-c', 'import this')).
nyuszika7h

Знаете ли вы, если вы можете заставить замолчать стихотворение import this, в модуле есть переменная, thisкоторая содержит весь текст, но зашифрован. Есть также словарь для расшифровки.
TheDoctor

1
@TheDoctor Посмотри мой обновленный ответ: D
Максим Лоран

1

Python 3

Гарантировано генерировать грамматический вывод! (Обычно.)

import re
from urllib.request import urlopen
from random import random, choice as pick

letters = "abcdefghijklmnopqrstuvwxyz"
wordregex = re.compile(r'a href="/wiki/([a-z_]+)"')
subjects = {1:("I","we"), 2:("you",), 3:("they",)}
objects = {1:("me","us"), 2:("you",), 3:("him","her","it","them")}
patterns = ["{0} {1} {2}.",
            "Why do {0} {1} {2}?",
            "It's because {0} {1} {2}, of course.",
            "Did {0} {1} {2}?",
            "{0} will not {1} {2}!",
            ]

wiktionaryurl = "http://en.wiktionary.org/w/index.php?" + \
              "title=Category:English_{0}&pagefrom={1}"

def getWord(category):
    subset = pick(letters) + pick(letters)
    url = wiktionaryurl.format(category, subset)
    try:
        response = urlopen(url)
    except:
        print("An error occurred while connecting to the Internet!")
        return "fail"
    page = str(response.read())
    word = pick(wordregex.findall(page))
    word = word.replace("_", " ")
    return word

for i in range(10):
    verb = getWord("transitive_verbs")
    subjPerson = pick([1,2,3])
    subj = pick(subjects[subjPerson])
    if random() > 0.4:
        # Use a plural noun for the object
        obj = getWord("plurals")
    else:
        # Use a pronoun for the object
        objPerson = pick([1,2,3])
        while subjPerson == objPerson and subjPerson in (1,2):
            objPerson = pick([1,2,3])
        obj = pick(objects[objPerson])
    sentence = pick(patterns).format(subj, verb, obj)
    sentence = sentence[0].upper() + sentence[1:]
    print(sentence)

Чтобы сделать его совершенно грамматическим, удалите подчеркивание из wordregex. Это запретит многословные записи, которые приводят к неправильным предложениям, таким как «Мы ​​застегиваем вас».

Образец прогона:

We appropriate journals.
I will not masticate you!
Did you lower me?
Why do I sag estoppels?
They will not proofread you!
It's because you unbeguile mucosae, of course.
Why do I flack zakuski?
You will not visit junkpiles!
Did they goat us?
Why do we prefix nolids?

Любимый результат пока:

They you her.

Посмотрите это: http://en.wiktionary.org/wiki/you#Verb .


0

питон

Результат:

$ python mksentence.py
infringement lecture attainment
Produce more? (Y/N)y
impeachment recoup ornament
Produce more? (Y/N)y
maladjustment edit discouragement
Produce more? (Y/N)y
embellishment guest punishment
Produce more? (Y/N)y
settlement section escapement
Produce more? (Y/N)y
segment withhold recruitment
Produce more? (Y/N)

Я использовал список слов отсюда Найти слова, содержащие каждый гласный

Можно добавить еще несколько правил. Например, если слово, оканчивающееся на «ness», и слово также существует в множестве без суффикса, то это существительное.

Исходный код:

#!/usr/bin/env python
# vim: set fileencoding=utf-8 ts=4 sw=4 tw=72 :

from __future__ import (unicode_literals, absolute_import,
                        division, print_function)

import random                     

if __name__ == "__main__":        
    filename = 'corncob_lowercase.txt'
    noun = set()
    verb = set()
    whole_words_set = {word.rstrip() for word in open(filename)}

    for word in whole_words_set:
        if word.endswith('ment'):
            noun.add(word)
        elif word.endswith('ing'):
            if word[:-3] in whole_words_set:
                verb.add(word[:-3])
            elif word[:-3]+"e" in whole_words_set:
                verb.add(word[:-3]+"e")
    noun_list = list(noun)
    verb_list = list(verb)
    while True:                   
        sentence = "%s %s %s" % (random.choice(noun_list),
                                 random.choice(verb_list),
                                 random.choice(noun_list))                                                                                           
        print(sentence)
        if input("Produce more? (Y/N)").lower() == "n":
            break

3
Я действительно сосу Python и английский, или вы выводите 3 существительных вместо 2 существительных и глагол?
ace_HongKongIndependence

@ace Ой, я решил исправить код в последние минуты :-(
yegle

0

удар

Попытка запустить программу, которая существует, но не установлена, дает это (в Linux Mint 13).

$ say
The program 'say' is currently not installed.  To run 'say' please ask your administrator to install the package 'gnustep-gui-runtime'

В разных дистрибутивах это дает вам другое предложение.
TheDoctor

Вот почему я сказал в LM13
user80551

0

Python 3

Еще один дубль в Zen of Python , вдохновленный ответом Максима .

import codecs
import os
import sys
import random

stdout = sys.stdout
sys.stdout = open(os.devnull, 'r+')

import this

sys.stdout.close()
sys.stdout = stdout

zen = codecs.decode(this.s, 'rot-13').splitlines()

print(random.choice(zen))

0
var vocab={
    noun:{
        tp:{
            singular:["Mike","Chan","Karl","Mithun","Debasish","Kamal","Group","Crowd","He","She"],
            plural:["They"],
        },
        fp:{
            singular:["I"],
            plural:["We"]
        },
        sp:{
            singular:["You"],
            plural:["You"]
        }

    },
    verbIndicator:{
        tp:{
            present:{
                singular:["is"],
                plural:["are"]
            },
            past:{
                singular:["was"],
                plural:["were"]
            }
        },
        fp:{
            present:{
                singular:["am"],
                plural:["are"]
            },
            past:{
                singular:["was"],
                plural:["were"]
            }
        },
        sp:{
            present:{
                singular:["are"],
                plural:["are"]
            },
            past:{
                singular:["were"],
                plural:["were"]
            }
        }
    },
    verb:{
        continuous:{
            consumer:["having"],
            performer:["doing","playing","watching"]
        },
        simple:{
            consumer:["had"],
            performer:["did","played","watched"]
        }
    },
    dependentAction:{
        consumer:["food","fun","badtime"],
        performer:["movie","cricket","song","dance"]
    },
    independentAction:["Cooking","Playing","singing"],
    adjective:["good","bad","excellent","awesome"],
    object:["boy","Person","girl","Human being","Man","Mental"]
}

var referenceBook={
    figure:["fp","sp","tp"],
    time:["present","past"],
    singularity:["singular","plural"],
    verState:{
        present:["continuous"],
        past:["continuous","simple"]
    },
    objectRole:["consumer","performer"]
};

function getTerm(term) {
    var cur = referenceBook[term] || [];
    var randomIndex = Math.ceil((Math.random() * 93967)) % cur.length;
    return cur[randomIndex]

}
function getToken(key) {
    var path = key.split("-");
    var token = vocab;
    path.forEach(function(s) {
        token = token[s];
   });

    return token[Math.ceil((Math.random() * 1000)) % token.length];

}

function generateSentence(rules) {
    rules.forEach(function(str) {
        var m = str.match(/{[^}]*}/g)

        var variable = {};
        if (m) {
            m.forEach(function(s) {
                s = s.replace(/(^{)|(}$)/g, "");
                variable[s] = getTerm(s);
            });

            for (var each in variable) {
                str = str.replace(new RegExp("{" + each + "}", 'g'), variable[each]);

            }
        }
        var cur = str.split("|");
        var sentence = "";
        cur.forEach(function(s) {
            sentence += " " + getToken(s);

        })
        console.log(sentence);

    })


};
/*

In the rules array, I specify rules for the sentence to be genrated

*/

var rules = [
    "noun-{figure}-{singularity}|verbIndicator-{figure}-{time}-{singularity}|verb-continuous-{objectRole}|dependentAction-{objectRole}", 
    "noun-sp-singular|adjective|object"
];

generateSentence(rules);

4
Пожалуйста, укажите, какой это язык.
Родольфо Диас

1
@RodolfoDias Я уверен, что это Javascript ... но не уверен.
TheDoctor
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.