Random sentence from book: Difference between revisions

Added Wren
m (simplified phrase: "when the sentence ends in a sentence ending" => "after adding a sentence ending")
(Added Wren)
Line 670:
 
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>
9,490

edits