diff --git a/internal/parsers/clangtidy/parser.go b/internal/parsers/clangtidy/parser.go
index a763954..51661ed 100644
--- a/internal/parsers/clangtidy/parser.go
+++ b/internal/parsers/clangtidy/parser.go
@@ -9,8 +9,8 @@ import (
 )
 
 type Match struct {
-	Keyword []string
-	Score   int
+	Keywords []string
+	Score    int
 }
 
 type Conf struct {
@@ -41,9 +41,10 @@ func Parse(executorResult stage.ExecutorResult, conf Conf) stage.ParserResult {
 			}
 		}
 	}
+	score, comment := GetResult(formattedMessages, conf)
 	return stage.ParserResult{
-		Score:   GetScore(formattedMessages, conf),
-		Comment: GetComment(formattedMessages),
+		Score:   score,
+		Comment: comment,
 	}
 }
 
diff --git a/internal/parsers/clangtidy/score.go b/internal/parsers/clangtidy/score.go
index f6fa39e..f1027d5 100644
--- a/internal/parsers/clangtidy/score.go
+++ b/internal/parsers/clangtidy/score.go
@@ -5,32 +5,9 @@ import (
 	"strings"
 )
 
-func contains(arr []string, element string) bool {
-	for i := range arr {
-		// TODO: The keyword in json report might also be an array, need to split it
-		if strings.Contains(arr[i], element) {
-			return true
-		}
-	}
-	return false
-}
-
-func GetScore(jsonMessages []JsonMessage, conf Conf) int {
-	fullmark := conf.Score
-	for _, jsonMessage := range jsonMessages {
-		keyword := jsonMessage.CheckName
-		for _, match := range conf.Matches {
-			if contains(match.Keyword, keyword) {
-				fullmark -= match.Score
-				break
-			}
-		}
-	}
-	return fullmark
-}
-
-func GetComment(jsonMessages []JsonMessage) string {
-	res := "### Test results summary\n\n"
+func GetResult(jsonMessages []JsonMessage, conf Conf) (int, string) {
+	score := conf.Score
+	comment := "### Test results summary\n\n"
 	keys := [...]string{
 		"codequality-unchecked-malloc-result",
 		"codequality-no-global-variables",
@@ -56,22 +33,29 @@ func GetComment(jsonMessages []JsonMessage) string {
 		mapping[key] = 0
 	}
 	for _, jsonMessage := range jsonMessages {
-		keyword := jsonMessage.CheckName
-		flag := true
-		for key := range mapping {
-			if strings.Contains(keyword, key) {
-				mapping[key] += 1
-				flag = false
-				break
+		checkName := jsonMessage.CheckName
+		for _, match := range conf.Matches {
+			for _, keyword := range match.Keywords {
+				// TODO: The keyword in json report might also be an array, need to split it
+				if strings.Contains(checkName, keyword) {
+					score -= match.Score
+				}
 			}
 		}
-		if flag {
+		listed := false
+		for key := range mapping {
+			if strings.Contains(checkName, key) {
+				mapping[key] += 1
+				listed = true
+			}
+		}
+		if !listed {
 			mapping["others"] += 1
 		}
 	}
 
 	for i, key := range keys {
-		res = fmt.Sprintf("%s%d. %s: %d\n", res, i+1, key, mapping[key])
+		comment = fmt.Sprintf("%s%d. %s: %d\n", comment, i+1, key, mapping[key])
 	}
-	return res
+	return score, comment
 }