这个Ruby应用程序如何知道选择句子的中间三分之一?

时间:2011-08-01 17:51:29

标签: ruby slice

我目前正在关注Peter Cooper的Beginning Ruby,并将我的第一个应用程序 - 文本分析器放在一起。然而,虽然我理解了所有的概念和它们的工作方式,但我不能理解应用程序如何知道选择从这一行按长度排序的句子的中间三分之一:

ideal_sentances = sentences_sorted.slice(one_third, one_third + 1)

我已将整个应用程序包含在上下文中,所有帮助都非常受欢迎,因为到目前为止一切都很有意义。

#analyzer.rb --Text Analyzer

stopwords = %w{the a by on for of are with just but and to the my I has some in do}
lines = File.readlines(ARGV[0]) 
line_count = lines.size 
text = lines.join 

#Count the characters
character_count = text.length 
character_count_nospaces = text.gsub(/\s+/, '').length

#Count the words, sentances, and paragraphs
word_count = text.split.length 
paragraph_count = text.split(/\n\n/).length 
sentence_count = text.split(/\.|\?|!/).length

#Make a list of words in the text that aren't stop words,
#count them, and work out the percentage of non-stop words
#against all words
all_words = text.scan(/\w+/)
good_words = all_words.select {|word| !stopwords.include?(word)}
good_percentage = ((good_words.length.to_f / all_words.length.to_f)*100).to_i

#Summarize the text by cherry picking some choice sentances
sentances = text.gsub(/\s+/, ' ').strip.split(/\.|\?|!/)
sentances_sorted = sentences.sort_by { |sentence| sentance.length }
one_third = sentences_sorted.length / 3
ideal_sentances = sentences_sorted.slice(one_third, one_third + 1)
ideal_sentances = ideal_sentences.select{ |sentence| sentence =~ /is|are/ }

#Give analysis back to user

puts "#{line_count} lines" 
puts "#{character_count} characters" 
puts "#{character_count_nospaces} characters excluding spaces" 
puts "#{word_count} words" 
puts "#{paragraph_count} paragraphs" 
puts "#{sentence_count} sentences" 
puts "#{sentence_count / paragraph_count} sentences per paragraph (average)" 
puts "#{word_count / sentence_count} words per sentence (average)"
puts "#{good_percentage}% of words are non-fluff words"
puts "Summary:\n\n" + ideal_sentences.join(". ")
puts "-- End of analysis."

显然我是初学者,所以简单的英语会非常有帮助,欢呼。

4 个答案:

答案 0 :(得分:3)

它使用one_third = sentences_sorted.length / 3获得句子长度的三分之一,然后您发布的行ideal_sentances = sentences_sorted.slice(one_third, one_third + 1)说“从索引开始的所有句子中获取一片等于1/3并继续1 / 1/3长度+1“。

有意义吗?

答案 1 :(得分:2)

你在ruby API中查找的切片方法说:

  

如果传递了两个Fixnum对象,则返回一个以字符串开头的子字符串   第一个给出的偏移量,第二个给出的长度。

这意味着,如果你有一个分为三个部分的句子

 ONE | TWO | THREE

slice(1/3, 1/3+1)

将从头开始以1/3开始返回字符串

 | TWO | THREE (this is what you are looking at now)

然后你返回距你所在位置1/3 + 1距离的字符串,这就是

 | TWO |

答案 2 :(得分:1)

sentences是所有句子的列表。 sentances_sorted是按句子长度排序的列表,因此中间三分之一将是具有最大平均长度的句子。 slice()抓住列表的中间三分之一,从one_third所代表的位置开始,并从该点开始计算one_third + 1

请注意,正确拼写是“句子”而不是“发送”。我之所以提到这一点,只是因为你有一些代码错误,这些错误是由于拼写不一致造成的。

答案 3 :(得分:0)

当我第一次开始时,我被困在这上面了。用简单的英语,你必须意识到切片方法可以在这里采用2个参数。

第一个是索引。第二个是切片的长度。

所以我们假设你从6个句子开始。 one_third = 2 切片(one_third,one_third + 1)

6的1/3是2。

1)这里1/3意味着你从元素2开始,它是索引[1] 2)然后继续2(6/3)多+ 1长度,所以总共3个空格

所以它影响索引1到索引3