flock-botnet/markov.go
markov.goRaw
1package main
2
3import (
4 "fmt"
5 "io/ioutil"
6 "math/rand"
7 "strconv"
8 "strings"
9)
10
11type Markov struct{}
12
13/*type NextState struct {
14 Word string
15 Count int
16 Prob float64
17}*/
18type State struct {
19 Word string
20 Count int
21 Prob float64
22 NextStates []State
23}
24
25var markov Markov
26
27func addWordToStates(states []State, word string) ([]State, int) {
28 iState := -1
29 for i := 0; i < len(states); i++ {
30 if states[i].Word == word {
31 iState = i
32 }
33 }
34 if iState >= 0 {
35 states[iState].Count++
36 } else {
37 var tempState State
38 tempState.Word = word
39 tempState.Count = 1
40
41 states = append(states, tempState)
42 iState = len(states) - 1
43
44 }
45 return states, iState
46}
47
48func calcMarkovStates(words []string) []State {
49 var states []State
50 //count words
51 for i := 0; i < len(words)-1; i++ {
52 var iState int
53 states, iState = addWordToStates(states, words[i])
54 if iState < len(words) {
55 states[iState].NextStates, _ = addWordToStates(states[iState].NextStates, words[i+1])
56 }
57 }
58
59 //count prob
60 for i := 0; i < len(states); i++ {
61 states[i].Prob = (float64(states[i].Count) / float64(len(words)) * 100)
62 for j := 0; j < len(states[i].NextStates); j++ {
63 states[i].NextStates[j].Prob = (float64(states[i].NextStates[j].Count) / float64(len(words)) * 100)
64 }
65 }
66 fmt.Println("total words computed: " + strconv.Itoa(len(words)))
67 //fmt.Println(states)
68 return states
69}
70
71func textToWords(text string) []string {
72 s := strings.Split(text, " ")
73 words := s
74 return words
75}
76
77func readText(path string) (string, error) {
78 data, err := ioutil.ReadFile(path)
79 if err != nil {
80 //Do something
81 }
82 dataClean := strings.Replace(string(data), "\n", " ", -1)
83 content := string(dataClean)
84 return content, err
85}
86
87func (markov Markov) train(firstWord string, path string) []State {
88 text, _ := readText(path)
89 words := textToWords(text)
90 states := calcMarkovStates(words)
91 //fmt.Println(states)
92
93 return states
94}
95
96func getNextMarkovState(states []State, word string) string {
97 iState := -1
98 for i := 0; i < len(states); i++ {
99 if states[i].Word == word {
100 iState = i
101 }
102 }
103 if iState < 0 {
104 return "word no exist on the memory"
105 }
106 var next State
107 next = states[iState].NextStates[0]
108 next.Prob = rand.Float64() * states[iState].Prob
109 for i := 0; i < len(states[iState].NextStates); i++ {
110 if (rand.Float64()*states[iState].NextStates[i].Prob) > next.Prob && states[iState-1].Word != states[iState].NextStates[i].Word {
111 next = states[iState].NextStates[i]
112 }
113 }
114 return next.Word
115}
116func (markov Markov) generateText(states []State, initWord string, count int) string {
117 var generatedText []string
118 word := initWord
119 generatedText = append(generatedText, word)
120 for i := 0; i < count; i++ {
121 word = getNextMarkovState(states, word)
122 generatedText = append(generatedText, word)
123 }
124 generatedText = append(generatedText, ".")
125 text := strings.Join(generatedText, " ")
126 return text
127}