Random sentence from book: Difference between revisions
Content added Content deleted
m (simplified phrase: "when the sentence ends in a sentence ending" => "after adding a sentence ending") |
(Added Wren) |
||
Line 670: | Line 670: | ||
The ringing impact of trucks, the person or entity that provided you with the torrent to recover it. |
The ringing impact of trucks, the person or entity that provided you with the torrent to recover it. |
||
</pre> |
|||
=={{header|Wren}}== |
|||
{{libheader|Wren-seq}} |
|||
<lang ecmascript>import "io" for File |
|||
import "random" for Random |
|||
import "/seq" for Lst |
|||
// puctuation to keep (also keep hyphen and apostrophe but don't count as words) |
|||
var ending = ".!?" |
|||
var pausing = ",:;" |
|||
// puctuation to remove |
|||
var removing = "\"#$\%&()*+/<=>@[\\]^_`{|}~“”" |
|||
// read in book |
|||
var fileName = "36-0.txt" // local copy of http://www.gutenberg.org/files/36/36-0.txt |
|||
var text = File.read(fileName) |
|||
// skip to start |
|||
var ix = text.indexOf("No one would have believed") |
|||
text = text[ix..-1] |
|||
// remove extraneous punctuation |
|||
for (r in removing) text = text.replace(r, "") |
|||
// split into words |
|||
var words = text.split(" ").where { |w| w != "" }.toList |
|||
// treat 'ending' and 'pausing' punctuation as words |
|||
for (i in 0...words.count) { |
|||
var w = words[i] |
|||
for (p in ending + pausing) if (w.endsWith(p)) words[i] = [w[0...-1], w[-1]] |
|||
} |
|||
words = Lst.flatten(words) |
|||
// Keep account of what words follow words and how many times it is seen |
|||
var dict1 = {} |
|||
for (i in 0...words.count-1) { |
|||
var w1 = words[i] |
|||
var w2 = words[i+1] |
|||
if (dict1[w1]) { |
|||
dict1[w1].add(w2) |
|||
} else { |
|||
dict1[w1] = [w2] |
|||
} |
|||
} |
|||
for (key in dict1.keys) dict1[key] = [dict1[key].count, Lst.individuals(dict1[key])] |
|||
// Keep account of what words follow two words and how many times it is seen |
|||
var dict2 = {} |
|||
for (i in 0...words.count-2) { |
|||
var w12 = words[i] + " " + words[i+1] |
|||
var w3 = words[i+2] |
|||
if (dict2[w12]) { |
|||
dict2[w12].add(w3) |
|||
} else { |
|||
dict2[w12] = [w3] |
|||
} |
|||
} |
|||
for (key in dict2.keys) dict2[key] = [dict2[key].count, Lst.individuals(dict2[key])] |
|||
var rand = Random.new() |
|||
var weightedRandomChoice = Fn.new { |value| |
|||
var n = value[0] |
|||
var indivs = value[1] |
|||
var r = rand.int(n) |
|||
var sum = 0 |
|||
for (indiv in indivs) { |
|||
sum = sum + indiv[1] |
|||
if (r < sum) return indiv[0] |
|||
} |
|||
} |
|||
// build 5 random sentences say |
|||
for (i in 1..5) { |
|||
var sentence = weightedRandomChoice.call(dict1["."]) |
|||
var lastOne = sentence |
|||
var lastTwo = ". " + sentence |
|||
while (true) { |
|||
var nextOne = weightedRandomChoice.call(dict2[lastTwo]) |
|||
sentence = sentence + " " + nextOne |
|||
if (ending.contains(nextOne)) break // stop on reaching ending punctuation |
|||
lastTwo = lastOne + " " + nextOne |
|||
lastOne = nextOne |
|||
} |
|||
// tidy up sentence |
|||
for (p in ending + pausing) sentence = sentence.replace(" %(p)", "%(p)") |
|||
sentence = sentence.replace("\n", " ") |
|||
System.print(sentence) |
|||
System.print() |
|||
}</lang> |
|||
{{out}} |
|||
Sample run: |
|||
<pre> |
|||
In another second it had come into my mind. |
|||
He stopped behind to tell the neighbours. |
|||
A woman screamed. |
|||
Woe unto this unfaithful city! |
|||
As Mars approached opposition, Lavelle of Java set the wires of the afternoon. |
|||
</pre> |
</pre> |