이해할 수있는 문장을 생성


55

문제:

읽고 이해할 수있는 문장을 생성하십시오. 주제, 동사, 사물을 포함해야하며 시제와 복수가 일치해야합니다. 프로그램은 또한 자격을 갖추기 위해 여러 가지 다른 문장을 생성 할 수 있어야합니다.

규칙 :

  • 문장을 하드 코딩하는 것은 허용되지 않으며 파일에서 직접 읽지도 않습니다 (나는 당신을보고 있습니다, unclemeat)
  • 여러 단어 목록을 가질 수 있습니다
  • 프로그램에서 생성 한 예제 문장 또는 2를 제출하십시오.
  • 모든 언어가 허용됩니다
  • 그것은의 , 그래서 가장 upvoted 대답은 승리

7
데이터 마이닝이 어떤 소스에서든 연속 된 단어를 가져올 수 없도록 규칙을 수정해야한다는 답변 중 일부 ( MatLab I에서 찾고 있습니다)에서 분명하다고 생각합니다 .
Carl Witthoft

내가 똑똑한 사람이되는 동안 : 순전히 인기있는 경연 대회이기 때문에 누군가가 HotModelBikini jpg를 게시해야합니다. 그것은 무엇보다 많은 표를 얻을 것입니다.
Carl Witthoft

7
나는 "버팔로"또는 "물고기"의 반복을 예제 문장으로 사용하는 사람을지지 할 것이다!

7
대부분의 답변은 텍스트 소스에서 유효한 전체 문장을 채굴하거나 기준에 맞지 않는 출력을 생성합니다. 나에게 두 가지 접근 방식은 질문의 정신에 위배되는 것 같습니다! 누군가 정말로 감동을 원한다면 [Adjective] [pl. noun] [verb] [adjective] [pl. noun], 빈칸을 채우기 위해 실제 사전과 같은 유효한 문장 구조로 시작 하고 실제 사전에서 가져 오는 프로그램을 제안 할 수 있습니까? 여유 시간이 몇 분 남았다면 직접 작성하겠습니다! :( 결국 ...Lazy Developers Write Lousy Programs.
브라이언 레이스

1
@Pureferret 단어 목록은 개별 단어 목록입니다. 하드 코딩은 완전한 문장의 목록입니다. 단어 목록을 사용하면 일반적으로 완전한 문장을 구성하기 위해 프로그램의 논리가 필요합니다. 하드 코딩 된 문장의 경우 기본적으로 인쇄 문 만 있으면됩니다.
8bittree

답변:


87

세게 때리다

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

요구 사항 : / usr / src에 설치된 Linux 커널 소스

커널 소스에서 임의의 주석을 가져옵니다. 문장이 실제로 이해할 수 있는지 여부는 논쟁의 여지가 있습니다.

실제 출력의 예 :

  • 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데이터베이스 로 제출해야 합니다.
Jason C

18
"???" 최고의 의견
Ray

4
첫 번째 규칙은 '파일에서 직접 읽지 않습니다'가 위반되지 않습니까?
kuldeep.kamboj

6
시스템 소스 코드를 통해 검색하고 주석에서 텍스트를 필터링하는 것은 실제로 "직접 읽는"것으로 계산되지 않습니다.
Riot

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.

[이것은 Matlab의 부활절 달걀 중 하나입니다]

편집 : 당신은이 함수의 코드를 여기에서 볼 수 있습니다 : why.m


3
당신은 여기에 코드를 볼 수 있습니다 : opg1.ucsd.edu/~sio221/SIO_221A_2009/SIO_221_Data/Matlab5/…
Elisha

8
두 번째 예는 문장이 아닙니다. 부정사구입니다.
wchargin February

2
여기에 답이 있어야 문장뿐만 아니라 다른 높은 투표 답변을 볼 수 있습니다. 이 작업에서는 문장 만 만들어야한다고 말하지 않고 문장을 만들 수 있어야합니다.
Elisha

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 (ranklin) D (eleano) R (oosevelt)

또한 현재 상황에 대한 불만을 간결하게 표현하려는 수많은 독창적 인 태도. [일부 편지가 수정되었습니다.]

  • F**K
  • S**T

또한 다음과 같이 미세 조정 된 스케일링을 사용합니다.

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

60
왜 많은 원숭이들이 똑같이 할 수 있을까요!
Tim S.

11
나는 좋아한다! 이제 그로부터 나오는 글자를 처리하고 이해할 수있는 문장을 찾는 프로그램을 만드십시오! :)
TheDoctor

