You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

92 lines
1.8 KiB

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
}