わかりやすい文を生成する


55

問題:

読んで理解できる文を生成します。主語、動詞、目的語が含まれていなければならず、時制と複数形が一致していなければなりません。プログラムは、資格を得るために複数の異なる文を生成できる必要もあります。

ルール:

  • 文章のハードコーディングは許可されておらず、ファイルから直接読み取ることもできません(私はあなたを見ています、無防備です)
  • 単語リストはいくつでも持つことができます
  • プログラムによって生成された例文または2を送信します
  • すべての言語が受け入れられます
  • それはだなので、ほとんどのupvoted答えが勝利します

7
データマイニングがどのソースからも連続した単語を取得できないようにルールを変更する必要があることは、いくつかの回答(MatLab私が見ている)から明らかだと思います。
カールウィットソフト14

私は賢い人ですが、これは純粋に人気のコンテストなので、誰かがHotModelBikini jpgを投稿するだけです。それは何よりも多くの票を獲得します。
カールウィットソフト14

7
「水牛」または「魚」の繰り返しをサンプル文として使用する人は誰でも賛成します。

7
ここでのほとんどの回答は、テキストソースからの有効な完全な文をマイニングするか、基準を満たさない出力を生成します。私には、どちらのアプローチも質問の精神に反するように思えます!誰かが本当に感心したい場合は、有効な文構造のセットで始まり[Adjective] [pl. noun] [verb] [adjective] [pl. noun]、実際の辞書から引き出して(おそらくそこにある辞書APIの1つを使用して)空白を埋めるプログラムを提案できますか?数分余裕があれば自分で書きます!:(結局...Lazy Developers Write Lousy Programs.
ブライアンレイシー14

1
@Pureferret単語リストは、個々の単語のリストになります。ハードコーディングは完全な文章のリストです。単語リストでは、通常、プログラム内に完全な文をまとめるためのロジックが必要になります。ハードコード化された文では、基本的に印刷ステートメントが必要です。
8ビットツリー14

回答:


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データベースとして提出する必要があります。
ジェイソンC 14

18
「???」史上最高のコメント
レイ14

4
最初のルール「ファイルから直接読み取ること」は違反されていませんか?
kuldeep.kamboj 14

6
システムのソースコードを検索し、コメントからテキストを除外することは、実際には「直接読む」とは見なされません。
暴動14

7
およびSlave Overflow。SEウェブサイトのいい名前
TheDoctor 14

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のイースターエッグの1つです]

編集:ここでこの関数のコードを見ることができます:why.m


3
ここでコードを見ることができます:opg1.ucsd.edu/~sio221/SIO_221A_2009/SIO_221_Data/Matlab5/…–
エリシャ

8
2番目の例は文ではありません。それは不定詞です。
wchargin

2
ここでの答えは文だけではありません(他の高得点の回答を見てください)。タスクは、文のみを作成する必要があるとは言いません。文を作成できる必要があると言います。
エリシャ14

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
なぜ、たくさんのサルが同じことをすることができるのでしょう!
ティムS. 14

11
好き!次に、そこから出てくる文字を処理し、理解可能な文を見つけるプログラムを作成します!:)
TheDoctor 14

2
+1-発見部分を自動化する機会はありますか?タスクは、* one *(?)文を生成するように見えました。ところで:あなたはどれくらいの時間を費やしました;)
ウルフ14

20
どうやって手に入れたF**KS**Tまったくありません提供*では'ABCDEFGHIJKMLNOPQRSTUVWXYZ '
glglgl 14

3
@Ypnypn- 'TOS...'文字列は、対数スケールで各文字の頻度を表します。だから、A周波数を有しTB周波数を有しますO。0に変換されるJ最低の頻度Aを持ち、その逆対数は1です。最後の文字は頻度のあるスペースZ、またはround(exp(25 / 3.976))= 538であるため、スペースはの538倍頻繁に発生しますJタイプライターの猿問題にきちんとしたひねりを加えると思っただけです。

42

C

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

出力例:

ソフトウェアによる接続の中断
中断されたシステムコールを再起動する必要があります

また、件名、動詞、目的を持たない有効な文出力がたくさんあります。

タイマーの期限切れ
ファイルが存在します