2
+1-발견 부분을 자동화 할 기회가 있습니까? 과제는 * 1 * (?) 문장을 생성하는 것으로 보인다. BTW : 당신은 얼마나 많은 시간을 보냈는가;)
Wolf

20
당신은 어떻게 얻었 는가 F**KS**T더 없다 제공 *에가 'ABCDEFGHIJKMLNOPQRSTUVWXYZ '?
glglgl

3
@Ypnypn- 'TOS...'문자열은 각 문자의 빈도를 로그 스케일로 나타냅니다. 그래서 A주파수를 갖고 T, B주파수가 있습니다 O. J가장 낮은 빈도는 A0으로 변환되며, 역 로그는 1입니다. 마지막 문자는 공백이있는 공백 Z또는 round (exp (25 / 3.976)) = 538이므로 공백은 538 배 더 자주 발생합니다 J. 원숭이 타자기 문제 에 깔끔하게 뒤 틀렸다고 생각했습니다 .

42

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

출력 예 :

소프트웨어 연결이 중단되었습니다
중단 된 시스템 호출을 다시 시작해야합니다

제목, 동사 및 객체가없는 유효한 문장 출력이 많이 있습니다.

타이머 만료
파일이 존재합니다


언제 어떻게 종료됩니까? (그렇지만 이해가되지 않습니다)
phil294

1
@Blauhirn ( 초기 값이 0 인 유형의 변수 )이 다시 0에 도달하면 루프 종료 조건 --i이 false로 평가 됩니다. 부호가없는 경우 (예 : ARM) 즉시 가장 큰 값 (일반적으로 255)으로 줄 바꿈하고 0으로 카운트 다운합니다. 부호가있는 (대부분의 인텔 시스템) 동작은 엄격하게 정의되지 않은 상태이지만 일반적으로 최소값에 도달하면 ( 일반적으로 -128) 최대 값 (일반적으로 127)까지 줄 바꿈하고 0으로 카운트 다운합니다. 따라서 프로그램은 일반적으로 총 256 줄을 인쇄합니다. icharcharichar
ecatmur

37

자바

임의의 Wikipedia 기사에서 소개 문장을 가져옵니다.

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- 유사 부류의 비-코딩 RNA 분자의 일원으로서 우리 딘의 기질 RNA의 슈도 우리 딘으로의 변형 부위를 안내한다.
  • 수메르 신화의 육두 와일드 램은 고대 이라크에서 라가 쉬의 수호신 니 누르 타가 죽인 영웅 중 하나였다.
  • Sugar daddy는 일반적으로 성적인 관계를 맺은 후 일반적으로 젊은 여성 또는 남성을 지원하도록 제안하는 남성의 속어입니다.
  • 올드 베델 연합 감리 교회는 사우스 캐롤라이나 주 찰스턴의 222 Calhoun St.에 위치하고 있습니다.
  • Douglas Geers는 미국의 작곡가입니다.

문법 문제가 발견되면 부지런한 Wikipedia 편집기가 아닌 것이 당신의 잘못입니다! ;-)


4
"유효한"과 "이해할 수있는"사이에는 분명히 차이가 있습니다. 여기에 당신을위한 기질 RNA 슈도 우리 딘이 있어요
Jason C

1
Echinolittorina africana / Litorina africana Philippi, 1847 / Litorina decollata Philippi, 1847 / Littorina africana / Littorina perplexa Turton, 1932 / Nodilittorina africana./ Wiki 페이지를 처음 실행했을 때이 문제가 발생했습니다. 검색! ;) 하하! OMG, 두 번째로 실행했을 때 Mikhail Gorbachev의 Wiki 페이지에서 한 줄을 반환했습니다. 누가 내 이름을 공유합니다. 정말 이상하다.
mikhailcazi 2019

2
'/'는 실제로 거기에 없었습니다! Haha : PI는 새 줄을 나타내는 데 사용했습니다. 아마도 \ n을 사용해야 할 것입니다. 그것은 여기에서있다 : en.wikipedia.org/wiki/Afrolittorina_africana . 오른쪽 표는 동의어 아래에 있습니다 :) 어쨌든, 그것은 나쁜 인상이 아니 었으므로 걱정하지 마십시오. Mikhail Gorbachev는 매우 시원했기 때문에 걱정하지 마십시오. 그리고 그 이후의 모든 문장은 정상이었습니다.
mikhailcazi

2
이 물리학 은 그 기사 중 하나의 흥미롭고 최근의 공동 사용자에게 답할 수 있습니다 .
EP

