Какой самый быстрый способ проверить, что поле содержит не более n слов? - PullRequest
0 голосов
/ 04 мая 2010

У меня есть модель Ruby-on-Rails:

class Candidate < ActiveRecord::Base
  validates_presence_of :application_essay
  validate :validate_length_of_application_essay

  protected

  def validate_length_of_application_essay
    return if application_essay.blank? # don't add a second error message if they didn't fill it out
    errors.add(:application_essay, :too_long), unless ...
  end
end

Не заглядывая в C, какой самый быстрый способ проверить, что application_essay содержит не более 500 слов? Вы можете предположить, что большинство эссе будет состоять как минимум из 200 слов, вряд ли будет более 5000 слов и написано на английском языке (или псевдоанглийский, иногда называемый "business-ese") Вы также можете классифицировать все, что вы хотите, как «слово», если ваша классификация будет сразу очевидна для обычного пользователя. (NB: это не место для обсуждения того, что такое «типичный пользователь» :))

Ответы [ 6 ]

7 голосов
/ 30 декабря 2010

В Rails3 тоже работает :tokenizer с lambda.

validates_length_of :essay, :minimum => 100, :too_short => "Your essay must be at least 100 words."), :tokenizer => lambda {|str| str.scan(/\w+/) }

Это может быть не самый быстрый, но, безусловно, самый чистый способ.

2 голосов
/ 04 мая 2010

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

1 голос
/ 04 мая 2010

Для этого есть плагин, я сам его не использовал:)

http://code.google.com/p/validates-word-count/

Этот плагин переключает все смежные "символы слова" в один символ, затем удаляет все несловарные символы и считает их Не уверен, что он самый быстрый.

1 голос
/ 04 мая 2010

Я бы просто использовал что-то вроде:

string.split(" ").length <= 500

Какую проблему с производительностью вы видите? Строка из 500 слов или около того не должна быть большой проблемой.

1 голос
/ 04 мая 2010

Вы можете оценить типичный размер слова и угадать количество слов путем деления.

некоторые подсказки здесь: http://blogamundo.net/lab/wordlengths/

Вы можете попробовать как 5.1 и посмотреть, насколько вы точныс помощью нескольких тестов.

Возможно, разделив на 6,1, поскольку у вас есть пробелы.

Имейте в виду, что вы предполагаете, что ваш текст - это не просто огромное количество пробелов или что-то еще.Хорошо, но если вам действительно просто интересно убедиться, что в нем не более x слов.Вы можете попробовать меньшее число на x, может быть 5, и если оно содержит менее x x 5 символов, вы можете быть уверены, что в нем не более x слов.

Так что, возможно, вам лучше выполнить линейный поиск, как указано в других ответах.Линейный поиск не так уж и плох.Это зависит только от того, что вы хотите сделать.

0 голосов
/ 04 мая 2010

Вот хорошая статья, которая вам может понравиться

http://dotnetperls.com/word-count

...