Как проверить, содержит ли текст какие-либо слова из списка в Golang? - PullRequest
0 голосов
/ 30 января 2020

Я хотел бы проверить, есть ли спам-слова в тексте, отправленном пользователем. Итак, вот функция, которую я написал:

func TextHasSpamWords(text string, spamWords []string) bool {
    removePunctuation := func(r rune) rune {
        if strings.ContainsRune(".,:;", r) {
            return -1
        } else {
            return r
        }
    }
    text = strings.Map(removePunctuation, text)
    sort.Strings(spamWords)
    for _, word := range text {
        for _, sapmWord := range spamWords {
            if word == sapmWord {
                return true
            }
        }
    }
}

Но я получаю mismatched type rune and string при word == sapmWord. Я знаю, что это потому, что removePunctuation возвращает руны (он же int32), которые нельзя сравнить со строкой (unit8). Но удаление пунктуации необходимо для работы функции, поэтому мне интересно, как я могу это исправить? Или, может быть, есть более идиоматический c способ сделать это?

Ответы [ 2 ]

3 голосов
/ 30 января 2020

Рассмотрите возможность использования карты для поиска

lookupSpam := make(map[string]bool)
for _, v := range spamWords {
    lookupSpam[v] = true
}

Тогда вместо

for _, word := range textArr {
    for _, sapmWord := range spamWords {
        if word == sapmWord {
            return true
        }
    }
}

можно использовать что-то подобное

for _, word := range textArr {
    _,found:=lookupSpam[word]
    if found {
       return true
    }
}

Если вы неоднократно проверяя тот же набор слов, затем настройте карту один раз и снова используйте ее

1 голос
/ 30 января 2020

Вы пытаетесь сравнить букву со строкой.

Когда вы делаете for _, word := range text, это не слово, а letter. Если вы хотите слова, вы должны разбить строку на кусочек слова с помощью textArr := strings.Split(text, " ") (разделить пробелом)

func TextHasSpamWords(text string, spamWords []string) bool {
    removePunctuation := func(r rune) rune {
        if strings.ContainsRune(".,:;", r) {
            return -1
        } else {
            return r
        }
    }
    text = strings.Map(removePunctuation, text)
    textArr := strings.Split(text, ` `)
    sort.Strings(spamWords)
    for _, word := range textArr {
        for _, sapmWord := range spamWords {
            if word == sapmWord {
                return true
            }
        }
    }
    return false
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...