2
그것은 일반적이지만 매우 직관적이지 않은 가능성의 한 측면 일 수 있습니다. 수백만 명의 사람들이있는 세계에서 일대일 사건은 매우 흔할 수 있습니다. 즉, 공식 분석이 무엇을 말할지 잘 모르겠습니다. 나는 또한 놀랐다! 당신은 '다른 사람'이 관여하지 않는다는 것에 주목할 수도 있습니다.
EP

34

Soooo ... 이것은 이기 때문에 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 예, 당신 말이 맞아요. 이것은 오래된 의견입니다. 나는 왜 당시에 그 글을 썼는지 모르겠습니다.
nyuszika7 시간

33

PHP + 프로젝트 구텐베르크

나는 일반 텍스트 문서를 단어 bigrams 로 바꾸는 PHP 스크립트를 작성 했다. 그런 다음 무작위 문장을 생성하는 데 사용한다. 다음은 Project Gutenberg의 작은 글씨를 포함하여 Patrick Henry의 "Give Me Liberty 또는 Give Me Death"연설의 일반 텍스트 버전에서 생성 된 더 좋은 예입니다 .

  • 국가와 노예 제도의 구텐베르크 프로젝트!

  • 이 Small Print의 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 기반 문장 생성기가 있었지만 bigrams (또는 선택적으로 더 큰 n 그램)는 단어를 검색하고 관찰하여 Google 검색 결과에서 파생되었습니다. 검색 결과 미리보기 스 니펫에서 수행 한 내용 어쩌면 나는 그것을 다시 만들고 여기에 게시 할 것입니다.
Jason C

이건 어때! "경사를 향상시키기 위해 어떤 것이 기뻤습니까?" 아니면 이것! "Etext 6의 일부를 개선하기 위해 끔찍한 순간의 환불을 알려줍니다. 마지막 업데이트 날짜 : 2005 년 5 월 5 일 우리의 전투에만 공식적으로 발표되었습니다."
Hosch250

1
But for me, death!: DI는 모든 라이센스 / 계약이 강력하게 종료되기를 바랍니다.
Navin

하하, "공식적으로 만 전투에서 풀려났다."
Jason C

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

그리고 Monty Python이 음란 한 수녀를 만드는 것처럼 들리는 많은 것들 :

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 ;)
nyuszika7 시간

@ nyuszika7h 감사합니다, 오늘 뭔가를 배웠습니다. 낡은 습관을 깨기 힘들지만 ...
AShelly

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

파이썬 :

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

시료:

  • 버팔로 버팔로 버팔로.
  • 버팔로 버팔로 버팔로 버팔로 버팔로 버팔로 버팔로 버팔로.

불행히도 구두점과 대문자 표기법이 다소 좋지 않지만 다시 요구 사항으로 표시되지 않았습니다.

또한 여기 에 참조가 있습니다.


3
버팔로 리터럴에 공백을 추가하지 마십시오. 대신을 사용하십시오 ' '.join(l). 그것은 후행 공간을 제거 할 것입니다. 그런 다음 마침표를 추가하면됩니다.
Blacklight Shining

@BlacklightShining 업데이트되었습니다. 제안 해 주셔서 감사합니다.
8bittree

천만에요. 버팔로 +1 :)
Blacklight Shining


1
로 표현 itertools ,print " ".join(takewhile(lambda _: randint(0, 5), repeat("buffalo"))).capitalize() + "."
nmclean

16

녹 + 토키 포나

모든 언어가 허용되므로 Rust 에서 Toki Pona로 문장을 생성 하는 프로그램을 작성했습니다 .

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);
}

나는 Toki Pona를 구사하지 않지만, Wikipedia 의 BNF 규칙 세트로 Toki Pona구문을 찾았습니다 . 각 BNF 규칙마다 하나의 구조체 또는 열거 형을 만들고에 주석을 달았습니다 deriving(Rand).이를 통해 임의의 Phrase구조체를 무료 로 생성 할 수 있습니다! 그런 다음 ToStr각 구조체에 대해 문자열로 변환하기 위해 구현 했습니다.

내가 찾은 BNF 규칙이 프랑스어로되어 있고 제출물의 다국어 특성을 재 정보화하기 때문에 의도적으로 프랑스어로 구조체 이름을 남겼습니다!

샘플 출력

