|
|
@ -0,0 +1,92 @@ |
|
|
|
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 |
|
|
|
} |