これはいつどのように終了しますか?(それはしますが、理由はわかりません)
-phil294

1
@Blauhirn (初期値が0の型の変数)が再び0に達すると、ループ終了条件--iはfalseと評価されます。場合(例えばARM)符号なしで、すぐにその最大値(通常は255)にラップアラウンドし、場合0にカウントダウン署名されている(ほとんどのIntelシステム)(動作は厳密に未定義話しているが、それはその最小値に達する通常たら通常-128)最大値(通常127)に戻り、0までカウントダウンします。したがって、プログラムは通常合計256行を印刷します。icharcharichar
-ecatmur

37

Java

ランダムなウィキペディアの記事からイントロ文を引き出します:

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 + ".");
    }
}

時々不運になります。最小の文の長さを設定し、「:」で終わる文(すべての曖昧さ回避ページがそのように始まる)または「?」を含む文を除外することにより、これを最小限に抑えようとします。(疑問符でマークされた未解決の不明な情報を含む多くの記事があるようです)。文の境界は、ピリオドの後に空白が続き、その後に数字または大文字が続きます。

また、括弧で囲まれたテキスト(結果は依然として有効な文です)を除外して、文の境界ではないいくつかのピリオドを削除しようとしました。ソースの引用番号を削除するために、中括弧を除外します。例:

  • アイドルキュアは、カリフォルニア州ロングビーチのアリーナロックバンドでした。
  • 自己集束は、強い電磁放射にさらされた材料の屈折率の変化によって引き起こされる非線形光学プロセスです。
  • TB10Cs4H3は、ウリジンの修飾部位を基質RNAのシュードウリジンに導く非コードRNA分子のH / ACA様クラスのメンバーです。
  • シュメール神話の六頭の野生のラムは、古代イラクでラガシュの守護神であるニヌルタに殺された英雄の一人でした。
  • シュガーパパは、通常性的な関係を確立した後、典型的に若い女性または男性をサポートすることを申し出る男性の俗語です。
  • オールドベテルユナイテッドメソジスト教会は、サウスカロライナ州チャールストンのカルフーンセント222にあります。
  • ダグラス・ギアーズはアメリカの作曲家です。

文法の問題に気づいたら、それはウィキペディアの熱心な編集者ではないことのせいです!;-)


4
「有効」と「理解可能」には間違いなく違いがあります。私はあなたのためにいくつかの基質RNAシュードウリジンをここに持っています、ベイビー。
ジェイソンC 14

1
初めて実行したとき:Echinolittorina africana / Litorina africana Philippi、1847 / Litorina decollat​​a Philippi、1847 / Littorina africana / Littorina perplexa Turton、1932 / Nodilittorina africana。調べる!;)ハハ!OMG、2回目に実行したときに、Mikhail GorbachevのWikiページから1行が返されました。誰が私の名前を共有しますか。かなりおかしい。
ミハイルカジ14

2
「/」は実際にはありませんでした!ハハ:PIは新しい行を表すためにそれを使用しました。たぶん私は\ nを使用する必要があります。ここからです:en.wikipedia.org/wiki/Afrolittorina_africana。同義語の下の右側のテーブル:)とにかく、それは悪い印象ではなかったので、ミハイル・ゴルバチョフのものはかなりクールだったので、心配しないでください。そして、その後の文章はすべて正常でした。
ミハイルカジ14

2
この物理学は、これらの記事のいずれかの興味深い、最近の共同ユーザーに答えているかもしれません。
EP 14

2
それは確率の一般的ではあるが非常に直感的ではない側面である可能性があります。とはいえ、正式な分析が何を言うのかはわかりません。私も驚いた!「他の人」が関与していないことにも注意してください。
EP 14

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は、オペレーティングシステムに応じて\norまたはのみに等しくなり\r\nますが、決して<br>または同様ではありません。
timmyRS

@timmyRSはい、あなたは正しい、これは古いコメントです。なぜ私がその時に書いたのか分かりません。
nyuszika7h

33

PHP + Project Gutenberg

