Как найти категорию слов в строке и взять их в Ruby? - PullRequest
0 голосов
/ 21 декабря 2018

Учитывая предложение, я хочу подсчитать общее количество раз, когда категория существительных (люди против животных) присутствует.Это не то же самое, что узнать, сколько раз встречается каждое из этих слов.Я также не ищу общее число раз, которое каждое обозначенное слово встречается, а скорее подсчет общего числа встреч всех обозначенных слов в массиве.В то время как продвинутые методы приветствуются, поиск продолжается для более простого кодирования более начального уровня;одно линейное кодирование может быть замечательным и искренне ценным, но я хочу иметь понимание как новичок.

В предложении «Джон и Мария любят лошадей, уток и собак».Я хочу подсчитать количество животных (3).

str = "John and Mary like horses, ducks, and dogs."

animals= ["horses", "ducks", "dogs"]

def count_a(string)
  animals = 0
  i = 0
  while i < string.length  
    if (string[i]=="horses" || string[i]=="ducks" || 
      string[i]=="dogs")
      animals +=1
    end

    i +=1
  end
end
puts count_a(str)

Ожидается: 3 Фактически: ничего не отображается взамен

Ответы [ 3 ]

0 голосов
/ 21 декабря 2018
> str.scan(Regexp.union(animals)).size
# => 3

Измените регулярное выражение на

Regexp.new(animals.join("|"), true)

для нечувствительного к регистру совпадения.

0 голосов
/ 21 декабря 2018

Сохраняя свою логику, исправьте это так (см. Встроенные комментарии):

def count_a(string)
  string = string.scan(/\w+/).map(&:downcase) # <------------ split into words
  animals = 0
  i = 0
  while i < string.length
    if (string[i]=="horses" || string[i]=="ducks" || 
      string[i]=="dogs")
      animals +=1
    end
    i +=1
  end
  return animals # <------------ return the count
end

puts count_a(str) #=> 3
0 голосов
/ 21 декабря 2018

Ваш код работает по одной букве за раз:

"abcd"[0]
=> "a"

Тогда ваше условие сравнивает эту букву со словом:

"abcd"[0] == "duck"
# which is the same as:
"a" == "duck"
# which will never be true

Вы можете разбить строку на массив слови используйте Array#count и Array#include? для подсчета вхождений:

ANIMALS = ["horses", "ducks", "dogs"]

def count_a(string)
  string.split(/\b/).count { |word| ANIMALS.include?(word) }
end

puts count_a("John and Mary like horses, ducks, and dogs.")

Для поиска совпадений внутри слов, например, «бульдог», считая собаку, вы можете использовать:

def count_a(string)
  ANIMALS.inject(0) { |count, animal| count + string.scan(animal).size }
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...