|
|
package main
import ( "fmt" "io/ioutil" "strconv" "strings" )
type Markov struct{}
/*type NextState struct { Word string Count int Prob float64 }*/ type State struct { Word string Count int Prob float64 NextStates []State }
var markov Markov
func addWordToStates(states []State, word string) ([]State, int) { iState := -1 for i := 0; i < len(states); i++ { if states[i].Word == word { iState = i } }
if iState > 0 { states[iState].Count++ } else { var tempState State tempState.Word = word tempState.Count = 1
states = append(states, tempState) iState = len(states) - 1 } //fmt.Println(iState)
return states, iState }
func countWordsProb(words []string) { var states []State totalWordsCount := 0 //count words
for i := 0; i < len(words); i++ { var iState int totalWordsCount++ states, iState = addWordToStates(states, words[i]) if iState != len(words)-1 { states[iState].NextStates, _ = addWordToStates(states[iState].NextStates, words[iState+1]) } }
//count prob
for i := 0; i < len(states); i++ { states[i].Prob = (float64(states[i].Count) / float64(totalWordsCount) * 100) for j := 0; j < len(states[i].NextStates); j++ { states[i].NextStates[j].Prob = (float64(states[i].NextStates[j].Count) / float64(totalWordsCount) * 100) } } fmt.Println("totalWordsCount: " + strconv.Itoa(totalWordsCount)) fmt.Println(states) }
func textToWords(text string) []string { s := strings.Split(text, " ") words := s return words }
func readText(path string) (string, error) { data, err := ioutil.ReadFile(path) if err != nil { //Do something
} content := string(data) return content, err }
func (markov Markov) train(firstWord string, path string) string { text, _ := readText(path) words := textToWords(text) countWordsProb(words) return text }
|