プレーンテキストドキュメントを一連の単語バイグラムに変換するPHPスクリプトを作成し、それを使用してランダムな文を生成します。Project Gutenbergの小さな活字を含む、Patrick Henryの「Give Me Liberty Or Give Me Death」スピーチの平文テキスト全体から生成されたより良い例の一部を次に示します。

  • Project Gutenberg Etext of nations、and slavery!

  • このスモールプリントの200周年をおaびします。

  • 明示的または偶発的ないかなる種類の損害についても、他の保証はありませんが、私にとっては死です!

ここで自分で試してみることができます。文の新しいバッチのページを更新します。

自分でソースコードを実行する場合$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の検索結果から派生しました検索結果のプレビュースニペットでそれに続いたもの。たぶん私はそれを再作成し、ここに投稿します。
ジェイソンC 14

これはどう!「先生、私たちはコンテストの改善に喜んでいます。」またはこれ!「彼らは、Etext 6の一部を改善するためのひどい瞬間の払い戻しを教えてくれます。最終更新日:2005年5月5日、私たちの戦いだけのために公式にリリースされました。」
Hosch250 14

1
But for me, death!:DIは、すべてのライセンス/契約が強力に終了したことを願っています。
ナビン14

ハハ、「私たちの戦いのためだけに正式にリリースされました。」
ジェイソンC 14

1
「何もありません」:(
TheNumberOne

29

Python

このエントリは、システム辞書全体から単語を選択します。ほとんどの名詞を動詞にしたり、その逆にしたりできるという事実を利用しています。いくつかのヒューリスティックを使用して単語を分類し、明白な不可能性を回避します。

いくつかのほぼ正常なステートメントが生成されます。

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
ミハイルカジ14

cat FILE | COMMANDUUOC ;)
nyuszika7h

@ nyuszika7hありがとう、今日は何かを学んだ。...しかし難しいかもしれない習慣を壊すその古い
AShelly

1
This smoke toasted some nonresidents.。うわー
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 14

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)。それは、末尾のスペースを取り除きます。その後、ピリオドを追加できます。
ブラックライトシャイニング14

@BlacklightShiningが更新しました。提案をありがとう。
8ビットツリー14

どういたしまして。バッファローの場合は+1。:)
ブラックライトシャイニング14


1
で表現itertoolsprint " ".join(takewhile(lambda _: randint(0, 5), repeat("buffalo"))).capitalize() + "."
nmclean

16

錆+トキポナ

すべての言語が受け入れられるため、RustToki 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ルールごとに1つの構造体または列挙型を作成しderiving(Rand)、それらに注釈を付けました。これにより、ランダムなPhrase構造体を無料で生成できます。次に、ToStrこれらの各構造体を実装して、文字列に変換します。

私が見つけたBNFルールはフランス語であり、またそれが私の提出物の多言語の性質を補強するので、私は意図的に構造名をフランス語のままにしました!

サンプル出力

BNFルールToki Pona辞書に基づいて行ったいくつかの出力とその翻訳。これらの翻訳はほとんど間違いだと思いますが、トキ・ポナは実際に文章を解釈する余地を残しています。

nasin mi tawa la jan li jaki

旅行中に誰かが汚染した

monsi li jaki li jan ike musi

お尻が汚れていて、面白い悪い人です

sina li tawa ale jelo e kili tawa e insa

あなたは果物と中心を黄色い宇宙に移動しました

課題

  • 動詞が他動詞であるかどうかはチェックしません。したがって、一部の文は文法的に正しくありません。
  • 一部の構造体は再帰的であり、ルールを繰り返すことができる場合、0、1、または2つの要素をランダムに出力します。これは、何千もの単語を含む長い間生成された文につながる可能性があります...
  • 出力の妥当性を実際に検証することはできません。BNF構文、辞書、および独自の推測に完全に依存しています:)

1
sina li tawa ale jelo e kili tawa e insa ==「あなたは果物と中心を黄色い宇宙に移動しました」機械にとってはかなり良いです。通常、上級のtpユーザーのみが変形構造を使用できます。
マシューマーティン14

1
monsi li jaki li jan ike musi ==お尻(尻?ジャークのように?)は汚れていて、おかしい悪い人です。
マシューマーティン14

1
@MatthewMartinさん、コメントありがとうございます!私は確かに私の投稿を表示するトキポナスピーカーを期待していなかったが、私はちんぷんかんぷん:)完了していないこれらのsenteces知ってうれしい
barjak

