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") }