markov-go/main.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")
}