2015-03-18 6 views
2

У меня есть задача найти слова, которые есть в каждом предложении.Найти общие слова в предложениях с Ruby

Учитывая строку, и мы хотим разделить строку на предложения, а затем определить, какие слова, если таковые имеются, во всех предложениях.

Вот мое решение:

# encoding: utf-8 
text = '' 
File.foreach("lab2.in") do |line| 
    text += line 
end 
hash = Hash.new 
text = text.gsub(/[\n,]/,'').split(/[!.?]/) 
number = 0 
text.each do |sen| 
     number += 1 
     words = sen.split(/ /) 
     words.each do |word| 
       if hash[word] 
         hash[word] += "#{number}" 
       else 
         hash[word] = "#{number}" 
       end 
     end 
end 
flag = false 
needle = '' 
count = text.length 
for i in 1..count 
     needle += "#{i}" 
end 
hash.each do |word| 
     if word[1].squeeze == needle 
       puts "this word is \"#{word[0]}\"" 
       flag = true 
     end 
end 
if !flag 
     puts "There no such word" 
end 

Как эта задача может быть решена, возможно, более очаровательно? Меня интересуют методы библиотеки Ruby. Простое решение, такое как характерный характер, я уже знаю.

Например, вход как:

lorem ipsum dolor and another lorem! sit amet lorem? and another lorem. 

Выход будет:

this word is "lorem" 
+1

Что ожидается вход и выход? – infused

+0

Например, ввод: lorem ipsum lorem dolor sit amet. a tot toje est lorem! i tuta toje lorem? – skad0

+0

И выход будет этим словом «lorem» – skad0

ответ

5

Вы можете сделать это (я изменил ваш пример немного):

str = "a lorem ipsum lorem dolor sit amet. a tut toje est lorem! a i tuta toje lorem?" 

str.split(/[.!?]/).map(&:split).reduce(:&) 
    #=> ["a", "lorem"] 

Мы имеют:

d = str.split(/[.!?]/) 
    #=> ["a lorem ipsum lorem dolor sit amet", 
    # " a tut toje est lorem", 
    # " a i tuta toje lorem"] 
e = d.map(&:split) 
    #=> [["a", "lorem", "ipsum", "lorem", "dolor", "sit", "amet"], 
    # ["a", "tut", "toje", "est", "lorem"], 
    # ["a", "i", "tuta", "toje", "lorem"]] 
e.reduce(:&) 
    #=> ["a", "lorem"] 

Чтобы сделать его нечувствительным к регистру, измените значение str.split... на str.downcase.split....

+0

Это замечательно, спасибо. Но можете ли вы объяснить, что означает &: split? – skad0

+1

'd.map (&: split)' дает тот же результат, что и 'd.map {| a | s.split} '; он преобразует каждую строку 's' в' d' в массив слов, содержащийся в 's'. Если эти массивы (в 'e') являются' a1', 'a2' и' a3', 'e.reduce {| a, b | b & a} 'эквивалентно' a1 & a2 & a3'. –

+0

Спасибо вам большое! – skad0

Смежные вопросы