BNF 규칙Toki Pona 사전을 기반으로 한 일부 출력 및 번역 . 나는이 번역이 대부분 잘못되었다고 확신하지만, Toki Pona는 실제로 문장을 해석 할 수있는 여지를 많이 남겨 둡니다.

나신 미 타와 라 얀 리 자키

내 여행 중에 누군가가 오염 됐어

몬시 리 자키 리 얀 이케 무스

엉덩이가 더럽고 재미있는 나쁜 사람입니다.

sina li tawa ale jelo e kili 타와 전자 인사

과일과 중심을 노란 우주로 옮겼습니다

이슈

  • 동사가 전이인지 아닌지 확인하지 않으므로 일부 문장이 문법적으로 잘못되었습니다.
  • 일부 구조체는 재귀 적이며 규칙을 반복 할 수있을 때 무작위로 0, 1 또는 2 요소를 출력하도록 선택합니다. 이것은 수천 단어를 포함하는 veeeeeery 긴 생성 문장으로 이어질 수 있습니다 ...
  • 나는 실제로 출력의 유효성을 확인할 수 없으며 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

힌트 : 코드 골프가 아닙니다.
nyuszika7 시간

1
@ nyuszika7h 귀하의 의견의 목적이 무엇인지 잘 모르겠습니다. 실제로 인기 골프 대회이기 때문에 코드 골프가 아닙니다.
barjak

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

의심 할 여지없이 그렇습니다.
Renae Lider

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

파이썬

아시다시피, 몇 가지만으로 파이썬에서 무엇이든 할 수 있습니다 import. 이 간단한 작업은이 2 줄 파이썬 스크립트로 수행 할 수 있습니다.

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.

사전에서 당신의 단어 일부를 찾지 못했습니다
Dr. belisarius

5
열악한 사전에 더 잘 맞도록 소프트웨어를 조정했습니다.
Antonio Ragagnin

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 %가 운이 좋습니다. 다음과 같은 것을 생성합니다.

amygdaloid 전기 회로
Parkia이었다 저쪽은 무제한 적 비록 울퉁불퉁
그의 longanimous 사회
키부츠하는 교육 이해할 수없는 응답의 의사를
율리우스 카이사르에 대한 작은 뮤지컬
타이 동고비가
niggardliness 낚시를 좋아하는 센터 콘트라 네에서 아래로 깍는
필요한 외부 세제
산세 강령술 마법사
광산 흠숭 지례 반대 이러한 베나 pectoralis을 트로피 아내의 유행을 투자자 갈색
어떤 사람이 휴대용 화재의 필드
본영 매력적으로 구하였 내 대답은
다른 나사 느슨한 파편 폭풍 냄새가없고 비스듬히 아랄 해 복잡한 와플
공언에 대한이 몽골 종류의 금속을 즐겁게

하지만 가끔은:

내 채택은 칼의 그런데 Hejira 동안의 그릴 현금 것 Lutzen의 적어도 전투 프로
그녀의 고객을 흐뭇한 구 일반적인 빛내는의 침강 속 Seiurus

글쎄, 영어를 사용하는 것이 나보다 낫습니다.


8

VBA / 엑셀

