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