93 lines
1.7 KiB
Go
93 lines
1.7 KiB
Go
package main
|
|
|
|
import (
|
|
"bufio"
|
|
"fmt"
|
|
"math/rand"
|
|
"os"
|
|
"strings"
|
|
)
|
|
|
|
func readFile(filename string) []string {
|
|
f, _ := os.Open(filename)
|
|
defer f.Close()
|
|
|
|
scanner := bufio.NewScanner(f)
|
|
scanner.Split(bufio.ScanWords)
|
|
var words []string
|
|
for scanner.Scan() {
|
|
words = append(words, strings.ToLower(scanner.Text()))
|
|
}
|
|
return words
|
|
}
|
|
|
|
func makePairs(words []string) [][]string {
|
|
var pairs [][]string
|
|
for i := 0; i < len(words)-1; i++ {
|
|
pairs = append(pairs, words[i:i+2])
|
|
}
|
|
return pairs
|
|
}
|
|
|
|
func buildCFD(pairs [][]string) map[string]map[string]int {
|
|
|
|
CFD := make(map[string]map[string]int)
|
|
for i := range pairs {
|
|
word1 := pairs[i][0]
|
|
word2 := pairs[i][1]
|
|
|
|
// a map returns two values: the 'value' in the key-value pair and a bool
|
|
// representing whether the key exists
|
|
_, wordexists := CFD[word1]
|
|
|
|
if wordexists {
|
|
_, fd_exists := CFD[word1][word2]
|
|
|
|
if fd_exists {
|
|
CFD[word1][word2]++
|
|
} else {
|
|
CFD[word1][word2] = 1
|
|
}
|
|
|
|
} else {
|
|
CFD[word1] = map[string]int{word2: 1}
|
|
}
|
|
}
|
|
return CFD
|
|
|
|
}
|
|
|
|
func pickRandWord(probabilitySpread []string) string {
|
|
randomIndex := rand.Intn(len(probabilitySpread))
|
|
return probabilitySpread[randomIndex]
|
|
}
|
|
|
|
func generateText(CFD map[string]map[string]int) []string {
|
|
text := make([]string, 10)
|
|
word := "the"
|
|
for i := range text {
|
|
wordCFD := CFD[word]
|
|
var probabilitySpread []string
|
|
for word2, freq := range wordCFD {
|
|
for j := 0; j <= freq; j++ {
|
|
probabilitySpread = append(probabilitySpread, word2)
|
|
}
|
|
}
|
|
randword := pickRandWord(probabilitySpread)
|
|
|
|
text[i] = word
|
|
word = randword
|
|
}
|
|
return text
|
|
|
|
}
|
|
|
|
func main() {
|
|
words := readFile("./deluze.txt")
|
|
pairs := makePairs(words)
|
|
CFD := buildCFD(pairs)
|
|
text := generateText(CFD)
|
|
fmt.Print(strings.Join(text, " "))
|
|
fmt.Print("\n")
|
|
}
|