arnaucube
arnaucube/flock-botnetPublic Self-hosted repository
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}