forked from Raditss/Tubes3_13521019_BE
-
Notifications
You must be signed in to change notification settings - Fork 0
/
textq.go
129 lines (116 loc) · 3.38 KB
/
textq.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package main
import (
"fmt"
"math"
"regexp"
"sort"
"strings"
)
type queries struct {
Question string `json:"question"`
Answer string `json:"answer"`
}
func defineQuestionType(question string) string {
addre := regexp.MustCompile(`^\s*tambahkan\s+pertanyaan\s+(.+)\s+dengan\s+jawaban\s+(.+)$`)
delre := regexp.MustCompile(`^\s*hapus\s+pertanyaan\s+(.+)$`)
switch {
case addre.MatchString(question):
return "add"
case delre.MatchString(question):
return "del"
default:
return "question"
}
}
func addQuestionToDB(input string) string {
addre := regexp.MustCompile(`^\s*tambahkan\s+pertanyaan\s+(.+)\s+dengan\s+jawaban\s+(.+)$`)
res := addre.FindStringSubmatch(input)
var q queries
var temp queries
// check if question already exists
DB.Where("question = ?", res[1]).First(&temp)
if temp.Question == res[1] {
temp.Answer = res[2]
// save to db with where condition
DB.Model(&q).Where("question = ?", res[1]).Update("answer", res[2])
return "Pertanyaan sudah diupdate"
}
q.Question = res[1]
q.Answer = res[2]
DB.Create(&q)
return "Pertanyaan berhasil ditambahkan"
}
func delQuestion(input string) string {
delre := regexp.MustCompile(`^\s*hapus\s+pertanyaan\s+(.+)$`)
res := delre.FindStringSubmatch(input)
var q queries
DB.Where("question = ?", res[1]).Delete(&q)
return "Pertanyaan berhasil dihapus"
}
type queryResult struct {
Question string
Answer string
Dist int
}
func getAnswerKMP(input string) string {
var queryArr []queries
DB.Find(&queryArr)
var results []queryResult
minDist := math.MaxInt32
for _, query := range queryArr {
idx := KMP(query.Question, input)
if idx != -1 {
if query.Question == input {
return query.Answer
}
}
dist := levenshteinDistance(query.Question, input)
if dist < minDist {
minDist = dist
results = []queryResult{{Question: query.Question, Answer: query.Answer, Dist: dist}}
} else if dist == minDist {
results = append(results, queryResult{Question: query.Question, Answer: query.Answer, Dist: dist})
}
}
threshold := 0.1 * float64(len(input))
if float64(minDist) > threshold {
topResults := make([]string, 0, 3)
sort.Slice(results, func(i, j int) bool {
return results[i].Dist < results[j].Dist
})
for i := 0; i < len(results) && i < 3; i++ {
topResults = append(topResults, results[i].Question)
}
return fmt.Sprintf("Pertanyaan tidak ditemukan. Pertanyaan yang mirip: %s", strings.Join(topResults, ", "))
}
return results[0].Answer
}
func getAnswerBM(input string) string {
var queryArr []queries
DB.Find(&queryArr)
var results []queryResult
minDist := math.MaxInt32
for _, query := range queryArr {
idx := BM(query.Question, input)
if idx != -1 {
if query.Question == input {
return query.Answer
}
}
dist := levenshteinDistance(query.Question, input)
if dist < minDist {
minDist = dist
results = []queryResult{{Question: query.Question, Answer: query.Answer, Dist: dist}}
} else if dist == minDist {
results = append(results, queryResult{Question: query.Question, Answer: query.Answer, Dist: dist})
}
}
threshold := 0.1 * float64(len(input))
if float64(minDist) > threshold {
sort.Slice(results, func(i, j int) bool {
return results[i].Dist < results[j].Dist
})
return fmt.Sprintf("Pertanyaan tidak ditemukan. Pertanyaan yang mirip: %s, %s, %s", results[0].Question, results[1].Question, results[2].Question)
}
return results[0].Answer
}