优化相似度流程
This commit is contained in:
@@ -0,0 +1,76 @@
|
||||
package main
|
||||
|
||||
// 是否有符合要求的log
|
||||
func calculateSimilaritys(n int, log1 string, logs ...string) bool {
|
||||
for _, log := range logs {
|
||||
similarity := calculateSimilarity(log1, log)
|
||||
if similarity <= n {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// 放回不相同数量
|
||||
func calculateSimilarity(log1, log2 string) int {
|
||||
l1 := parseErlangString(log1)
|
||||
l2 := parseErlangString(log2)
|
||||
s, l := calcSimilar(l1, l2)
|
||||
return l - s
|
||||
}
|
||||
|
||||
// 计算相似度
|
||||
func calcSimilar(log1 []string, log2 []string) (int, int) {
|
||||
//忽略
|
||||
const ignore = 4
|
||||
langer := max(len(log1), len(log2))
|
||||
later := min(len(log1), len(log2))
|
||||
sim := 0
|
||||
for i := ignore; i < later; i++ {
|
||||
if log1[i] == log2[i] {
|
||||
sim++
|
||||
} else if len(log1[i]) == len(log2[i]) {
|
||||
var iSim = 0
|
||||
for j := 0; j < len(log1[i]); j++ {
|
||||
if log1[i][j] == log2[i][j] {
|
||||
iSim++
|
||||
}
|
||||
}
|
||||
if float64(iSim)/float64(len(log1[i])) > 0.95 {
|
||||
sim++
|
||||
}
|
||||
}
|
||||
}
|
||||
return sim, langer - 4
|
||||
}
|
||||
|
||||
func parseErlangString(logStr string) []string {
|
||||
var (
|
||||
head = 0
|
||||
i []int32
|
||||
r []string
|
||||
)
|
||||
for _, v := range logStr {
|
||||
switch v {
|
||||
case ' ':
|
||||
case '{':
|
||||
head++
|
||||
if head != 1 {
|
||||
i = append(i, v)
|
||||
}
|
||||
case '}':
|
||||
if head != 1 {
|
||||
i = append(i, v)
|
||||
}
|
||||
head--
|
||||
default:
|
||||
if v == ',' && len(i) != 0 && head == 1 {
|
||||
r = append(r, string(i))
|
||||
i = nil
|
||||
} else {
|
||||
i = append(i, v)
|
||||
}
|
||||
}
|
||||
}
|
||||
return append(r, string(i))
|
||||
}
|
||||
Reference in New Issue
Block a user