[편집 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 오류 메시지보다 낫습니다.

그의 호소는 내 여인이 그녀의 영어에 대해 간략히 설명하는 모든 라이브 질문을 해제합니다.

풍자 루틴은 거의 최고 수준입니다 ...

anon을 따르는 코드. 이 콘테스트에 마감일이 있습니까?

[편집 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

코드 편집 내용을 참조하십시오.
Brandon R. Gates

6

펄 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있습니다. 이 문장은 길이, 문장 부호, 문법 등으로 편집되지 않았지만, 흥미롭지 않은 문장을 정리하고 문장이 나타나는 순서를 재정렬했지만 더 이상 순서대로 생성되지는 않았지만 대신 이야기를 나누기 위해 그것들을 사용하십시오 : 이야기 당신이 감동적이고 생각을 자극하는 것을 발견하기를 바랍니다.

  • 거미줄은 짧습니다.
  • 거미줄은 정기적으로 매혹적입니다.
  • 짧은 원숭이는 반짝이지만 거미줄은 탐욕스럽게 마신다.
  • 번쩍이는 (아직도 악취가 나는) 원숭이는 작은 (아직 번쩍이는) 고릴라를 따랐다.
  • 에베레스트 산의 정상 회담은 매우 장식 된 스테고 사우루스를 환영했습니다.
  • 에베레스트 산의 정상 회담은 비쌀뿐만 아니라 텔레비전의 "기쁨"캐스트도 반짝이는 고릴라를 따라 갔다.
  • 텔레비전의 "기쁨"캐스트는 라일락 우편함과 비슷합니다.
  • 고가의 우체통은 키가 크고 비싸고 stegosaur는 Chuck Norris를 뛰어 넘지 만 녹색 신발은 쇠고기 샐러드 샌드위치를 ​​뛰어 넘었습니다.
  • 쇠고기 샐러드 샌드위치는 척 노리스를 좋아했습니다.
  • 수백만의 반짝이는 뱀장어는 ​​녹색입니다 (아직 유령).

프로그래밍 방식으로 패드를 채울 수 있다면
Pureferret

프로그래밍 방식으로 패드를 채우는 것은 그리 어렵지 않습니다. 위키 낱말 사전 같은 것을 긁어보세요. 그래도 재미있는 문장은 나오지 않습니다.
tobyink

별로 도전 적이지는 않지만 재미있는 부분이라고 생각합니다.
Pureferret

5

MS 워드

이것이 허용 가능한지 확실하지 않지만 html이 허용되기 때문에 이것이 허용되어야한다고 생각합니다.

 =rand(1,1)

샘플 문장 :

삽입 탭의 갤러리에는 문서의 전체 모양과 조화를 이루도록 설계된 항목이 포함되어 있습니다.

이 갤러리를 사용하여 테이블, 머리글, 바닥 글, 목록, 표지 및 기타 문서 빌딩 블록을 삽입 할 수 있습니다.

여러 문장과 단락을 지정할 수도 있습니다.


4

JSoupsimpleNLG를 사용하여 진행중인 작업

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 (손잡이없이!)
  • 한 번에 한 문장 만 생성
  • 스위치 케이스를 사용합니다!

샘플 출력 :

Popoloca는 주자 콩을 prickethes.
염소 자리의 트로픽은 bodles를 올립니다.
베이징은 베개 상자의 대명사입니다.
축 치가 영향을 미쳤습니다.


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 검색을 가져 와서 "I Feel Lucky"검색을 수행 한 다음 해당 페이지에서 3 단어 이상으로 임의의 문장을 표시합니다.

예 :

"그녀는이 행사에서 메달을 가장 좋아하는 선수로 여겨졌다."

"케이트는 1 년 일찍 고등학교를 졸업했습니다."

"살아있는 사람들의 전기에 관한 정책의 준수를 장려하기 위해 2014 년 4 월 15 일."

"브라이언을 대신하여 우리 가족은 사랑과기도와 지원이 쏟아지는 것에 대해 모두에게 감사를 표합니다."

"이 기사는 미국 농구 선수에 관한 것입니다."

"죄송합니다. 브라우저에서 JavaScript가 비활성화되었거나 지원되는 플레이어가 없습니다."


3

파이썬 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])"

산출:

읽고 이해할 수있는 문장을 생성


Stack Exchange의 공유 URI를 사용하십시오 (예 : /q/21571대신 /questions/21571/generate-an-understandable-sentence).
Blacklight Shining

2
이것은 코드 골프가 아니기 때문에 가독성을위한 줄 바꿈이 좋습니다.
nyuszika7 시간

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

파일을 사용하지 않도록 변경했습니다. 이제 변수를 사용했습니다. 이건 어때?
Ramesh

2
투표를 제거했습니다!
rafaelcastrocouto

2

자바 스크립트 (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

또 다른 파이썬 스크립트

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]))

(Boooh, 더럽다)

예 :

>>> 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.


파이썬의 또 다른 재미있는 방법

@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')).
nyuszika7 시간

의시를 침묵시킬 수 있는지 알고 있습니까? import this모듈 this에 모든 텍스트를 포함하지만 암호화 된 변수 가 있습니다. 해독 할 사전도 있습니다.
TheDoctor

1
내 업데이트 된 대답을 봐 @TheDoctor : D
막심 Lorant

1

파이썬 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
나는 파이썬과 영어를 정말로 빨아 들입니까, 아니면 2 명사와 동사 대신 3 명사를 출력하고 있습니까?
ace_HongKongIndependence

@ace Oops, 마지막 순간에 코드를 수정하기로 결정했습니다 :-(
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

파이썬 3

또 다른에 걸릴 파이썬의 선 에서 영감을, 막심의 대답 .

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
이것이 어떤 언어인지 말하십시오.
Rodolfo Dias

1
@RodolfoDias 나는 이것이 자바 스크립트라고 확신합니다 ...하지만 확실하지 않습니다.
TheDoctor
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.