ヒント:コードゴルフではありません。
nyuszika7h 14

1
@ nyuszika7hコメントの目的がわからない。確かに、それは人気コンテストであるため、コードゴルフではありません。
バルジャック14

14

Python

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

間違いなく、はい。
レナエライダー14

14

プロローグ

prologのバックトラッキングと、英語の文法を近似する生成文法を使用して考えられるすべての文を生成ます。

このバージョンにはかなり限られた語彙と文構造がありますが、拡張は非常に簡単です。

コード:

% 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 14

答えにいくつかのサンプルを入れました。私はそれらすべてを投稿することができないけれども、それは、合計で2520の出力を生成します...
chrisd

11

Python

ご存知のように、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.

辞書であなたの言葉の一部を見つけることができません
でした

5
あなたの貧しい辞書に合うようにソフトウェアを調整しました。
アントニオラガニン14

2
OK。15000年後、私はそれらすべてを見つけたことを証明するために投稿します
ベリサリウス博士14

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%の確率でラッキーになります。次のようなものを生成します。

扁桃電気回路
Parkiaは、制限のないだった向こうはしかしぼろぼろ
彼longanimous社会
キブツする医師教育の理解不能な回答を
ジュリアス・シーザーに対して少しミュージカル劇場を
タイのゴジュウカラは
niggardlinessふざけセンターコントラあなたになぎ倒す
必要な外因性の洗剤の
魔術師降霊術のsans
鉱山ラトレイア反対これらの静脈の胸トロフィーの妻のトレンドを投資家は茶色の
何人-ポータブル火災の分野
本影チャーミングwhereunto私の答え
別のスクリュー緩い破片の嵐無臭斜めアラル海の複雑なワッフル
自称ためにはモンゴロイド系金属を喜ば

でも時々:

Lutzenの鉱山採択プロ最小バトルは、クリーバーのHejiraの間に引き寄せられ
ます

まあ、英語の使用は私のものよりも優れています。


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エラーメッセージよりも優れています。

彼のアピールは、私の女性が彼女の英語よりも上にあるすべての生きている質問を持ち上げます。

Innuendoのルーチンはほぼ一流です...

アノンに従うためのコード。このコンテストには期限がありますか?

[編集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 14

コードの編集を参照してください。
ブランドンR.ゲイツ14

6

Perl 5

OK、プログラムの基本はこれだけです:

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 14

プログラムでパッドにデータを入力することは、それほど難しくありません。ウィクショナリーか何かを削ってください。しかし、そのような楽しい文章は得られません。
tobyink

それほど難しいことではありませんが、楽しいことだと思います。
Pureferret 14

5

マイクロソフトワード

これが受け入れられるかどうかはわかりませんが、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が発生します(適切な処理なし!)
  • 一度に1つの文のみを生成します
  • スイッチケースを使用します!

サンプル出力:

ポポロカはランナービーンズをプリケットします。
熱帯の山羊座が玉を照らします。
北京は枕箱を同義語にした。
チュクチは影響を与えます。


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

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

出力:

読んで理解できる文を生成する


Stack Exchangeの共有URIを使用します(例:/q/21571ではなく/questions/21571/generate-an-understandable-sentence)。
ブラックライトシャイニング14

2
これはコードゴルフではないので、読みやすいように改行するのがいいでしょう。
nyuszika7h 14

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

ファイルを使用しないように変更しました。さて、変数を使用しただけです。これはどう?
ラメシュ14

2
反対票を削除しました!
ラファエルカストロクート14

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

1行で、ファンの場合:

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 14

の詩を黙らせることができるかどうかをご存知ですか?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

結果:

$ 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と英語を本当に嫌いですか、それとも2つの名詞と動詞の代わりに3つの名詞を出力していますか?
ace_HongKongIndependence 14

@aceおっと、最後の最後でコードを修正することにしました:
yegle 14

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

Maximeの回答に触発されたThe 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
これがどの言語かを明記してください。
ロドルフォディアス14

1
@RodolfoDiasこれはJavascriptであると確信しています...確かではありません。
TheDoctor
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.