Массив Rails ВКЛЮЧАЕТ только отдельные слова - PullRequest
0 голосов
/ 11 июля 2019

Я строю функцию поиска ненормативной лексики, которая должна находить экземпляры массива ненормативных слов в длинной строке текста.

Можно сделать простой include, например:

if profane_words.any? {|word| self.name.downcase.include? word}
  ...
end

Это приводит к положительному совпадению, если в тексте присутствует ЛЮБОЙ массив ненормативных слов.

Однако , если такое слово, как «ад», считается профанным, это приведет к положительному совпадению с «Ангелами ада» или «Кухней ада», что нежелательно.

Как можно изменить приведенный выше поиск, чтобы получить только положительные результаты против отдельных слов или фраз ? Например, «Ангелы ада» возвращают положительное значение, а «Ангелы ада» возвращают отрицательное значение.

Чтобы было ясно, это означает, что мы ищем любой случай ненормативного слова, которому непосредственно предшествует или следует другой символ или апостроф.

Ответы [ 3 ]

0 голосов
/ 11 июля 2019

Как насчет использования регулярных выражений?

profane_words.any? { |word| self.name.downcase.match? /#{word}(?!')/ }

Примеры:

"hell's angels".match?(/hell(?!')/) # => false
"hell angel".match?(/hell(?!')/) # => true

(?!') - это отрицательный иск, означающий, что он не будет совпадать, если слово имеет 'сразу после этого.Если вы хотите исключить другие символы, вы можете добавить их в список с помощью каналов, например, (?!'|") не будет соответствовать ' и ".

См. https://www.regular -expressions.info / lookaround.html для справки.

И вы можете сделать его более производительным, например:

self.name.downcase.match? /#{profane_words.join('|')}(?!')/
0 голосов
/ 11 июля 2019

Вы обязательно должны использовать регулярное выражение, содержащее все ваши светские слова, за которыми следует пробел или точка.Сильфон лет

 > "Hell's angels".match(/(hell|shit)[ .]/i)
 => nil

> "Hell angels".match(/(hell|shit)[ .]/i)
 => #<MatchData "Hell " 1:"Hell"> 

> "Hell's angels shit".match(/(hell|shit)[ .]/i)
 => nil 
0 голосов
/ 11 июля 2019
if profane_words.any? {|word| self.name.downcase.split(' ').include? word} ... end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...