2015-09-08 4 views
2

Мне довелось обыскать везде и не удалось найти решение для подсчета числа предложений в строке с использованием Ruby. Кто-нибудь, как это сделать?Count Number of Sentence Ruby

Пример

string = "The best things in an artist’s work are so much a matter of intuition, that there is much to be said for the point of view that would altogether discourage intellectual inquiry into artistic phenomena on the part of the artist. Intuitions are shy things and apt to disappear if looked into too closely. And there is undoubtedly a danger that too much knowledge and training may supplant the natural intuitive feeling of a student, leaving only a cold knowledge of the means of expression in its place. For the artist, if he has the right stuff in him ... " 

Эта строка должна возвращать число 4.

+0

http://stackoverflow.com/a/18089658/517483 может помочь. –

+1

Как вы определяете «предложение»? – Stefan

ответ

4

Вы можете разделить текст на предложения и посчитать их. Здесь:

string.scan(/[^\.!?]+[\.!?]/).map(&:strip).count # scan has regex to split string and strip will remove trailing spaces. 
# => 4 

Объясняя регулярное выражение:

[^\.!?] 

Caret внутри символьного класса [^ ] является оператором отрицания. Это означает, что мы ищем символы, которых нет в списке: ., ! и ?.

+ 

- жадный оператор, который возвращает совпадения между 1 и неограниченным временем. (захватывая наши предложения здесь и не обращая внимания повторы, как ...)

[\.!?] 

соответствующие символы ., ! или ?.

В двух словах, мы захватывая все символы, которые не являются ., ! или ? пока мы не получим символы, которые ., ! или ?. Который в основном можно рассматривать как предложение (в широких смыслах).

+2

Чтобы подсчитать элементы в массиве, вам действительно не нужно '.map (&: strip)' здесь :) –

+0

Не могли бы вы объяснить свое регулярное выражение? Возможно, это не очевидно, что он делает. – Stefan

+0

@Stefan сделано. спасибо :) – shivam

3

Я думаю, что имеет смысл рассматривать слово символ, за которым следует ?! или . Разделителем приговора:

string.strip.split(/\w[?!.]/).length 
#=> 4 

Так что я не рассматривает ... разделитель, когда он висит на своем собственном, как что:

  • "Я подождал некоторое время ... а потом я пошел домой"

Но, опять же, может быть, я должен ...

Это также происходит для меня, что может быть лучше разделитель пунктуации следуют некоторые пространства и буквы:

string.split(/[?!.]\s+[A-Z]/).length 
#=> 4 
+0

Что, если был мистер Юл, которому что-то нужно? – Yule

+0

Вы могли бы объяснить это с помощью поиска. Я оставлю это как упражнение для кого-то еще. – pguardiario

1

Приговоры заканчиваются полной остановки, вопросительные знаки и восклицательные знаки. Они также могут быть , отделенные черточками и другими пунктуациями, но здесь мы не будем беспокоиться об этих редких случаях. Сплит прост.Вместо того, чтобы просить рубин, чтобы разделить текст на один тип персонажа, вы просто попросить его разделить на любом из трех типов символов, например, так:

txt = "The best things in an artist’s work are so much a matter of intuition, that there is much to be said for the point of view that would altogether discourage intellectual inquiry into artistic phenomena on the part of the artist. Intuitions are shy things and apt to disappear if looked into too closely. And there is undoubtedly a danger that too much knowledge and training may supplant the natural intuitive feeling of a student, leaving only a cold knowledge of the means of expression in its place. For the artist, if he has the right stuff in him ... " 

sentence_count = txt.split(/\.|\?|!/).length 
puts sentence_count 
#=> 7 
+0

Ваш код возвращает '7', а не' 4' – Stefan

+0

, он производит некоторые дополнительные пустые строки, счет 7 для меня. –

+0

Это из-за 3 полных остановок в конце. – Mourad

0
string.squeeze('.!?').count('.!?') 
    #=> 4