Как выделить первые 280 слов текста до ближайшего периода? - PullRequest
0 голосов
/ 19 сентября 2018

Мне нужно извлечь более короткий фрагмент текста из указанного количества слов из более длинного.Я могу сделать это, используя

text = "There was a very big cat that was sitting on the ledge. It was  overlooking the garden. The dog next door watched with curiosity."

    text.split[0..15].join(' ')
    >>""There was a very big cat that was sitting on the ledge. It was  overlooking"

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

Есть ли способ, возможно, с использованиемли Regex, чтобы выполнить то, что я пытаюсь сделать, сможет получить текст до и включая ближайший следующий период после 15-го слова?

Ответы [ 3 ]

0 голосов
/ 19 сентября 2018
r = /
    (?:           # begin a non-capture group
      \p{Alpha}+  # match one or more letters
      [.!?]?      # optionally ('?' following ']') match one of the 3 punctuation chars
      [ ]+        # match one or more spaces
    )             # end non-capture group
    {14,}?        # execute the preceding non-capture group at least 14 times, lazily ('?')
    \p{Alpha}+    # match one or more letters  
    [.!?]         # match one of the three punctuation characters
    /x            # free-spacing regex definition mode

text[r]
  #=> "There was a very big cat that was sitting on the ledge. It was overlooking 
  #    the garden.

Режим свободного пробела удаляет пробелы, поэтому указанный выше пробел находится в классе символов ([ ]+).Условно написанное регулярное выражение выглядит следующим образом.

/(?:\p{Alpha}+[.!?]? +){14,}?\p{Alpha}+[.!?]/
0 голосов
/ 19 сентября 2018

Вы можете сделать что-то вроде этих строк:

text = "There was a very big cat that was sitting on the ledge. It was  overlooking the garden. The dog next door watched with curiosity."

tgt=15
old_text=text.scan(/[^.]+\.\s?/)
new_text=[]
while (old_text && new_text.join.scan(/\b\p{Alpha}+\b/).length<=tgt) do
   new_text << old_text.shift
end   

p new_text.join

Отпечатки:

"There was a very big cat that was sitting on the ledge. It was  overlooking the garden. "

Это работает с любой длиной нормальных предложений и прервется, как только 1 дополнительное предложение превыситслово цель.

0 голосов
/ 19 сентября 2018

Вы можете использовать

(?:\w+[,.?!]?\s+){14}(?:\w+,?\s+)*?\w+[.?!]

Повторяет слово, необязательный [запятая / точка / вопросительный знак / восклицательный знак] и пробелы 14 раз.Затем он лениво повторяет слово, за которым следуют пробел, за которым следуют другое слово и точка, гарантируя, что шаблон заканчивается в первом периоде после 15 слов от начала.

https://regex101.com/r/ardIQ7/4

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...