markov-go/main.go
2021-03-12 16:28:16 -05:00

91 lines
1.7 KiB
Go

package main
import (
"bufio"
"fmt"
"math/rand"
"os"
"strings"
)
func readText(filename string) []string {
f, _ := os.Open(filename)
defer f.Close()
scanner := bufio.NewScanner(f)
scanner.Split(bufio.ScanWords)
words := make([]string, 0)
for scanner.Scan() {
words = append(words, strings.ToLower(scanner.Text()))
}
return words
}
func makePairs(words []string) [][]string {
pairs := make([][]string, len(words)-1)
for i := 0; i < len(words)-1; i++ {
pairs[i] = append(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]
_, key_exists := CFD[word1]
if key_exists {
_, 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, seedWord string) {
text := make([]string, 10)
// text[0] = seedWord
word1 := seedWord
for i := range text {
wordCFD := CFD[word1]
probabilitySpread := make([]string, 0)
for word2, freq := range wordCFD {
for j := 0; j <= freq; j++ {
probabilitySpread = append(probabilitySpread, word2)
}
}
randword := pickRandWord(probabilitySpread)
text[i] = word1
word1 = randword
}
fmt.Print(text)
}
func main() {
words := readText("./text.txt")
pairs := makePairs(words)
CFD := buildCFD(pairs)
generateText(CFD, "the")
}